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
13class SkVarAlloc : SkNoncopyable {
14public:
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
41private:
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};
53SK_COMPILE_ASSERT(sizeof(SkVarAlloc) <= 32, SkVarAllocSize);
54
55#endif//SkVarAlloc_DEFINED
56