38 namespace Gecode {
namespace Int {
namespace Bool {
105 template<
class BVA,
class BVB>
110 template<
class BVA,
class BVB>
115 template<
class BVA,
class BVB>
121 template<
class BVA,
class BVB>
127 template<
class BVA,
class BVB>
139 }
else if (b1.zero()) {
141 }
else if (!b0.one() && !b1.one()) {
150 template<
class BVA,
class BVB>
153 #define GECODE_INT_STATUS(S0,S1) \
154 ((BVA::S0<<(1*BVA::BITS))|(BVB::S1<<(0*BVB::BITS)))
155 switch ((x0.status() << (1*BVA::BITS)) | (x1.status() << (0*BVB::BITS))) {
175 #undef GECODE_INT_STATUS
192 return sizeof(*this);
199 x2.update(home,share,p.
x2);
207 x2.update(home,share,b2);
213 assert(x0.none() && x1.none());
232 #define GECODE_INT_STATUS(S0,S1,S2) \
233 ((BV::S0<<(2*BV::BITS))|(BV::S1<<(1*BV::BITS))|(BV::S2<<(0*BV::BITS)))
234 switch ((x0.status() << (2*BV::BITS)) | (x1.status() << (1*BV::BITS)) |
235 (x2.status() << (0*BV::BITS))) {
241 std::swap(x1,x2); x1.subscribe(home,*
this,
PC_BOOL_VAL);
251 std::swap(x0,x2); x0.subscribe(home,*
this,
PC_BOOL_VAL);
279 #undef GECODE_INT_STATUS
290 :
BoolBinary<BV,BV>(home,b0,b1), x2(b2), x3(b3) {}
296 return sizeof(*this);
303 x2.update(home,share,p.
x2);
304 x3.update(home,share,p.
x3);
310 BV b0, BV b1, BV
b2, BV b3)
312 x2.update(home,share,b2);
313 x3.update(home,share,b3);
319 assert(x0.none() && x1.none());
320 if (x2.one() || x3.one())
322 else if (x2.zero() && x3.zero())
342 #define GECODE_INT_STATUS(S0,S1,S2,S3) \
343 ((BV::S0 << (3*BV::BITS)) | (BV::S1 << (2*BV::BITS)) | \
344 (BV::S2 << (1*BV::BITS)) | (BV::S3 << (0*BV::BITS)))
345 switch ((x0.status() << (3*BV::BITS)) | (x1.status() << (2*BV::BITS)) |
346 (x2.status() << (1*BV::BITS)) | (x3.status() << (0*BV::BITS))) {
359 std::swap(x1,x2); x1.subscribe(home,*
this,
PC_BOOL_VAL,
false);
364 std::swap(x1,x3); x1.subscribe(home,*
this,
PC_BOOL_VAL,
false);
384 std::swap(x0,x2); x0.subscribe(home,*
this,
PC_BOOL_VAL,
false);
389 std::swap(x0,x3); x0.subscribe(home,*
this,
PC_BOOL_VAL,
false);
399 std::swap(x0,x2); x0.subscribe(home,*
this,
PC_BOOL_VAL,
false);
400 std::swap(x1,x3); x1.subscribe(home,*
this,
PC_BOOL_VAL,
false);
455 #undef GECODE_INT_STATUS
463 template<
class BVA,
class BVB,
class BVC>
468 template<
class BVA,
class BVB,
class BVC>
473 template<
class BVA,
class BVB,
class BVC>
476 BVA b0, BVB b1, BVC
b2)
477 :
BoolTernary<BVA,BVB,BVC>(home,share,p,b0,b1,b2) {}
479 template<
class BVA,
class BVB,
class BVC>
483 assert(x0.none() && x1.none());
485 }
else if (x0.zero()) {
486 assert(x1.none() && x2.none());
487 return new (home)
Eq<BVB,BVC>(home,share,*
this,x1,x2);
488 }
else if (x1.zero()) {
489 assert(x0.none() && x2.none());
490 return new (home)
Eq<BVA,BVC>(home,share,*
this,x0,x2);
496 template<
class BVA,
class BVB,
class BVC>
502 }
else if (b2.one()) {
512 if (b0.one() || b1.one()) {
514 }
else if (b0.zero()) {
516 }
else if (b1.zero()) {
528 template<
class BVA,
class BVB,
class BVC>
531 #define GECODE_INT_STATUS(S0,S1,S2) \
532 ((BVA::S0<<(2*BVA::BITS))|(BVB::S1<<(1*BVB::BITS))|(BVC::S2<<(0*BVC::BITS)))
533 switch ((x0.status() << (2*BVA::BITS)) | (x1.status() << (1*BVB::BITS)) |
534 (x2.status() << (0*BVC::BITS))) {
607 #undef GECODE_INT_STATUS
619 assert(
x.
size() > 2);
645 x[0]=x[
i]; x.size(1);
647 }
else if (x[
i].zero()) {
657 return new (home)
TerOrTrue<BV>(home,share,*
this,x0,x1,x[0]);
659 return new (home)
QuadOrTrue<BV>(home,share,*
this,x0,x1,x[0],x[1]);
668 for (
int i=b.
size();
i--; )
671 else if (b[
i].zero())
677 }
else if (b.
size() == 2) {
679 }
else if (b.
size() == 3) {
681 }
else if (b.
size() == 4) {
693 return sizeof(*this);
704 }
else if (x[
i].zero()) {
708 x0=x[
i]; x[
i]=x[--n];
738 template<
class VX,
class VY>
746 template<
class VX,
class VY>
751 c.update(home,share,p.
c);
754 template<
class VX,
class VY>
757 assert(n_zero < x.size());
767 assert(n_zero < x.size());
771 template<
class VX,
class VY>
778 for (
int i=x.
size();
i--; )
782 for (
int i=x.
size();
i--; )
786 }
else if (x[
i].zero()) {
791 }
else if (x.
size() == 1) {
793 }
else if (x.
size() == 2) {
796 (void)
new (home)
NaryOr(home,x,y);
801 template<
class VX,
class VY>
807 template<
class VX,
class VY>
811 if (VX::zero(d) && (++n_zero < x.size()))
817 template<
class VX,
class VY>
825 return sizeof(*this);
828 template<
class VX,
class VY>
835 for (
int i = x.
size();
i--; )
837 }
else if (n_zero == x.size()) {