00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef MDWOBJECTPOOL_H
00021 #define MDWOBJECTPOOL_H
00022
00023 namespace mdw
00024 {
00025
00029 template<class T>
00030 class ObjectPool
00031 {
00032 public:
00033
00034 ObjectPool (int size);
00035
00036 ~ObjectPool();
00037
00038 T& obtain();
00039 void release (T& object);
00040 int availableObjects();
00041
00042 private:
00043 T ** _pool;
00044 int _begin;
00045 int _end;
00046 int _size;
00047 int _mask;
00048 };
00049
00050 template <class T>
00051 ObjectPool<T>::ObjectPool (int size)
00052 {
00053 _pool = new T*[size];
00054 _begin = 0;
00055 _end = size;
00056 _size = size;
00057 _mask = (size << 1) - 1;
00058 for (int i = 0; i < size; ++i)
00059 {
00060 _pool[i] = new T();
00061 }
00062 }
00063
00064 template <class T>
00065 ObjectPool<T>::~ObjectPool()
00066 {
00067 for (int i = 0; i < _size; ++i)
00068 {
00069 delete _pool[i];
00070 }
00071
00072 delete[] _pool;
00073 }
00074
00075 template<class T>
00076 T& ObjectPool<T>::obtain()
00077 {
00078 if (_end != _begin)
00079 {
00080 int pos = _begin;
00081 ++_begin;
00082 _begin &= _mask;
00083 return *_pool[pos];
00084 }
00085 }
00086
00087 template <class T>
00088 void ObjectPool<T>::release (T& object)
00089 {
00090 if (_end <= (_begin + _size))
00091 {
00092 _pool[_end] = &object;
00093 ++_end;
00094 _end &= _mask;
00095 }
00096 }
00097
00098 template <class T>
00099 int ObjectPool<T>::availableObjects()
00100 {
00101 return (_end > _begin) ? _end - _begin : _end - _begin + _size;
00102 }
00103
00104 }
00105
00106 #endif