ranges-map.hpp /usr/include/gecode/iter.hh Gecode::Iter::Ranges::Map Gecode::Iter::Ranges::Map< I, M, false > Gecode::Iter::Ranges::Map< I, M, true > Gecode Gecode::Iter Gecode::Iter::Ranges /*-*-mode:C++;c-basic-offset:2;indent-tabs-mode:nil-*-*/ /* *Mainauthors: *ChristianSchulte<schulte@gecode.org> * *Copyright: *ChristianSchulte,2008 * *Lastmodified: *$Date:2010-07-2817:35:33+0200(Wed,28Jul2010)$by$Author:schulte$ *$Revision:11294$ * *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{namespaceIter{namespaceRanges{ template<classI,classM,boolstrict=true> classMap{ public: Map(void); Map(I&i); Map(I&i,constM&m); voidinit(I&i); voidinit(I&i,constM&m); booloperator ()(void)const; voidoperator ++(void); intmin(void)const; intmax(void)const; unsignedintwidth(void)const; }; template<classI,classM> classMap<I,M,false>:publicMinMax{ protected: Ii; Mm; voidnext(void); public: Map(void); Map(I&i); Map(I&i,constM&m); voidinit(I&i); voidinit(I&i,constM&m); voidoperator ++(void); }; template<classI,classM> classMap<I,M,true>{ protected: Ii; Mm; public: Map(void); Map(I&i); Map(I&i,constM&m); voidinit(I&i); voidinit(I&i,constM&m); booloperator ()(void)const; voidoperator ++(void); intmin(void)const; intmax(void)const; unsignedintwidth(void)const; }; template<classI,classM> forceinline Map<I,M,false>::Map(void){} template<classI,classM> forceinlinevoid Map<I,M,false>::next(void){ if(i()){ mi=m.min(i.min()); ma=m.max(i.max()); ++i; while(i()&&(ma+1>=m.min(i.min()))){ ma=m.max(i.max());++i; } }else{ finish(); } } template<classI,classM> forceinlinevoid Map<I,M,false>::init(I&i0){ i=i0;next(); } template<classI,classM> forceinlinevoid Map<I,M,false>::init(I&i0,constM&m0){ i=i0;m=m0;next(); } template<classI,classM> forceinline Map<I,M,false>::Map(I&i0):i(i0){ next(); } template<classI,classM> forceinline Map<I,M,false>::Map(I&i0,constM&m0):i(i0),m(m0){ next(); } template<classI,classM> forceinlinevoid Map<I,M,false>::operator ++(void){ next(); } template<classI,classM> forceinline Map<I,M,true>::Map(void){} template<classI,classM> forceinlinevoid Map<I,M,true>::init(I&i0){ i=i0; } template<classI,classM> forceinlinevoid Map<I,M,true>::init(I&i0,constM&m0){ i=i0;m=m0; } template<classI,classM> forceinline Map<I,M,true>::Map(I&i0):i(i0){} template<classI,classM> forceinline Map<I,M,true>::Map(I&i0,constM&m0):i(i0),m(m0){} template<classI,classM> forceinlinebool Map<I,M,true>::operator ()(void)const{ returni(); } template<classI,classM> forceinlinevoid Map<I,M,true>::operator ++(void){ ++i; } template<classI,classM> forceinlineint Map<I,M,true>::min(void)const{ returnm.min(i.min()); } template<classI,classM> forceinlineint Map<I,M,true>::max(void)const{ returnm.max(i.max()); } template<classI,classM> forceinlineunsignedint Map<I,M,true>::width(void)const{ returnstatic_cast<unsignedint>(max()-min())+1; } }}} //STATISTICS:iter-any