values-map.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 namespace Gecode { namespace Iter { namespace Values {
00035
00044 template<class I, class M, bool strict=false>
00045 class Map {
00046 protected:
00048 I i;
00050 M m;
00051 public:
00053
00054
00055 Map(void);
00057 Map(I& i);
00059 Map(I& i, const M& m);
00061 void init(I& i);
00063 void init(I& i, const M& m);
00065
00067
00068
00069 bool operator ()(void) const;
00071 void operator ++(void);
00073
00075
00076
00077 int val(void) const;
00079 };
00080
00081
00082 template<class I, class M, bool strict>
00083 forceinline
00084 Map<I,M,strict>::Map(void) {}
00085
00086 template<class I, class M, bool strict>
00087 forceinline
00088 Map<I,M,strict>::Map(I& i0) : i(i0) {}
00089
00090 template<class I, class M, bool strict>
00091 forceinline
00092 Map<I,M,strict>::Map(I& i0, const M& m0) : i(i0), m(m0) {}
00093
00094 template<class I, class M, bool strict>
00095 forceinline void
00096 Map<I,M,strict>::init(I& i0) {
00097 i=i0;
00098 }
00099
00100 template<class I, class M, bool strict>
00101 forceinline void
00102 Map<I,M,strict>::init(I& i0, const M& m0) {
00103 i=i0; m=m0;
00104 }
00105
00106 template<class I, class M, bool strict>
00107 forceinline void
00108 Map<I,M,strict>::operator ++(void) {
00109 if (strict) {
00110 ++i;
00111 } else {
00112 int n=m.val(i.val());
00113 do {
00114 ++i;
00115 } while (i() && (n == m.val(i.val())));
00116 }
00117 }
00118 template<class I, class M, bool strict>
00119 forceinline bool
00120 Map<I,M,strict>::operator ()(void) const {
00121 return i();
00122 }
00123
00124 template<class I, class M, bool strict>
00125 forceinline int
00126 Map<I,M,strict>::val(void) const {
00127 return m.val(i.val());
00128 }
00129
00130 }}}
00131
00132