Chromium Code Reviews| Index: include/core/SkTLazy.h |
| =================================================================== |
| --- include/core/SkTLazy.h (revision 8216) |
| +++ 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)]; |
| }; |
|
robertphillips
2013/03/19 15:09:38
.. macro (SkNEW_IN_TLAZY) rather ...
bsalomon
2013/03/19 19:34:43
Done.
|
| +// Use the below macros 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 |