| Index: src/core/SkSmallAllocator.h
|
| diff --git a/src/core/SkSmallAllocator.h b/src/core/SkSmallAllocator.h
|
| index c7977d36a533d4470210decba6498c7056b43096..79b1d299bce8faac5533a5851a7290205d82b9ff 100644
|
| --- a/src/core/SkSmallAllocator.h
|
| +++ b/src/core/SkSmallAllocator.h
|
| @@ -11,11 +11,7 @@
|
| #include "SkTDArray.h"
|
| #include "SkTypes.h"
|
|
|
| -// Used by SkSmallAllocator to call the destructor for objects it has
|
| -// allocated.
|
| -template<typename T> void destroyT(void* ptr) {
|
| - static_cast<T*>(ptr)->~T();
|
| -}
|
| +#include <new>
|
|
|
| /*
|
| * Template class for allocating small objects without additional heap memory
|
| @@ -52,58 +48,16 @@ public:
|
| /*
|
| * Create a new object of type T. Its lifetime will be handled by this
|
| * SkSmallAllocator.
|
| - * Each version behaves the same but takes a different number of
|
| - * arguments.
|
| * Note: If kMaxObjects have been created by this SkSmallAllocator, nullptr
|
| * will be returned.
|
| */
|
| - template<typename T>
|
| - T* createT() {
|
| - void* buf = this->reserveT<T>();
|
| - if (nullptr == buf) {
|
| - return nullptr;
|
| - }
|
| - new (buf) T;
|
| - return static_cast<T*>(buf);
|
| - }
|
| -
|
| - template<typename T, typename A1> T* createT(const A1& a1) {
|
| - void* buf = this->reserveT<T>();
|
| - if (nullptr == buf) {
|
| - return nullptr;
|
| - }
|
| - new (buf) T(a1);
|
| - return static_cast<T*>(buf);
|
| - }
|
| -
|
| - template<typename T, typename A1, typename A2>
|
| - T* createT(const A1& a1, const A2& a2) {
|
| - void* buf = this->reserveT<T>();
|
| - if (nullptr == buf) {
|
| - return nullptr;
|
| - }
|
| - new (buf) T(a1, a2);
|
| - return static_cast<T*>(buf);
|
| - }
|
| -
|
| - template<typename T, typename A1, typename A2, typename A3>
|
| - T* createT(const A1& a1, const A2& a2, const A3& a3) {
|
| - void* buf = this->reserveT<T>();
|
| - if (nullptr == buf) {
|
| - return nullptr;
|
| - }
|
| - new (buf) T(a1, a2, a3);
|
| - return static_cast<T*>(buf);
|
| - }
|
| -
|
| - template<typename T, typename A1, typename A2, typename A3, typename A4>
|
| - T* createT(const A1& a1, const A2& a2, const A3& a3, const A4& a4) {
|
| + template<typename T, typename... Args>
|
| + T* createT(const Args&... args) {
|
| void* buf = this->reserveT<T>();
|
| if (nullptr == buf) {
|
| return nullptr;
|
| }
|
| - new (buf) T(a1, a2, a3, a4);
|
| - return static_cast<T*>(buf);
|
| + return new (buf) T(args...);
|
| }
|
|
|
| /*
|
| @@ -138,7 +92,7 @@ public:
|
| rec->fObj = static_cast<void*>(fStorage + (fStorageUsed / 4));
|
| fStorageUsed += storageRequired;
|
| }
|
| - rec->fKillProc = destroyT<T>;
|
| + rec->fKillProc = DestroyT<T>;
|
| fNumObjects++;
|
| return rec->fObj;
|
| }
|
| @@ -165,6 +119,12 @@ private:
|
| void (*fKillProc)(void*);
|
| };
|
|
|
| + // Used to call the destructor for allocated objects.
|
| + template<typename T>
|
| + static void DestroyT(void* ptr) {
|
| + static_cast<T*>(ptr)->~T();
|
| + }
|
| +
|
| // Number of bytes used so far.
|
| size_t fStorageUsed;
|
| // Pad the storage size to be 4-byte aligned.
|
|
|