shared-array.hpp
Go to the documentation of this file.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
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 #include <cstdarg>
00045 #include <iostream>
00046 #include <sstream>
00047
00048 namespace Gecode {
00049
00057 template<class T>
00058 class SharedArray : public SharedHandle {
00059 protected:
00061 class SAO : public SharedHandle::Object {
00062 private:
00064 T* a;
00066 int n;
00067 public:
00069 SAO(int n);
00071 virtual SharedHandle::Object* copy(void) const;
00073 virtual ~SAO(void);
00074
00076 T& operator [](int i);
00078 const T& operator [](int i) const;
00079
00081 int size(void) const;
00082
00084 T* begin(void);
00086 const T* begin(void) const;
00088 T* end(void);
00090 const T* end(void) const;
00091 };
00092 public:
00094
00095
00096 typedef T value_type;
00098 typedef T& reference;
00100 typedef const T& const_reference;
00102 typedef T* pointer;
00104 typedef const T* const_pointer;
00106 typedef T* iterator;
00108 typedef const T* const_iterator;
00110 typedef std::reverse_iterator<T*> reverse_iterator;
00112 typedef std::reverse_iterator<const T*> const_reverse_iterator;
00114
00122 SharedArray(void);
00124 SharedArray(int n);
00132 void init(int n);
00134 SharedArray(const SharedArray& a);
00136 SharedArray(const ArgArrayBase<T>& a);
00137
00139 T& operator [](int i);
00141 const T& operator [](int i) const;
00142
00144 int size(void) const;
00145
00147
00148
00149 iterator begin(void);
00151 const_iterator begin(void) const;
00153 iterator end(void);
00155 const_iterator end(void) const;
00157 reverse_iterator rbegin(void);
00159 const_reverse_iterator rbegin(void) const;
00161 reverse_iterator rend(void);
00163 const_reverse_iterator rend(void) const;
00165 };
00166
00171 template<class Char, class Traits, class T>
00172 std::basic_ostream<Char,Traits>&
00173 operator <<(std::basic_ostream<Char,Traits>& os,
00174 const SharedArray<T>& x);
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186 template<class T>
00187 forceinline
00188 SharedArray<T>::SAO::SAO(int n0) : n(n0) {
00189 a = (n>0) ? heap.alloc<T>(n) : NULL;
00190 }
00191
00192 template<class T>
00193 SharedHandle::Object*
00194 SharedArray<T>::SAO::copy(void) const {
00195 SAO* o = new SAO(n);
00196 for (int i=n; i--;)
00197 o->a[i] = a[i];
00198 return o;
00199 }
00200
00201 template<class T>
00202 SharedArray<T>::SAO::~SAO(void) {
00203 if (n>0) {
00204 heap.free<T>(a,n);
00205 }
00206 }
00207
00208 template<class T>
00209 forceinline T&
00210 SharedArray<T>::SAO::operator [](int i) {
00211 assert((i>=0) && (i<n));
00212 return a[i];
00213 }
00214
00215 template<class T>
00216 forceinline const T&
00217 SharedArray<T>::SAO::operator [](int i) const {
00218 assert((i>=0) && (i<n));
00219 return a[i];
00220 }
00221
00222 template<class T>
00223 forceinline int
00224 SharedArray<T>::SAO::size(void) const {
00225 return n;
00226 }
00227
00228 template<class T>
00229 forceinline T*
00230 SharedArray<T>::SAO::begin(void) {
00231 return a;
00232 }
00233
00234 template<class T>
00235 forceinline const T*
00236 SharedArray<T>::SAO::begin(void) const {
00237 return a;
00238 }
00239
00240 template<class T>
00241 forceinline T*
00242 SharedArray<T>::SAO::end(void) {
00243 return a+n;
00244 }
00245
00246 template<class T>
00247 forceinline const T*
00248 SharedArray<T>::SAO::end(void) const {
00249 return a+n;
00250 }
00251
00252
00253 template<class T>
00254 forceinline
00255 SharedArray<T>::SharedArray(void) {}
00256
00257 template<class T>
00258 forceinline
00259 SharedArray<T>::SharedArray(int n)
00260 : SharedHandle(new SAO(n)) {}
00261
00262 template<class T>
00263 forceinline
00264 SharedArray<T>::SharedArray(const SharedArray<T>& sa)
00265 : SharedHandle(sa) {}
00266
00267 template<class T>
00268 forceinline void
00269 SharedArray<T>::init(int n) {
00270 assert(object() == NULL);
00271 object(new SAO(n));
00272 }
00273
00274 template<class T>
00275 forceinline T&
00276 SharedArray<T>::operator [](int i) {
00277 assert(object() != NULL);
00278 return (*static_cast<SAO*>(object()))[i];
00279 }
00280
00281 template<class T>
00282 forceinline const T&
00283 SharedArray<T>::operator [](int i) const {
00284 assert(object() != NULL);
00285 return (*static_cast<SAO*>(object()))[i];
00286 }
00287
00288 template<class T>
00289 forceinline
00290 SharedArray<T>::SharedArray(const ArgArrayBase<T>& a)
00291 : SharedHandle(new SAO(a.size())) {
00292 for (int i=a.size(); i--; )
00293 operator [](i)=a[i];
00294 }
00295
00296 template<class T>
00297 forceinline int
00298 SharedArray<T>::size(void) const {
00299 assert(object() != NULL);
00300 return static_cast<SAO*>(object())->size();
00301 }
00302
00303 template<class T>
00304 forceinline typename SharedArray<T>::iterator
00305 SharedArray<T>::begin(void) {
00306 assert(object() != NULL);
00307 return static_cast<SAO*>(object())->begin();
00308 }
00309
00310 template<class T>
00311 forceinline typename SharedArray<T>::const_iterator
00312 SharedArray<T>::begin(void) const {
00313 assert(object() != NULL);
00314 return static_cast<SAO*>(object())->begin();
00315 }
00316
00317 template<class T>
00318 forceinline typename SharedArray<T>::iterator
00319 SharedArray<T>::end(void) {
00320 assert(object() != NULL);
00321 return static_cast<SAO*>(object())->end();
00322 }
00323
00324 template<class T>
00325 forceinline typename SharedArray<T>::const_iterator
00326 SharedArray<T>::end(void) const {
00327 assert(object() != NULL);
00328 return static_cast<SAO*>(object())->end();
00329 }
00330
00331 template<class T>
00332 forceinline typename SharedArray<T>::reverse_iterator
00333 SharedArray<T>::rbegin(void) {
00334 assert(object() != NULL);
00335 return reverse_iterator(static_cast<SAO*>(object())->end());
00336 }
00337
00338 template<class T>
00339 forceinline typename SharedArray<T>::const_reverse_iterator
00340 SharedArray<T>::rbegin(void) const {
00341 assert(object() != NULL);
00342 return const_reverse_iterator(static_cast<SAO*>(object())->end());
00343 }
00344
00345 template<class T>
00346 forceinline typename SharedArray<T>::reverse_iterator
00347 SharedArray<T>::rend(void) {
00348 assert(object() != NULL);
00349 return reverse_iterator(static_cast<SAO*>(object())->begin());
00350 }
00351
00352 template<class T>
00353 forceinline typename SharedArray<T>::const_reverse_iterator
00354 SharedArray<T>::rend(void) const {
00355 assert(object() != NULL);
00356 return const_reverse_iterator(static_cast<SAO*>(object())->begin());
00357 }
00358
00359 template<class Char, class Traits, class T>
00360 std::basic_ostream<Char,Traits>&
00361 operator <<(std::basic_ostream<Char,Traits>& os,
00362 const SharedArray<T>& x) {
00363 std::basic_ostringstream<Char,Traits> s;
00364 s.copyfmt(os); s.width(0);
00365 s << '{';
00366 if (x.size() > 0) {
00367 s << x[0];
00368 for (int i=1; i<x.size(); i++)
00369 s << ", " << x[i];
00370 }
00371 s << '}';
00372 return os << s.str();
00373 }
00374
00375 }
00376
00377