00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef _POOL_H_
00016 #define _POOL_H_
00017
00018 #include <vector>
00019 using std::vector;
00020
00021
00022
00023
00024
00025
00026 template <class T>
00027 class pool
00028 {
00029 #if 0 //WANT_CHECKPOINT_SUPPORT
00030 BOOST_SERIALIZE {
00031 ar & BOOST_SERIALIZATION_NVP(_pool);
00032 ar & BOOST_SERIALIZATION_NVP(num);
00033 }
00034 #endif
00035 public:
00036 pool( int size = 10 );
00037 ~pool( void );
00038 inline T* getItem( void );
00039 inline void returnItem( T* item );
00040
00041 private:
00042 int num;
00043
00044
00045
00046 vector<T*> _pool;
00047 };
00048
00049
00050
00051
00052 template <class T>
00053 pool<T>::pool( const int size )
00054 {
00055
00056 _pool.reserve(size * 2);
00057
00058 for (int i = 0 ; i < size ; ++i ) {
00059 _pool.push_back(new T);
00060 }
00061 num = size;
00062 }
00063
00064
00065
00066
00067
00068
00069
00070 template <class T>
00071 pool<T>::~pool( void )
00072 {
00073
00074
00075
00076
00077
00078 }
00079
00080
00081
00082
00083 template <class T>
00084 T* pool<T>::getItem( void )
00085 {
00086 T* ret;
00087
00088 if (num > 0) {
00089 num--;
00090 ret = _pool.back();
00091 _pool.pop_back();
00092 } else {
00093 ret = new T;
00094 num++;
00095 _pool.push_back(new T);
00096 }
00097 if (ret == 0) {
00098 fprintf(stderr,"Pool Error (returning 0)\n");
00099 exit(-1);
00100 }
00101 return ret;
00102 }
00103
00104
00105
00106
00107 template<class T>
00108 void pool<T>::returnItem( T* item )
00109 {
00110 if (item) {
00111 num++;
00112 _pool.push_back(item);
00113 }
00114 }
00115
00116 #endif