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 namespace Gecode { namespace Iter { namespace Ranges {
00025
00037 template <int UMIN, int UMAX, class I>
00038 class Compl : public MinMax {
00039 protected:
00041 I i;
00043 void start(void);
00044 public:
00046
00047
00048 Compl(void);
00050 Compl(I& i);
00052 void init(I& i);
00054
00056
00057
00058 void operator++(void);
00060 };
00061
00062
00074 template <class I>
00075 class ComplVal : public MinMax {
00076 protected:
00078 int UMIN, UMAX;
00080 I i;
00082 void start(void);
00083 public:
00085
00086
00087 ComplVal(void);
00089 ComplVal(int umin, int umax, I& i);
00091 void init(int umin, int umax, I& i);
00093
00095
00096
00097 void operator++(void);
00099 };
00100
00101
00102 template <int UMIN, int UMAX, class I>
00103 forceinline void
00104 Compl<UMIN,UMAX,I>::start(void) {
00105 if (i()) {
00106 assert((i.min() >= UMIN) && (i.max() <= UMAX));
00107 if (i.min() > UMIN) {
00108 mi = UMIN;
00109 ma = i.min()-1;
00110 } else if (i.max() < UMAX) {
00111 mi = i.max()+1;
00112 ++i;
00113 ma = i() ? (i.min()-1) : UMAX;
00114 } else {
00115 finish();
00116 }
00117 } else {
00118 mi = UMIN;
00119 ma = UMAX;
00120 }
00121 }
00122
00123 template <int UMIN, int UMAX, class I>
00124 forceinline
00125 Compl<UMIN,UMAX,I>::Compl(void) {}
00126
00127 template <int UMIN, int UMAX, class I>
00128 forceinline
00129 Compl<UMIN,UMAX,I>::Compl(I& i0) : i(i0) {
00130 start();
00131 }
00132
00133 template <int UMIN, int UMAX, class I>
00134 forceinline void
00135 Compl<UMIN,UMAX,I>::init(I& i0) {
00136 i=i0; start();
00137 }
00138
00139 template <int UMIN, int UMAX, class I>
00140 forceinline void
00141 Compl<UMIN,UMAX,I>::operator++(void) {
00142 assert(!i() || (i.max() <= UMAX));
00143 if (i() && (i.max() < UMAX)) {
00144 mi = i.max()+1;
00145 ++i;
00146 ma = i() ? (i.min()-1) : UMAX;
00147 } else {
00148 finish();
00149 }
00150 }
00151
00152 template <class I>
00153 forceinline void
00154 ComplVal<I>::start(void) {
00155 if (i()) {
00156 assert((i.min() >= UMIN) && (i.max() <= UMAX));
00157 if (i.min() > UMIN) {
00158 mi = UMIN;
00159 ma = i.min()-1;
00160 } else if (i.max() < UMAX) {
00161 mi = i.max()+1;
00162 ++i;
00163 ma = i() ? (i.min()-1) : UMAX;
00164 } else {
00165 finish();
00166 }
00167 } else {
00168 mi = UMIN;
00169 ma = UMAX;
00170 }
00171 }
00172
00173 template <class I>
00174 forceinline
00175 ComplVal<I>::ComplVal(void) {}
00176
00177 template <class I>
00178 forceinline
00179 ComplVal<I>::ComplVal(int umin, int umax, I& i0)
00180 : UMIN(umin), UMAX(umax), i(i0) {
00181 start();
00182 }
00183
00184 template <class I>
00185 forceinline void
00186 ComplVal<I>::init(int umin, int umax, I& i0) {
00187 UMIN=umin; UMAX=umax; i=i0; start();
00188 }
00189
00190 template <class I>
00191 forceinline void
00192 ComplVal<I>::operator++(void) {
00193 assert(!i() || (i.max() <= UMAX));
00194 if (i() && (i.max() < UMAX)) {
00195 mi = i.max()+1;
00196 ++i;
00197 ma = i() ? (i.min()-1) : UMAX;
00198 } else {
00199 finish();
00200 }
00201 }
00202
00203 }}}
00204
00205
00206