Pool.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef ROCKETCOREPOOL_H
00029 #define ROCKETCOREPOOL_H
00030
00031 #include <Rocket/Core/Header.h>
00032 #include <Rocket/Core/Debug.h>
00033
00034 namespace Rocket {
00035 namespace Core {
00036
00037 template < typename PoolType >
00038 class Pool
00039 {
00040 private:
00041 class PoolNode
00042 {
00043 public:
00044 PoolType object;
00045 PoolNode* previous;
00046 PoolNode* next;
00047 };
00048
00049 class PoolChunk
00050 {
00051 public:
00052 PoolNode* chunk;
00053 PoolChunk* next;
00054 };
00055
00056 public:
00061 class Iterator
00062 {
00063 friend class Pool< PoolType >;
00064
00065 public :
00069 inline void operator++()
00070 {
00071 ROCKET_ASSERT(node != NULL);
00072 node = node->next;
00073 }
00076 inline operator bool()
00077 {
00078 return (node != NULL);
00079 }
00080
00083 inline PoolType& operator*()
00084 {
00085 return node->object;
00086 }
00089 inline PoolType* operator->()
00090 {
00091 return &node->object;
00092 }
00093
00094 private:
00095
00096 inline Iterator(PoolNode* node)
00097 {
00098 this->node = node;
00099 }
00100
00101 PoolNode* node;
00102 };
00103
00104 Pool(int chunk_size = 0, bool grow = false);
00105 ~Pool();
00106
00108 void Initialise(int chunk_size, bool grow = false);
00109
00111 inline Iterator Begin();
00112
00117 inline PoolType* AllocateObject();
00118
00120 inline void DeallocateObject(Iterator& iterator);
00122 inline void DeallocateObject(PoolType* object);
00123
00125 inline int GetSize() const;
00127 inline int GetNumChunks() const;
00129 inline int GetNumAllocatedObjects() const;
00130
00131 private:
00132
00133 void CreateChunk();
00134
00135 int chunk_size;
00136 bool grow;
00137
00138 PoolChunk* pool;
00139
00140
00141 PoolNode* first_allocated_node;
00142 PoolNode* first_free_node;
00143
00144 int num_allocated_objects;
00145 };
00146
00147 #include "Pool.inl"
00148
00149 }
00150 }
00151
00152 #endif