diff -r 000000000000 -r 6474c204b198 gfx/skia/trunk/include/core/SkChunkAlloc.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gfx/skia/trunk/include/core/SkChunkAlloc.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,68 @@ + +/* + * Copyright 2006 The Android Open Source Project + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + + +#ifndef SkChunkAlloc_DEFINED +#define SkChunkAlloc_DEFINED + +#include "SkTypes.h" + +class SkChunkAlloc : SkNoncopyable { +public: + SkChunkAlloc(size_t minSize); + ~SkChunkAlloc(); + + /** + * Free up all allocated blocks. This invalidates all returned + * pointers. + */ + void reset(); + + enum AllocFailType { + kReturnNil_AllocFailType, + kThrow_AllocFailType + }; + + void* alloc(size_t bytes, AllocFailType); + void* allocThrow(size_t bytes) { + return this->alloc(bytes, kThrow_AllocFailType); + } + + /** Call this to unalloc the most-recently allocated ptr by alloc(). On + success, the number of bytes freed is returned, or 0 if the block could + not be unallocated. This is a hint to the underlying allocator that + the previous allocation may be reused, but the implementation is free + to ignore this call (and return 0). + */ + size_t unalloc(void* ptr); + + size_t totalCapacity() const { return fTotalCapacity; } + size_t totalUsed() const { return fTotalUsed; } + int blockCount() const { return fBlockCount; } + + /** + * Returns true if the specified address is within one of the chunks, and + * has at least 1-byte following the address (i.e. if addr points to the + * end of a chunk, then contains() will return false). + */ + bool contains(const void* addr) const; + +private: + struct Block; + + Block* fBlock; + size_t fMinSize; + size_t fChunkSize; + size_t fTotalCapacity; + size_t fTotalUsed; // will be <= fTotalCapacity + int fBlockCount; + + Block* newBlock(size_t bytes, AllocFailType ftype); +}; + +#endif