Line data Source code
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.
23 0 : char* alloc(size_t bytes) {
24 0 : bytes = SkAlignPtr(bytes);
25 :
26 0 : if (bytes > fRemaining) {
27 0 : this->makeSpace(bytes);
28 : }
29 0 : SkASSERT(bytes <= fRemaining);
30 :
31 0 : char* ptr = fByte;
32 0 : fByte += bytes;
33 0 : fRemaining = SkToU32(fRemaining - bytes);
34 0 : 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 0 : 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
|