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.
alloc(size_t bytes)23     char* alloc(size_t bytes) {
24         bytes = SkAlignPtr(bytes);
25 
26         if (bytes > fRemaining) {
27             this->makeSpace(bytes);
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.)
approxBytesAllocated()39     size_t approxBytesAllocated() const { return fBytesAllocated; }
40 
41 private:
42     void makeSpace(size_t bytes);
43 
44     size_t fBytesAllocated;
45 
46     char* fByte;
47     unsigned fRemaining;
48     unsigned fLgSize;
49 
50     struct Block;
51     Block* fBlock;
52 };
53 static_assert(sizeof(SkVarAlloc) <= 32, "SkVarAllocSize");
54 
55 #endif//SkVarAlloc_DEFINED
56