diff options
author | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-04-06 20:17:29 +0000 |
---|---|---|
committer | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-04-06 20:17:29 +0000 |
commit | a076e9be17654a60310e72c4f70fcd5337f56dbf (patch) | |
tree | 1d8f2715b88ad86639b25a14958e07f6b62e8028 /include/core/SkTLazy.h | |
parent | dc66c42d7d48d76db7b54f3c864e74637777a176 (diff) |
use new template class SkTLazy for deferred paint initialization
git-svn-id: http://skia.googlecode.com/svn/trunk@1070 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'include/core/SkTLazy.h')
-rw-r--r-- | include/core/SkTLazy.h | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/include/core/SkTLazy.h b/include/core/SkTLazy.h new file mode 100644 index 0000000000..94e64150e1 --- /dev/null +++ b/include/core/SkTLazy.h @@ -0,0 +1,77 @@ +/* + Copyright 2011 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + +#ifndef SkTLazy_DEFINED +#define SkTLazy_DEFINED + +#include "SkTypes.h" + +/** + * Efficient way to defer allocating/initializing a class until it is needed + * (if ever). + */ +template <typename T> class SkTLazy { +public: + SkTLazy() : fPtr(NULL) {} + + explicit SkTLazy(const T* src) : fPtr(NULL) { + if (src) { + fPtr = new (fStorage) T(*src); + } + } + + SkTLazy(const SkTLazy<T>& src) : fPtr(NULL) { + const T* ptr = src.get(); + if (ptr) { + fPtr = new (fStorage) T(*ptr); + } + } + + ~SkTLazy() { + if (fPtr) { + fPtr->~T(); + } + } + + /** + * Copy src into this, and return a pointer to a copy of it. Note this + * will always return the same pointer, so if it is called on a lazy that + * has already been initialized, then this will copy over the previous + * contents. + */ + T* set(const T& src) { + if (fPtr) { + *fPtr = src; + } else { + fPtr = new (fStorage) T(src); + } + return fPtr; + } + + /** + * Returns either NULL, or a copy of the object that was passed to + * set() or the constructor. + */ + T* get() const { return fPtr; } + +private: + T* fPtr; // NULL or fStorage + char fStorage[sizeof(T)]; +}; + +#endif + |