Generated on Tue Apr 18 10:22:07 2017 for Gecode by doxygen 1.6.3

shared-array.hpp

Go to the documentation of this file.
00001 /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
00002 /*
00003  *  Main authors:
00004  *     Christian Schulte <schulte@gecode.org>
00005  *     Guido Tack <tack@gecode.org>
00006  *
00007  *  Contributing authors:
00008  *     Gregory Crosswhite <gcross@phys.washington.edu>
00009  *
00010  *  Copyright:
00011  *     Gregory Crosswhite, 2011
00012  *     Christian Schulte, 2003
00013  *     Guido Tack, 2004
00014  *
00015  *  Last modified:
00016  *     $Date: 2016-04-19 17:19:45 +0200 (Tue, 19 Apr 2016) $ by $Author: schulte $
00017  *     $Revision: 14967 $
00018  *
00019  *  This file is part of Gecode, the generic constraint
00020  *  development environment:
00021  *     http://www.gecode.org
00022  *
00023  *  Permission is hereby granted, free of charge, to any person obtaining
00024  *  a copy of this software and associated documentation files (the
00025  *  "Software"), to deal in the Software without restriction, including
00026  *  without limitation the rights to use, copy, modify, merge, publish,
00027  *  distribute, sublicense, and/or sell copies of the Software, and to
00028  *  permit persons to whom the Software is furnished to do so, subject to
00029  *  the following conditions:
00030  *
00031  *  The above copyright notice and this permission notice shall be
00032  *  included in all copies or substantial portions of the Software.
00033  *
00034  *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
00035  *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
00036  *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
00037  *  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
00038  *  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
00039  *  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
00040  *  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
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    * Implementation
00179    *
00180    */
00181 
00182   /*
00183    * Shared arrays
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 // STATISTICS: kernel-other