ranges-compl.icc
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
00035
00036
00037
00038
00039
00040 namespace Gecode { namespace Iter { namespace Ranges {
00041
00052 template <int UMIN, int UMAX, class I>
00053 class Compl : public MinMax {
00054 protected:
00056 I i;
00058 void start(void);
00059 public:
00061
00062
00063 Compl(void);
00065 Compl(I& i);
00067 void init(I& i);
00069
00071
00072
00073 void operator++(void);
00075 };
00076
00077
00088 template <class I>
00089 class ComplVal : public MinMax {
00090 protected:
00092 int UMIN, UMAX;
00094 I i;
00096 void start(void);
00097 public:
00099
00100
00101 ComplVal(void);
00103 ComplVal(int umin, int umax, I& i);
00105 void init(int umin, int umax, I& i);
00107
00109
00110
00111 void operator++(void);
00113 };
00114
00115
00116 template <int UMIN, int UMAX, class I>
00117 forceinline void
00118 Compl<UMIN,UMAX,I>::start(void) {
00119 if (i()) {
00120 assert((i.min() >= UMIN) && (i.max() <= UMAX));
00121 if (i.min() > UMIN) {
00122 mi = UMIN;
00123 ma = i.min()-1;
00124 } else if (i.max() < UMAX) {
00125 mi = i.max()+1;
00126 ++i;
00127 ma = i() ? (i.min()-1) : UMAX;
00128 } else {
00129 finish();
00130 }
00131 } else {
00132 mi = UMIN;
00133 ma = UMAX;
00134 }
00135 }
00136
00137 template <int UMIN, int UMAX, class I>
00138 forceinline
00139 Compl<UMIN,UMAX,I>::Compl(void) {}
00140
00141 template <int UMIN, int UMAX, class I>
00142 forceinline
00143 Compl<UMIN,UMAX,I>::Compl(I& i0) : i(i0) {
00144 start();
00145 }
00146
00147 template <int UMIN, int UMAX, class I>
00148 forceinline void
00149 Compl<UMIN,UMAX,I>::init(I& i0) {
00150 i=i0; start();
00151 }
00152
00153 template <int UMIN, int UMAX, class I>
00154 forceinline void
00155 Compl<UMIN,UMAX,I>::operator++(void) {
00156 assert(!i() || (i.max() <= UMAX));
00157 if (i() && (i.max() < UMAX)) {
00158 mi = i.max()+1;
00159 ++i;
00160 ma = i() ? (i.min()-1) : UMAX;
00161 } else {
00162 finish();
00163 }
00164 }
00165
00166 template <class I>
00167 forceinline void
00168 ComplVal<I>::start(void) {
00169 if (i()) {
00170 assert((i.min() >= UMIN) && (i.max() <= UMAX));
00171 if (i.min() > UMIN) {
00172 mi = UMIN;
00173 ma = i.min()-1;
00174 } else if (i.max() < UMAX) {
00175 mi = i.max()+1;
00176 ++i;
00177 ma = i() ? (i.min()-1) : UMAX;
00178 } else {
00179 finish();
00180 }
00181 } else {
00182 mi = UMIN;
00183 ma = UMAX;
00184 }
00185 }
00186
00187 template <class I>
00188 forceinline
00189 ComplVal<I>::ComplVal(void) {}
00190
00191 template <class I>
00192 forceinline
00193 ComplVal<I>::ComplVal(int umin, int umax, I& i0)
00194 : UMIN(umin), UMAX(umax), i(i0) {
00195 start();
00196 }
00197
00198 template <class I>
00199 forceinline void
00200 ComplVal<I>::init(int umin, int umax, I& i0) {
00201 UMIN=umin; UMAX=umax; i=i0; start();
00202 }
00203
00204 template <class I>
00205 forceinline void
00206 ComplVal<I>::operator++(void) {
00207 assert(!i() || (i.max() <= UMAX));
00208 if (i() && (i.max() < UMAX)) {
00209 mi = i.max()+1;
00210 ++i;
00211 ma = i() ? (i.min()-1) : UMAX;
00212 } else {
00213 finish();
00214 }
00215 }
00216
00217 }}}
00218
00219
00220