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
15 class CSimplePooledAlloc
{
17 // Construct with given block size
18 CSimplePooledAlloc(size_t iBlockSize
);
20 ~CSimplePooledAlloc();
22 // Return an uninitialized object
28 CPool(size_t iSize
):m_iCurrent(0), m_iSize(iSize
) {
29 m_pData
= new T
[m_iSize
];
35 if(m_iCurrent
< m_iSize
)
36 return &m_pData
[m_iCurrent
++];
39 mutable size_t m_iCurrent
;
44 std::vector
< CPool
* >m_vPool
;
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
++)
59 template < typename T
> T
* CSimplePooledAlloc
< T
>::Alloc() {
60 T
*p
= m_vPool
[m_iCurrent
]->Alloc();
63 m_vPool
.push_back(new CPool(m_iBlockSize
));
65 return m_vPool
.back()->Alloc();