archive.hpp /usr/include/gecode/kernel.hh Gecode::Archive Gecode /*-*-mode:C++;c-basic-offset:2;indent-tabs-mode:nil-*-*/ /* *Mainauthors: *GuidoTack<tack@gecode.org> * *Copyright: *GuidoTack,2011 * *Lastmodified: *$Date:2011-10-1119:28:17+0200(Tue,11Oct2011)$by$Author:tack$ *$Revision:12440$ * *ThisfileispartofGecode,thegenericconstraint *developmentenvironment: *http://www.gecode.org * *Permissionisherebygranted,freeofcharge,toanypersonobtaining *acopyofthissoftwareandassociateddocumentationfiles(the *"Software"),todealintheSoftwarewithoutrestriction,including *withoutlimitationtherightstouse,copy,modify,merge,publish, *distribute,sublicense,and/orsellcopiesoftheSoftware,andto *permitpersonstowhomtheSoftwareisfurnishedtodoso,subjectto *thefollowingconditions: * *Theabovecopyrightnoticeandthispermissionnoticeshallbe *includedinallcopiesorsubstantialportionsoftheSoftware. * *THESOFTWAREISPROVIDED"ASIS",WITHOUTWARRANTYOFANYKIND, *EXPRESSORIMPLIED,INCLUDINGBUTNOTLIMITEDTOTHEWARRANTIESOF *MERCHANTABILITY,FITNESSFORAPARTICULARPURPOSEAND *NONINFRINGEMENT.INNOEVENTSHALLTHEAUTHORSORCOPYRIGHTHOLDERSBE *LIABLEFORANYCLAIM,DAMAGESOROTHERLIABILITY,WHETHERINANACTION *OFCONTRACT,TORTOROTHERWISE,ARISINGFROM,OUTOFORINCONNECTION *WITHTHESOFTWAREORTHEUSEOROTHERDEALINGSINTHESOFTWARE. * */ namespaceGecode{ classArchive{ private: int_size; int_n; unsignedint*_a; int_pos; GECODE_KERNEL_EXPORTvoidresize(intn); public: Archive(void); GECODE_KERNEL_EXPORT~Archive(void); GECODE_KERNEL_EXPORTArchive(constArchive&e); GECODE_KERNEL_EXPORTArchive&operator =(constArchive&e); voidput(unsignedinti); intsize(void)const; unsignedintoperator [](inti)const; unsignedintget(void); }; Archive& operator<<(Archive&e,unsignedinti); Archive& operator<<(Archive&e,inti); Archive& operator<<(Archive&e,unsignedshorti); Archive& operator<<(Archive&e,shorti); Archive& operator<<(Archive&e,unsignedchari); Archive& operator<<(Archive&e,chari); Archive& operator<<(Archive&e,booli); Archive& operator<<(Archive&e,floatd); Archive& operator<<(Archive&e,doubled); Archive& operator>>(Archive&e,unsignedint&i); Archive& operator>>(Archive&e,int&i); Archive& operator>>(Archive&e,unsignedshort&i); Archive& operator>>(Archive&e,short&i); Archive& operator>>(Archive&e,unsignedchar&i); Archive& operator>>(Archive&e,char&i); Archive& operator>>(Archive&e,bool&i); Archive& operator>>(Archive&e,float&d); Archive& operator>>(Archive&e,double&d); /* *Implementation * */ forceinline Archive::Archive(void):_size(0),_n(0),_a(NULL),_pos(0){} forceinlinevoid Archive::put(unsignedinti){ if(_n==_size) resize(_n+1); _a[_n++]=i; } forceinlineint Archive::size(void)const{return_n;} forceinlineunsignedint Archive::operator [](inti)const{ assert(i<_n); return_a[i]; } forceinlineunsignedint Archive::get(void){ assert(_pos<_n); return_a[_pos++]; } forceinlineArchive& operator<<(Archive&e,unsignedinti){ e.put(i); returne; } forceinlineArchive& operator<<(Archive&e,inti){ e.put(static_cast<unsignedint>(i)); returne; } forceinlineArchive& operator<<(Archive&e,unsignedshorti){ e.put(i); returne; } forceinlineArchive& operator<<(Archive&e,shorti){ e.put(static_cast<unsignedint>(i)); returne; } forceinlineArchive& operator<<(Archive&e,unsignedchari){ e.put(i); returne; } forceinlineArchive& operator<<(Archive&e,chari){ e.put(static_cast<unsignedint>(i)); returne; } forceinlineArchive& operator<<(Archive&e,booli){ e.put(static_cast<unsignedint>(i)); returne; } forceinlineArchive& operator<<(Archive&e,floatd){ for(size_ti=0;i<sizeof(float);i++) e.put(static_cast<unsignedint>(reinterpret_cast<char*>(&d)[i])); returne; } forceinlineArchive& operator<<(Archive&e,doubled){ for(size_ti=0;i<sizeof(double);i++) e.put(static_cast<unsignedint>(reinterpret_cast<char*>(&d)[i])); returne; } forceinlineArchive& operator>>(Archive&e,unsignedint&i){ i=e.get(); returne; } forceinlineArchive& operator>>(Archive&e,int&i){ i=static_cast<int>(e.get()); returne; } forceinlineArchive& operator>>(Archive&e,unsignedshort&i){ i=static_cast<unsignedshort>(e.get()); returne; } forceinlineArchive& operator>>(Archive&e,short&i){ i=static_cast<short>(e.get()); returne; } forceinlineArchive& operator>>(Archive&e,unsignedchar&i){ i=static_cast<unsignedchar>(e.get()); returne; } forceinlineArchive& operator>>(Archive&e,char&i){ i=static_cast<char>(e.get()); returne; } forceinlineArchive& operator>>(Archive&e,bool&i){ i=static_cast<bool>(e.get()); returne; } forceinlineArchive& operator>>(Archive&e,float&d){ char*cd=reinterpret_cast<char*>(&d); for(size_ti=0;i<sizeof(float);i++) cd[i]=static_cast<char>(e.get()); returne; } forceinlineArchive& operator>>(Archive&e,double&d){ char*cd=reinterpret_cast<char*>(&d); for(size_ti=0;i<sizeof(double);i++) cd[i]=static_cast<char>(e.get()); returne; } } //STATISTICS:kernel-branch