#ifndef SkVarAlloc_DEFINED #define SkVarAlloc_DEFINED #include "SkTypes.h" class SkVarAlloc : SkNoncopyable { public: // Smallest block we'll allocate is 2**N bytes. explicit SkVarAlloc(size_t minLgSize); ~SkVarAlloc(); // Returns contiguous bytes aligned at least for pointers. You may pass SK_MALLOC_THROW, etc. char* alloc(size_t bytes, unsigned sk_malloc_flags) { bytes = SkAlignPtr(bytes); if (bytes > fRemaining) { this->makeSpace(bytes, sk_malloc_flags); } SkASSERT(bytes <= fRemaining); char* ptr = fByte; fByte += bytes; fRemaining = SkToU32(fRemaining - bytes); return ptr; } // Returns our best estimate of the number of bytes we've allocated. // (We intentionally do not track this precisely to save space.) size_t approxBytesAllocated() const; private: void makeSpace(size_t bytes, unsigned flags); char* fByte; unsigned fRemaining; unsigned fLgSize; struct Block; Block* fBlock; }; SK_COMPILE_ASSERT(sizeof(SkVarAlloc) <= 24, SkVarAllocSize); #endif//SkVarAlloc_DEFINED