bool.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 Int {
00035
00036
00037
00038
00039
00040 forceinline
00041 BoolVarImp::BoolVarImp(int n) {
00042 assert(bits() == 0);
00043 bits() |= (n << 1) | n;
00044 }
00045 forceinline
00046 BoolVarImp::BoolVarImp(Space& home, int min, int max)
00047 : BoolVarImpBase(home) {
00048 assert(bits() == 0);
00049 bits() |= (max << 1) | min;
00050 }
00051
00052
00053
00054
00055
00056
00057 forceinline BoolStatus
00058 BoolVarImp::status(void) const {
00059 return bits() & 3;
00060 }
00061 forceinline int
00062 BoolVarImp::min(void) const {
00063 return static_cast<int>(bits() & 1);
00064 }
00065 forceinline int
00066 BoolVarImp::max(void) const {
00067 return static_cast<int>((bits() & 2) >> 1);
00068 }
00069 forceinline int
00070 BoolVarImp::med(void) const {
00071 return min();
00072 }
00073
00074 forceinline int
00075 BoolVarImp::val(void) const {
00076 assert(status() != NONE);
00077 return min();
00078 }
00079
00080 forceinline bool
00081 BoolVarImp::range(void) const {
00082 return true;
00083 }
00084 forceinline bool
00085 BoolVarImp::assigned(void) const {
00086 return status() != NONE;
00087 }
00088
00089
00090 forceinline unsigned int
00091 BoolVarImp::width(void) const {
00092 return assigned() ? 1U : 2U;
00093 }
00094
00095 forceinline unsigned int
00096 BoolVarImp::size(void) const {
00097 return assigned() ? 1U : 2U;
00098 }
00099
00100 forceinline unsigned int
00101 BoolVarImp::regret_min(void) const {
00102 return assigned() ? 1U : 0U;
00103 }
00104 forceinline unsigned int
00105 BoolVarImp::regret_max(void) const {
00106 return assigned() ? 1U : 0U;
00107 }
00108
00109
00110
00111
00112
00113
00114
00115
00116 forceinline bool
00117 BoolVarImp::in(int n) const {
00118 return (n >= min()) && (n <= max());
00119 }
00120 forceinline bool
00121 BoolVarImp::in(long long int n) const {
00122 return (n >= min()) && (n <= max());
00123 }
00124
00125
00126
00127
00128
00129
00130 forceinline bool
00131 BoolVarImp::zero(void) const {
00132 return status() < NONE;
00133 }
00134 forceinline bool
00135 BoolVarImp::one(void) const {
00136 return status() > NONE;
00137 }
00138 forceinline bool
00139 BoolVarImp::none(void) const {
00140 return status() == NONE;
00141 }
00142
00143
00144
00145
00146
00147
00148 forceinline ModEvent
00149 BoolVarImp::modevent(const Delta&) {
00150 return ME_BOOL_VAL;
00151 }
00152 forceinline int
00153 BoolVarImp::min(const Delta& d) {
00154 return static_cast<const IntDelta&>(d).min();
00155 }
00156 forceinline int
00157 BoolVarImp::max(const Delta& d) {
00158 return static_cast<const IntDelta&>(d).min();
00159 }
00160 forceinline unsigned int
00161 BoolVarImp::width(const Delta& d) {
00162 return static_cast<const IntDelta&>(d).width();
00163 }
00164 forceinline bool
00165 BoolVarImp::any(const Delta&) {
00166 return false;
00167 }
00168 forceinline bool
00169 BoolVarImp::zero(const Delta& d) {
00170 return static_cast<const IntDelta&>(d).min() != 0;
00171 }
00172 forceinline bool
00173 BoolVarImp::one(const Delta& d) {
00174 return static_cast<const IntDelta&>(d).min() == 0;
00175 }
00176
00177
00178
00179
00180
00181
00182 forceinline ModEvent
00183 BoolVarImp::zero(Space& home) {
00184 if (one()) return ME_BOOL_FAILED;
00185 if (zero()) return ME_BOOL_NONE;
00186 return zero_none(home);
00187 }
00188 forceinline ModEvent
00189 BoolVarImp::one(Space& home) {
00190 if (one()) return ME_BOOL_NONE;
00191 if (zero()) return ME_BOOL_FAILED;
00192 return one_none(home);
00193 }
00194
00195
00196
00197
00198
00199
00200 forceinline ModEvent
00201 BoolVarImp::gq(Space& home, int n) {
00202 if (n <= 0) return ME_INT_NONE;
00203 if (n > 1) return fail(home);
00204 return one(home);
00205 }
00206 forceinline ModEvent
00207 BoolVarImp::gq(Space& home, long long int n) {
00208 if (n <= 0) return ME_INT_NONE;
00209 if (n > 1) return fail(home);
00210 return one(home);
00211 }
00212
00213 forceinline ModEvent
00214 BoolVarImp::lq(Space& home, int n) {
00215 if (n < 0) return fail(home);
00216 if (n >= 1) return ME_INT_NONE;
00217 return zero(home);
00218 }
00219 forceinline ModEvent
00220 BoolVarImp::lq(Space& home, long long int n) {
00221 if (n < 0) return fail(home);
00222 if (n >= 1) return ME_INT_NONE;
00223 return zero(home);
00224 }
00225
00226 forceinline ModEvent
00227 BoolVarImp::eq(Space& home, int n) {
00228 if ((n < 0) || (n > 1)) return fail(home);
00229 return (n == 0) ? zero(home): one(home);
00230 }
00231 forceinline ModEvent
00232 BoolVarImp::eq(Space& home, long long int n) {
00233 if ((n < 0) || (n > 1)) return fail(home);
00234 return (n == 0) ? zero(home): one(home);
00235 }
00236
00237 forceinline ModEvent
00238 BoolVarImp::nq(Space& home, int n) {
00239 if ((n < 0) || (n > 1)) return ME_INT_NONE;
00240 return (n == 0) ? one(home): zero(home);
00241 }
00242 forceinline ModEvent
00243 BoolVarImp::nq(Space& home, long long int n) {
00244 if ((n < 0) || (n > 1)) return ME_INT_NONE;
00245 return (n == 0) ? one(home): zero(home);
00246 }
00247
00248
00249
00250
00251
00252
00253
00254 forceinline
00255 BoolVarImp::BoolVarImp(Space& home, BoolVarImp& x)
00256 : BoolVarImpBase(home,x) {}
00257 forceinline BoolVarImp*
00258 BoolVarImp::copy(Space& home) {
00259 if (copied())
00260 return static_cast<BoolVarImp*>(forward());
00261 else if (zero())
00262 return &s_zero;
00263 else if (one())
00264 return &s_one;
00265 else
00266 return new (home) BoolVarImp(home,*this);
00267 }
00268
00269
00270
00271
00272
00273
00274 template<class I>
00275 forceinline ModEvent
00276 BoolVarImp::narrow_r(Space& home, I& i, bool) {
00277
00278 if (!i())
00279 return fail(home);
00280 assert((i.min() == 0) || (i.min() == 1));
00281 assert((i.max() == 0) || (i.max() == 1));
00282 if (i.max() == 0) {
00283 assert(!one());
00284
00285 return zero(home);
00286 }
00287 if (i.min() == 1) {
00288
00289 assert(!zero());
00290 return one(home);
00291 }
00292 assert(none());
00293 return ME_INT_NONE;
00294 }
00295 template<class I>
00296 forceinline ModEvent
00297 BoolVarImp::inter_r(Space& home, I& i, bool) {
00298
00299 while (i() && (i.max() < 0))
00300 ++i;
00301
00302 if (!i() || (i.min() > 1))
00303 return fail(home);
00304 assert(i.min() <= 1);
00305 if (i.min() == 1)
00306 return one(home);
00307 if (i.max() == 0)
00308 return zero(home);
00309 assert((i.min() <= 0) && (i.max() >= 1));
00310 return ME_INT_NONE;
00311 }
00312 template<class I>
00313 forceinline ModEvent
00314 BoolVarImp::minus_r(Space& home, I& i, bool) {
00315
00316 while (i() && (i.max() < 0))
00317 ++i;
00318
00319 if (!i() || (i.min() > 1))
00320 return ME_INT_NONE;
00321 assert(i.min() <= 1);
00322 if (i.min() == 1)
00323 return zero(home);
00324 if (i.max() == 0)
00325 return one(home);
00326 assert((i.min() <= 0) && (i.max() >= 1));
00327 return fail(home);
00328 }
00329
00330 template<class I>
00331 forceinline ModEvent
00332 BoolVarImp::narrow_v(Space& home, I& i, bool) {
00333 if (!i())
00334 return fail(home);
00335 if (!none())
00336 return ME_INT_NONE;
00337 if (i.val() == 0) {
00338 do {
00339 ++i;
00340 } while (i() && (i.val() == 0));
00341 if (!i())
00342 return zero_none(home);
00343 return ME_INT_NONE;
00344 } else {
00345 assert(i.val() == 1);
00346 return one_none(home);
00347 }
00348 }
00349 template<class I>
00350 forceinline ModEvent
00351 BoolVarImp::inter_v(Space& home, I& i, bool) {
00352 while (i() && (i.val() < 0))
00353 ++i;
00354 if (!i() || (i.val() > 1))
00355 return fail(home);
00356 if (i.val() == 0) {
00357 do {
00358 ++i;
00359 } while (i() && (i.val() == 0));
00360 if (!i() || (i.val() > 1))
00361 return zero(home);
00362 return ME_INT_NONE;
00363 } else {
00364 assert(i.val() == 1);
00365 return one(home);
00366 }
00367 }
00368 template<class I>
00369 forceinline ModEvent
00370 BoolVarImp::minus_v(Space& home, I& i, bool) {
00371 while (i() && (i.val() < 0))
00372 ++i;
00373 if (!i() || (i.val() > 1))
00374 return ME_INT_NONE;
00375 if (i.val() == 0) {
00376 do {
00377 ++i;
00378 } while (i() && (i.val() == 0));
00379 if (!i() || (i.val() > 1))
00380 return one(home);
00381 return fail(home);
00382 } else {
00383 assert(i.val() == 1);
00384 return zero(home);
00385 }
00386 }
00387
00388
00389
00390
00391
00392
00393
00394 forceinline void
00395 BoolVarImp::cancel(Space& home, Propagator& p, PropCond) {
00396 BoolVarImpBase::cancel(home,p,PC_BOOL_VAL);
00397 }
00398
00399 forceinline void
00400 BoolVarImp::cancel(Space& home, Advisor& a, bool fail) {
00401 BoolVarImpBase::cancel(home,a,fail);
00402 }
00403
00404 forceinline void
00405 BoolVarImp::schedule(Space& home, Propagator& p, ModEvent) {
00406 BoolVarImpBase::schedule(home,p,ME_BOOL_VAL);
00407 }
00408
00409 forceinline ModEventDelta
00410 BoolVarImp::med(ModEvent me) {
00411 return BoolVarImpBase::med(me);
00412 }
00413
00414 }}
00415
00416