diff options
author | bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-03-20 19:19:53 +0000 |
---|---|---|
committer | bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-03-20 19:19:53 +0000 |
commit | c78188896e28a4ae49e406a7422b345ae177dafe (patch) | |
tree | 8345c0828c94fc81cd4c54a0fe7778e5b159394d /include/core/SkTLazy.h | |
parent | b8210f20ce3da43f55b773a2fad3f2244d3ba74d (diff) |
Attempt to reland 8264-5 with warning-as-error fixes.
git-svn-id: http://skia.googlecode.com/svn/trunk@8272 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'include/core/SkTLazy.h')
-rw-r--r-- | include/core/SkTLazy.h | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/include/core/SkTLazy.h b/include/core/SkTLazy.h index b9052f0d99..1934b5dff9 100644 --- a/include/core/SkTLazy.h +++ b/include/core/SkTLazy.h @@ -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 @@ public: /** * 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 @@ public: 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 |