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 namespace Gecode { namespace Int { namespace Dom {
00039
00040 template <class View>
00041 forceinline
00042 ReIntSet<View>::ReIntSet
00043 (Space* home, View x, const IntSet& s, BoolView b)
00044 : ReUnaryPropagator<View,PC_INT_DOM,BoolView>(home,x,b), is(s) {
00045 Propagator::force(home);
00046 }
00047
00048 template <class View>
00049 forceinline size_t
00050 ReIntSet<View>::dispose(Space* home) {
00051 Propagator::unforce(home);
00052 is.~IntSet();
00053 (void) ReUnaryPropagator<View,PC_INT_DOM,BoolView>::dispose(home);
00054 return sizeof(*this);
00055 }
00056
00057 template <class View>
00058 ExecStatus
00059 ReIntSet<View>::post(Space* home, View x, const IntSet& s, BoolView b) {
00060 if (s.size() == 0) {
00061 GECODE_ME_CHECK(b.zero(home));
00062 } else if (s.size() == 1) {
00063 return ReRange<View>::post(home,x,s.min(),s.max(),b);
00064 } else {
00065 (void) new (home) ReIntSet<View>(home,x,s,b);
00066 }
00067 return ES_OK;
00068 }
00069
00070
00071 template <class View>
00072 forceinline
00073 ReIntSet<View>::ReIntSet(Space* home, bool share, ReIntSet& p)
00074 : ReUnaryPropagator<View,PC_INT_DOM,BoolView>(home,share,p) {
00075 is.update(home,share,p.is);
00076 }
00077
00078 template <class View>
00079 Actor*
00080 ReIntSet<View>::copy(Space* home, bool share) {
00081 return new (home) ReIntSet(home,share,*this);
00082 }
00083
00084 template <class View>
00085 inline Support::Symbol
00086 ReIntSet<View>::ati(void) {
00087 return Reflection::mangle<View>("Gecode::Int::Dom::ReIntSet");
00088 }
00089
00090 template <class View>
00091 Reflection::ActorSpec
00092 ReIntSet<View>::spec(const Space* home, Reflection::VarMap& m) const {
00093 Reflection::ActorSpec s =
00094 ReUnaryPropagator<View,PC_INT_DOM,BoolView>::spec(home, m, ati());
00095 int count=0;
00096 for (IntSetRanges isr(is); isr(); ++isr)
00097 count++;
00098 Reflection::IntArrayArg* a = Reflection::Arg::newIntArray(count*2);
00099 count = 0;
00100 for (IntSetRanges isr(is); isr(); ++isr) {
00101 (*a)[count++] = isr.min();
00102 (*a)[count++] = isr.max();
00103 }
00104 return s << a;
00105 }
00106
00107 template <class View>
00108 void
00109 ReIntSet<View>::post(Space* home, Reflection::VarMap& vars,
00110 const Reflection::ActorSpec& spec) {
00111 spec.checkArity(3);
00112 View x0(home, vars, spec[0]);
00113 BoolView b(home, vars, spec[1]);
00114 Reflection::IntArrayArgRanges r(spec[2]->toIntArray());
00115 (void) new (home) ReIntSet<View>(home, x0, IntSet(r), b);
00116 }
00117
00118 template <class View>
00119 ExecStatus
00120 ReIntSet<View>::propagate(Space* home, ModEventDelta) {
00121 IntSetRanges i_is(is);
00122 if (b.one()) {
00123 GECODE_ME_CHECK(x0.inter_r(home,i_is,false)); goto subsumed;
00124 }
00125 if (b.zero()) {
00126 GECODE_ME_CHECK(x0.minus_r(home,i_is,false)); goto subsumed;
00127 }
00128
00129 {
00130 ViewRanges<View> i_x(x0);
00131
00132 switch (Iter::Ranges::subsumes(i_is,i_x)) {
00133 case Iter::Ranges::SS_SUBSUMED:
00134 GECODE_ME_CHECK(b.one_none(home)); goto subsumed;
00135 case Iter::Ranges::SS_EMPTY:
00136 GECODE_ME_CHECK(b.zero_none(home)); goto subsumed;
00137 case Iter::Ranges::SS_NONE:
00138 break;
00139 default: GECODE_NEVER;
00140 }
00141 }
00142
00143 return ES_FIX;
00144 subsumed:
00145 return ES_SUBSUMED(this,home);
00146 }
00147
00148 }}}
00149
00150
00151