Update Turkish translation
[dasher.git] / Src / Common / Allocators / SimplePooledAlloc.h
blob9141240deff95d440d91807389928e081003d801
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 <cstddef>
13 #include <vector>
15 template<typename T>
16 class CSimplePooledAlloc {
17 public:
18 // Construct with given block size
19 CSimplePooledAlloc(std::size_t iBlockSize);
21 ~CSimplePooledAlloc();
23 // Return an uninitialized object
24 T *Alloc();
26 private:
27 class CPool {
28 public:
29 CPool(std::size_t iSize):m_iCurrent(0), m_iSize(iSize) {
30 m_pData = new T[m_iSize];
32 ~CPool() {
33 delete[]m_pData;
35 T *Alloc() const {
36 if(m_iCurrent < m_iSize)
37 return &m_pData[m_iCurrent++];
38 return NULL;
40 private:
41 mutable std::size_t m_iCurrent;
42 std::size_t m_iSize;
43 T *m_pData;
46 std::vector < CPool * >m_vPool;
48 std::size_t m_iBlockSize;
49 int m_iCurrent;
52 template < typename T > CSimplePooledAlloc < T >::CSimplePooledAlloc(std::size_t iSize):m_iBlockSize(iSize), m_iCurrent(0) {
53 m_vPool.push_back(new CPool(m_iBlockSize));
56 template < typename T > CSimplePooledAlloc < T >::~CSimplePooledAlloc() {
57 for(std::size_t i = 0; i < m_vPool.size(); i++)
58 delete m_vPool[i];
61 template < typename T > T * CSimplePooledAlloc < T >::Alloc() {
62 T *p = m_vPool[m_iCurrent]->Alloc();
63 if(p)
64 return p;
65 m_vPool.push_back(new CPool(m_iBlockSize));
66 m_iCurrent++;
67 return m_vPool.back()->Alloc();
70 #endif // __include__