Generated on Thu Mar 22 10:39:42 2012 for Gecode by doxygen 1.6.3

archive.hpp

Go to the documentation of this file.
00001 /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
00002 /*
00003  *  Main authors:
00004  *     Guido Tack <tack@gecode.org>
00005  *
00006  *  Copyright:
00007  *     Guido Tack, 2011
00008  *
00009  *  Last modified:
00010  *     $Date: 2012-02-22 06:04:20 +0100 (Wed, 22 Feb 2012) $ by $Author: tack $
00011  *     $Revision: 12537 $
00012  *
00013  *  This file is part of Gecode, the generic constraint
00014  *  development environment:
00015  *     http://www.gecode.org
00016  *
00017  *  Permission is hereby granted, free of charge, to any person obtaining
00018  *  a copy of this software and associated documentation files (the
00019  *  "Software"), to deal in the Software without restriction, including
00020  *  without limitation the rights to use, copy, modify, merge, publish,
00021  *  distribute, sublicense, and/or sell copies of the Software, and to
00022  *  permit persons to whom the Software is furnished to do so, subject to
00023  *  the following conditions:
00024  *
00025  *  The above copyright notice and this permission notice shall be
00026  *  included in all copies or substantial portions of the Software.
00027  *
00028  *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
00029  *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
00030  *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
00031  *  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
00032  *  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
00033  *  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
00034  *  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
00035  *
00036  */
00037 
00038 namespace Gecode {
00045   class Archive {
00046   private:
00048     int _size;
00050     int _n;
00052     unsigned int* _a;
00054     int _pos;
00056     GECODE_KERNEL_EXPORT void resize(int n);
00057   public:
00059     Archive(void);
00061     GECODE_KERNEL_EXPORT ~Archive(void);
00063     GECODE_KERNEL_EXPORT Archive(const Archive& e);
00065     GECODE_KERNEL_EXPORT Archive& operator =(const Archive& e);
00067     void put(unsigned int i);
00069     int size(void) const;
00071     unsigned int operator [](int i) const;
00073     unsigned int get(void);
00074   };
00075 
00079   Archive&
00080   operator <<(Archive& e, unsigned int i);
00084   Archive&
00085   operator <<(Archive& e, int i);
00089   Archive&
00090   operator <<(Archive& e, unsigned short i);
00094   Archive&
00095   operator <<(Archive& e, short i);
00099   Archive&
00100   operator <<(Archive& e, unsigned char i);
00104   Archive&
00105   operator <<(Archive& e, char i);
00109   Archive&
00110   operator <<(Archive& e, bool i);
00114   Archive&
00115   operator <<(Archive& e, float d);
00119   Archive&
00120   operator <<(Archive& e, double d);
00121 
00125   Archive&
00126   operator >>(Archive& e, unsigned int& i);
00130   Archive&
00131   operator >>(Archive& e, int& i);
00135   Archive&
00136   operator >>(Archive& e, unsigned short& i);
00140   Archive&
00141   operator >>(Archive& e, short& i);
00145   Archive&
00146   operator >>(Archive& e, unsigned char& i);
00150   Archive&
00151   operator >>(Archive& e, char& i);
00155   Archive&
00156   operator >>(Archive& e, bool& i);
00160   Archive&
00161   operator >>(Archive& e, float& d);
00165   Archive&
00166   operator >>(Archive& e, double& d);
00167 
00168   /*
00169    * Implementation
00170    *
00171    */
00172 
00173   forceinline
00174   Archive::Archive(void) : _size(0), _n(0), _a(NULL), _pos(0) {}
00175 
00176   forceinline void
00177   Archive::put(unsigned int i) {
00178     if (_n==_size)
00179       resize(_n+1);
00180     _a[_n++] = i;
00181   }
00182     
00183   forceinline int
00184   Archive::size(void) const { return _n; }
00185   
00186   forceinline unsigned int
00187   Archive::operator [](int i) const {
00188     assert(i < _n);
00189     return _a[i];
00190   }
00191 
00192   forceinline unsigned int
00193   Archive::get(void) {
00194     assert(_pos < _n);
00195     return _a[_pos++];
00196   }
00197 
00198   forceinline Archive&
00199   operator <<(Archive& e, unsigned int i) {
00200     e.put(i);
00201     return e;
00202   }
00203   forceinline Archive&
00204   operator <<(Archive& e, int i) {
00205     e.put(static_cast<unsigned int>(i));
00206     return e;
00207   }
00208   forceinline Archive&
00209   operator <<(Archive& e, unsigned short i) {
00210     e.put(i);
00211     return e;
00212   }
00213   forceinline Archive&
00214   operator <<(Archive& e, short i) {
00215     e.put(static_cast<unsigned int>(i));
00216     return e;
00217   }
00218   forceinline Archive&
00219   operator <<(Archive& e, unsigned char i) {
00220     e.put(i);
00221     return e;
00222   }
00223   forceinline Archive&
00224   operator <<(Archive& e, char i) {
00225     e.put(static_cast<unsigned int>(i));
00226     return e;
00227   }
00228   forceinline Archive&
00229   operator <<(Archive& e, bool i) {
00230     e.put(static_cast<unsigned int>(i));
00231     return e;
00232   }
00233   forceinline Archive&
00234   operator <<(Archive& e, float d) {
00235     for (size_t i=0; i<sizeof(float); i++)
00236       e.put(static_cast<unsigned int>(reinterpret_cast<char*>(&d)[i]));
00237     return e;
00238   }
00239   forceinline Archive&
00240   operator <<(Archive& e, double d) {
00241     for (size_t i=0; i<sizeof(double); i++)
00242       e.put(static_cast<unsigned int>(reinterpret_cast<char*>(&d)[i]));
00243     return e;
00244   }
00245 
00246   forceinline Archive&
00247   operator >>(Archive& e, unsigned int& i) {
00248     i = e.get();
00249     return e;
00250   }
00251   forceinline Archive&
00252   operator >>(Archive& e, int& i) {
00253     i = static_cast<int>(e.get());
00254     return e;
00255   }
00256   forceinline Archive&
00257   operator >>(Archive& e, unsigned short& i) {
00258     i = static_cast<unsigned short>(e.get());
00259     return e;
00260   }
00261   forceinline Archive&
00262   operator >>(Archive& e, short& i) {
00263     i = static_cast<short>(e.get());
00264     return e;
00265   }
00266   forceinline Archive&
00267   operator >>(Archive& e, unsigned char& i) {
00268     i = static_cast<unsigned char>(e.get());
00269     return e;
00270   }
00271   forceinline Archive&
00272   operator >>(Archive& e, char& i) {
00273     i = static_cast<char>(e.get());
00274     return e;
00275   }
00276   forceinline Archive&
00277   operator >>(Archive& e, bool& i) {
00278     i = static_cast<bool>(e.get());
00279     return e;
00280   }
00281   forceinline Archive&
00282   operator >>(Archive& e, float& d) {
00283     char* cd = reinterpret_cast<char*>(&d);
00284     for (size_t i=0; i<sizeof(float); i++)
00285       cd[i] = static_cast<char>(e.get());
00286     return e;
00287   }
00288   forceinline Archive&
00289   operator >>(Archive& e, double& d) {
00290     char* cd = reinterpret_cast<char*>(&d);
00291     for (size_t i=0; i<sizeof(double); i++)
00292       cd[i] = static_cast<char>(e.get());
00293     return e;
00294   }
00295 
00296 }
00297 
00298 // STATISTICS: kernel-branch