Index: src/core/SkVarAlloc.h |
diff --git a/src/core/SkVarAlloc.h b/src/core/SkVarAlloc.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0a7864b37a878e265c7e12eccdee4ee03123d331 |
--- /dev/null |
+++ b/src/core/SkVarAlloc.h |
@@ -0,0 +1,40 @@ |
+#ifndef SkVarAlloc_DEFINED |
+#define SkVarAlloc_DEFINED |
+ |
+#include "SkTypes.h" |
+ |
+class SkVarAlloc : SkNoncopyable { |
+public: |
+ // SkVarAlloc will never allocate less than smallest bytes at a time. |
+ // When it allocates a new block, it will be at least growth times bigger than the last. |
+ SkVarAlloc(size_t smallest, float growth); |
+ ~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 (fByte + bytes > fLimit) { |
+ this->makeSpace(bytes, sk_malloc_flags); |
+ } |
+ SkASSERT(fByte + bytes <= fLimit); |
+ |
+ char* ptr = fByte; |
+ fByte += bytes; |
+ return ptr; |
+ } |
+ |
+private: |
+ void makeSpace(size_t bytes, unsigned flags); |
+ |
+ char* fByte; |
+ const char* fLimit; |
+ |
+ unsigned fSmallest; |
+ const float fGrowth; |
+ |
+ struct Block; |
+ Block* fBlock; |
+}; |
+ |
+#endif//SkVarAlloc_DEFINED |