aboutsummaryrefslogtreecommitdiffhomepage
path: root/include/core/SkTLazy.h
diff options
context:
space:
mode:
authorGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-04-06 20:17:29 +0000
committerGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-04-06 20:17:29 +0000
commita076e9be17654a60310e72c4f70fcd5337f56dbf (patch)
tree1d8f2715b88ad86639b25a14958e07f6b62e8028 /include/core/SkTLazy.h
parentdc66c42d7d48d76db7b54f3c864e74637777a176 (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.h77
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
+