| Index: src/core/SkSmallAllocator.h
|
| diff --git a/src/core/SkSmallAllocator.h b/src/core/SkSmallAllocator.h
|
| deleted file mode 100644
|
| index d5ebf3b7d462457f8de1e771786007222ea7aa21..0000000000000000000000000000000000000000
|
| --- a/src/core/SkSmallAllocator.h
|
| +++ /dev/null
|
| @@ -1,148 +0,0 @@
|
| -/*
|
| - * Copyright 2014 Google, Inc
|
| - *
|
| - * Use of this source code is governed by a BSD-style license that can be
|
| - * found in the LICENSE file.
|
| - */
|
| -
|
| -#ifndef SkSmallAllocator_DEFINED
|
| -#define SkSmallAllocator_DEFINED
|
| -
|
| -#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();
|
| -}
|
| -
|
| -/*
|
| - * Template class for allocating small objects without additional heap memory
|
| - * allocations. kMaxObjects is a hard limit on the number of objects that can
|
| - * be allocated using this class. After that, attempts to create more objects
|
| - * with this class will assert and return NULL.
|
| - * kTotalBytes is the total number of bytes provided for storage for all
|
| - * objects created by this allocator. If an object to be created is larger
|
| - * than the storage (minus storage already used), it will be allocated on the
|
| - * heap. This class's destructor will handle calling the destructor for each
|
| - * object it allocated and freeing its memory.
|
| - */
|
| -template<uint32_t kMaxObjects, size_t kTotalBytes>
|
| -class SkSmallAllocator : public SkNoncopyable {
|
| -public:
|
| - SkSmallAllocator()
|
| - : fStorageUsed(0)
|
| - , fNumObjects(0)
|
| - {}
|
| -
|
| - ~SkSmallAllocator() {
|
| - // Destruct in reverse order, in case an earlier object points to a
|
| - // later object.
|
| - while (fNumObjects > 0) {
|
| - fNumObjects--;
|
| - Rec* rec = &fRecs[fNumObjects];
|
| - rec->fKillProc(rec->fObj);
|
| - // Safe to do if fObj is in fStorage, since fHeapStorage will
|
| - // point to NULL.
|
| - sk_free(rec->fHeapStorage);
|
| - }
|
| - }
|
| -
|
| - /*
|
| - * 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, NULL
|
| - * will be returned.
|
| - */
|
| - template<typename T>
|
| - T* createT() {
|
| - void* buf = this->reserveT<T>();
|
| - if (NULL == buf) {
|
| - return NULL;
|
| - }
|
| - SkNEW_PLACEMENT(buf, T);
|
| - return static_cast<T*>(buf);
|
| - }
|
| -
|
| - template<typename T, typename A1> T* createT(const A1& a1) {
|
| - void* buf = this->reserveT<T>();
|
| - if (NULL == buf) {
|
| - return NULL;
|
| - }
|
| - SkNEW_PLACEMENT_ARGS(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 (NULL == buf) {
|
| - return NULL;
|
| - }
|
| - SkNEW_PLACEMENT_ARGS(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 (NULL == buf) {
|
| - return NULL;
|
| - }
|
| - SkNEW_PLACEMENT_ARGS(buf, T, (a1, a2, a3));
|
| - return static_cast<T*>(buf);
|
| - }
|
| -
|
| -private:
|
| - /*
|
| - * Helper function to provide space for one T. The space will be in
|
| - * fStorage if there is room, or on the heap otherwise. Either way, this
|
| - * class will call ~T() in its destructor and free the heap allocation if
|
| - * necessary.
|
| - */
|
| - template<typename T> void* reserveT() {
|
| - SkASSERT(fNumObjects < kMaxObjects);
|
| - if (kMaxObjects == fNumObjects) {
|
| - return NULL;
|
| - }
|
| - const size_t storageRemaining = SkAlign4(kTotalBytes) - fStorageUsed;
|
| - const size_t storageRequired = SkAlign4(sizeof(T));
|
| - Rec* rec = &fRecs[fNumObjects];
|
| - if (storageRequired > storageRemaining) {
|
| - // Allocate on the heap. Ideally we want to avoid this situation,
|
| - // but we're not sure we can catch all callers, so handle it but
|
| - // assert false in debug mode.
|
| - SkASSERT(false);
|
| - rec->fHeapStorage = sk_malloc_throw(storageRequired);
|
| - rec->fObj = static_cast<void*>(rec->fHeapStorage);
|
| - } else {
|
| - // There is space in fStorage.
|
| - rec->fHeapStorage = NULL;
|
| - SkASSERT(SkIsAlign4(fStorageUsed));
|
| - rec->fObj = static_cast<void*>(fStorage + (fStorageUsed / 4));
|
| - fStorageUsed += storageRequired;
|
| - }
|
| - rec->fKillProc = destroyT<T>;
|
| - fNumObjects++;
|
| - return rec->fObj;
|
| - }
|
| -
|
| -private:
|
| - struct Rec {
|
| - void* fObj;
|
| - void* fHeapStorage;
|
| - void (*fKillProc)(void*);
|
| - };
|
| -
|
| - // Number of bytes used so far.
|
| - size_t fStorageUsed;
|
| - // Pad the storage size to be 4-byte aligned.
|
| - uint32_t fStorage[SkAlign4(kTotalBytes) >> 2];
|
| - uint32_t fNumObjects;
|
| - Rec fRecs[kMaxObjects];
|
| -};
|
| -
|
| -#endif // SkSmallAllocator_DEFINED
|
|
|