00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef HxMemoryPool_h
00012 #define HxMemoryPool_h
00013
00014 #include "HxStd.h"
00015 #include "HxIoFwd.h"
00016
00017 #ifdef HxMemoryPool_Debug
00018 #include "HxIo.h"
00019
00020 #endif
00021
00022 class HxMemoryPoolFactory;
00023
00024 class HxMemoryPool
00025 {
00026 public:
00027
00028 void* alloc();
00029 void free(void* block);
00030
00031 void collectMemory();
00032
00033 STD_OSTREAM& put(STD_OSTREAM&) const;
00034
00035 private:
00036
00037 class HxMpBlock;
00038 class HxMpPage;
00039
00040 friend class HxMemoryPoolFactory;
00041
00042 HxMemoryPool(size_t blockSize);
00043 ~HxMemoryPool();
00044
00045 void newPage();
00046 static size_t getBlockSize(size_t blockSize);
00047
00048 size_t _blockSize;
00049 size_t _pageSize;
00050
00051 HxMemoryPool* _next;
00052
00053 HxMpBlock* _freeList;
00054 HxMpPage* _pageList;
00055
00056 size_t _freeCount;
00057
00058 class HxMpBlock {
00059 public:
00060 HxMpBlock* next;
00061 };
00062
00063 class HxMpPage {
00064 public:
00065 HxMpPage();
00066 void* operator new(size_t, void*);
00067 HxMpPage* next;
00068 };
00069 };
00070
00071 inline STD_OSTREAM&
00072 operator<<(STD_OSTREAM& os, const HxMemoryPool& mp)
00073 {
00074 return mp.put(os);
00075 }
00076
00077 inline void*
00078 HxMemoryPool::alloc()
00079 {
00080 #ifdef HxMemoryPool_Debug
00081
00082 #endif
00083 if (!_freeList)
00084 newPage();
00085 void* m = (void *)_freeList;
00086 _freeList = _freeList->next;
00087 --_freeCount;
00088 return m;
00089 }
00090
00091 inline void
00092 HxMemoryPool::free(void* m)
00093 {
00094 #ifdef HxMemoryPool_Debug
00095
00096 #endif
00097 HxMpBlock* b = (HxMpBlock*)m;
00098 b->next = _freeList;
00099 _freeList = b;
00100 _freeCount++;
00101 }
00102
00103 inline
00104 HxMemoryPool::HxMpPage::HxMpPage() : next(0) {}
00105
00106 inline void*
00107 HxMemoryPool::HxMpPage::operator new(size_t, void* m) { return m; }
00108
00109 #endif