00001 #ifndef GSGL_DATA_POOL_H
00002 #define GSGL_DATA_POOL_H
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
00029
00030
00031
00032
00033
00034
00035
00036
00037 #include "data/data.hpp"
00038 #include "data/iterable.hpp"
00039 #include "data/indexable.hpp"
00040 #include "data/array.hpp"
00041 #include "data/stack.hpp"
00042
00043 namespace gsgl
00044 {
00045
00046 namespace data
00047 {
00048
00049 #if 0
00050
00051
00052 template <typename T>
00053 class pool
00054 : public data_object, public iterable<T>, public indexable<T, gsgl::index_t>
00055 {
00056 array<T> data;
00057 stack<gsgl::index_t> free_indices;
00058 public:
00059 pool(const gsgl::index_t cap = 0);
00060 ~pool();
00061
00062 const T *get_data() const
00063 {
00064 return data.ptr();
00065 }
00066 T *get_data()
00067 {
00068 return data.ptr();
00069 }
00070
00071
00072 gsgl::index_t allocate();
00073 void release(const gsgl::index_t);
00074
00075
00076 virtual iterator<T> iter() const;
00077
00078
00079 virtual const T & item(const gsgl::index_t &) const;
00080 virtual T & item(const gsgl::index_t &);
00081
00082
00083 virtual gsgl::index_t size() const;
00084 virtual void clear();
00085
00086
00087 inline const T & operator[] (const gsgl::index_t index) const
00088 {
00089 return data.at(index);
00090 }
00091
00092 inline T & operator[] (const gsgl::index_t index)
00093 {
00094 return data.at(index);
00095 }
00096 };
00097
00098
00099
00100 template <typename T>
00101 gsgl::index_t pool<T>::allocate()
00102 {
00103 gsgl::index_t index;
00104
00105 if (free_indices.size())
00106 {
00107 index = free_indices.top();
00108 free_indices.pop();
00109 }
00110 else
00111 {
00112 index = data.size();
00113 data[index];
00114 }
00115
00116 return index;
00117 }
00118
00119 template <typename T>
00120 void pool<T>::release(const gsgl::index_t index)
00121 {
00122 free_indices.push(index);
00123 }
00124
00125
00126
00127 template <typename T>
00128 pool<T>::pool(const gsgl::index_t cap)
00129 : data_object(), indexable<T, gsgl::index_t>(), data(cap), free_indices()
00130 {}
00131
00132 template <typename T>
00133 pool<T>::~pool()
00134 {}
00135
00136 template <typename T>
00137 iterator<T> pool<T>::iter() const
00138 {
00139 return data.iter();
00140 }
00141
00142 template <typename T>
00143 gsgl::index_t pool<T>::size() const
00144 {
00145 return data.size() - free_indices.size();
00146 }
00147
00148 template <typename T>
00149 void pool<T>::clear()
00150 {
00151 data.clear();
00152 free_indices.clear();
00153 }
00154
00155
00156
00157 template <typename T>
00158 const T & pool<T>::item(const gsgl::index_t & index) const
00159 {
00160 return data.item(index);
00161 }
00162
00163 template <typename T>
00164 T & pool<T>::item(const gsgl::index_t & index)
00165 {
00166 return data.item(index);
00167 }
00168
00169 #endif
00170
00171 }
00172
00173 }
00174
00175 #endif