1 /* 2 * Copyright 2015 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef SkVarAlloc_DEFINED 9 #define SkVarAlloc_DEFINED 10 11 #include "SkTypes.h" 12 13 class SkVarAlloc : SkNoncopyable { 14 public: 15 // Smallest block we'll allocate is 2**N bytes. 16 explicit SkVarAlloc(size_t minLgSize); 17 // Same as above, but first uses up to len bytes from storage. 18 SkVarAlloc(size_t minLgSize, char* storage, size_t len); 19 20 ~SkVarAlloc(); 21 22 // Returns contiguous bytes aligned at least for pointers. You may pass SK_MALLOC_THROW, etc. 23 char* alloc(size_t bytes, unsigned sk_malloc_flags) { 24 bytes = SkAlignPtr(bytes); 25 26 if (bytes > fRemaining) { 27 this->makeSpace(bytes, sk_malloc_flags); 28 } 29 SkASSERT(bytes <= fRemaining); 30 31 char* ptr = fByte; 32 fByte += bytes; 33 fRemaining = SkToU32(fRemaining - bytes); 34 return ptr; 35 } 36 37 // Returns our best estimate of the number of bytes we've allocated. 38 // (We may not track this precisely to save space.) 39 size_t approxBytesAllocated() const { return fBytesAllocated; } 40 41 private: 42 void makeSpace(size_t bytes, unsigned flags); 43 44 size_t fBytesAllocated; 45 46 char* fByte; 47 unsigned fRemaining; 48 unsigned fLgSize; 49 50 struct Block; 51 Block* fBlock; 52 }; 53 SK_COMPILE_ASSERT(sizeof(SkVarAlloc) <= 32, SkVarAllocSize); 54 55 #endif//SkVarAlloc_DEFINED 56