tagging release
[dasher.git] / Src / Common / Allocators / SimplePooledAlloc.h
blob9674371ca3216d162f1d793aaac08af72636c117
1 // SimplePooledAlloc.h
2 //
3 // Copyright (c) 2005 David Ward
5 #ifndef __SimplePooledAlloc_h__
6 #define __SimplePooledAlloc_h__
8 // CSimplePooledAlloc allocates objects T in fixed-size blocks (specified)
9 // Alloc returns a default-constructed T*
10 // Memory is only freed on destruction of the allocator
12 #include <vector>
14 template<typename T>
15 class CSimplePooledAlloc {
16 public:
17 // Construct with given block size
18 CSimplePooledAlloc(size_t iBlockSize);
20 ~CSimplePooledAlloc();
22 // Return an uninitialized object
23 T *Alloc();
25 private:
26 class CPool {
27 public:
28 CPool(size_t iSize):m_iCurrent(0), m_iSize(iSize) {
29 m_pData = new T[m_iSize];
31 ~CPool() {
32 delete[]m_pData;
34 T *Alloc() const {
35 if(m_iCurrent < m_iSize)
36 return &m_pData[m_iCurrent++];
37 return NULL;
38 } private:
39 mutable size_t m_iCurrent;
40 size_t m_iSize;
41 T *m_pData;
44 std::vector < CPool * >m_vPool;
46 size_t m_iBlockSize;
47 int m_iCurrent;
50 template < typename T > CSimplePooledAlloc < T >::CSimplePooledAlloc(size_t iSize):m_iBlockSize(iSize), m_iCurrent(0) {
51 m_vPool.push_back(new CPool(m_iBlockSize));
54 template < typename T > CSimplePooledAlloc < T >::~CSimplePooledAlloc() {
55 for(size_t i = 0; i < m_vPool.size(); i++)
56 delete m_vPool[i];
59 template < typename T > T * CSimplePooledAlloc < T >::Alloc() {
60 T *p = m_vPool[m_iCurrent]->Alloc();
61 if(p)
62 return p;
63 m_vPool.push_back(new CPool(m_iBlockSize));
64 m_iCurrent++;
65 return m_vPool.back()->Alloc();
68 #endif // __include__