1/*
2 * Copyright 2010 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 GrAllocPool_DEFINED
9#define GrAllocPool_DEFINED
10
11#include "SkTypes.h"
12
13class GrAllocPool : SkNoncopyable {
14public:
15    GrAllocPool(size_t blockSize = 0);
16    ~GrAllocPool();
17
18    /**
19     *  Frees all blocks that have been allocated with alloc().
20     */
21    void reset();
22
23    /**
24     *  Returns a block of memory bytes size big. This address must not be
25     *  passed to realloc/free/delete or any other function that assumes the
26     *  address was allocated by malloc or new (because it hasn't).
27     */
28    void* alloc(size_t bytes);
29
30    /**
31     * Releases the most recently allocated bytes back to allocpool.
32     */
33    void release(size_t bytes);
34
35private:
36    struct Block;
37
38    Block*  fBlock;
39    size_t  fMinBlockSize;
40
41#ifdef SK_DEBUG
42    int fBlocksAllocated;
43    void validate() const;
44#else
45    void validate() const {}
46#endif
47};
48
49template <typename T> class GrTAllocPool {
50public:
51    GrTAllocPool(int count) : fPool(count * sizeof(T)) {}
52
53    void reset() { fPool.reset(); }
54    T* alloc() { return (T*)fPool.alloc(sizeof(T)); }
55
56private:
57    GrAllocPool fPool;
58};
59
60#endif
61