/*
 * Copyright 2010 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef GrAllocPool_DEFINED
#define GrAllocPool_DEFINED

#include "SkTypes.h"

class GrAllocPool : public SkNoncopyable {
public:
    GrAllocPool(size_t blockSize = 0);
    ~GrAllocPool();

    /**
     *  Frees all blocks that have been allocated with alloc().
     */
    void reset();

    /**
     *  Returns a block of memory bytes size big. This address must not be
     *  passed to realloc/free/delete or any other function that assumes the
     *  address was allocated by malloc or new (because it hasn't).
     */
    void* alloc(size_t bytes);

    /**
     * Releases the most recently allocated bytes back to allocpool.
     */
    void release(size_t bytes);

private:
    struct Block;

    Block*  fBlock;
    size_t  fMinBlockSize;

#ifdef SK_DEBUG
    int fBlocksAllocated;
    void validate() const;
#else
    void validate() const {}
#endif
};

template <typename T> class GrTAllocPool {
public:
    GrTAllocPool(int count) : fPool(count * sizeof(T)) {}

    void reset() { fPool.reset(); }
    T* alloc() { return (T*)fPool.alloc(sizeof(T)); }

private:
    GrAllocPool fPool;
};

#endif
