Index: include/core/SkTLazy.h |
=================================================================== |
--- include/core/SkTLazy.h (revision 8241) |
+++ include/core/SkTLazy.h (working copy) |
@@ -14,6 +14,9 @@ |
#include "SkTypes.h" |
#include <new> |
+template <typename T> class SkTLazy; |
+template <typename T> void* operator new(size_t, SkTLazy<T>* lazy); |
+ |
/** |
* Efficient way to defer allocating/initializing a class until it is needed |
* (if ever). |
@@ -44,7 +47,7 @@ |
/** |
* Return a pointer to a default-initialized instance of the class. If a |
- * previous instance had been initialzied (either from init() or set()) it |
+ * previous instance had been initialized (either from init() or set()) it |
* will first be destroyed, so that a freshly initialized instance is |
* always returned. |
*/ |
@@ -84,10 +87,27 @@ |
T* get() const { SkASSERT(this->isValid()); return fPtr; } |
private: |
+ friend void* operator new<T>(size_t, SkTLazy* lazy); |
+ |
T* fPtr; // NULL or fStorage |
char fStorage[sizeof(T)]; |
}; |
+// Use the below macro (SkNEW_IN_TLAZY) rather than calling this directly |
+template <typename T> void* operator new(size_t, SkTLazy<T>* lazy) { |
+ SkASSERT(!lazy->isValid()); |
+ lazy->fPtr = reinterpret_cast<T*>(lazy->fStorage); |
+ return lazy->fPtr; |
+} |
+ |
+// Skia doesn't use C++ exceptions but it may be compiled with them enabled. Having an op delete |
+// to match the op new silences warnings about missing op delete when a constructor throws an |
+// exception. |
+template <typename T> void operator delete(void*, SkTLazy<T>) { SK_CRASH(); } |
+ |
+// Use this to construct a T inside an SkTLazy using a non-default constructor. |
+#define SkNEW_IN_TLAZY(tlazy_ptr, type_name, args) (new (tlazy_ptr) type_name args) |
+ |
/** |
* A helper built on top of SkTLazy to do copy-on-first-write. The object is initialized |
* with a const pointer but provides a non-const pointer accessor. The first time the |