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 #include "gecode/set/element.hh"
00041
00042 namespace Gecode {
00043
00044 using namespace Gecode::Set;
00045
00046 void
00047 elementsUnion(Space* home, const SetVarArgs& x, SetVar y, SetVar z) {
00048 if (home->failed()) return;
00049 Set::Element::IdxViewArray<SetView> iv(home, x);
00050 GECODE_ES_FAIL(home,
00051 (Element::ElementUnion<SetView,SetView>::
00052 post(home,z,iv,y)));
00053 }
00054
00055 void
00056 elementsUnion(Space* home, const IntSetArgs& s, SetVar y, SetVar z) {
00057 SharedArray<IntSet> x(s.size());
00058 for (int i=s.size(); i--;)
00059 new (&x[i]) IntSet(s[i]);
00060 if (home->failed()) return;
00061 GECODE_ES_FAIL(home,
00062 (Element::ElementUnionConst<SetView,SetView>::
00063 post(home,z,x,y)));
00064 }
00065
00066 void
00067 elementsInter(Space* home, const SetVarArgs& x, SetVar y, SetVar z) {
00068 if (home->failed()) return;
00069 Set::Element::IdxViewArray<SetView> iv(home, x);
00070 IntSet universe(Set::Limits::min,
00071 Set::Limits::max);
00072 GECODE_ES_FAIL(home,
00073 (Element::ElementIntersection<SetView,SetView>::
00074 post(home,z,iv,y,universe)));
00075 }
00076
00077 void
00078 elementsInter(Space* home, const SetVarArgs& x, SetVar y, SetVar z,
00079 const IntSet& universe) {
00080 if (home->failed()) return;
00081 Set::Element::IdxViewArray<SetView> iv(home, x);
00082 GECODE_ES_FAIL(home,
00083 (Element::ElementIntersection<SetView,SetView>::
00084 post(home,z,iv,y,universe)));
00085 }
00086
00087 void
00088 elementsDisjoint(Space* home, const SetVarArgs& x, SetVar y) {
00089 if (home->failed()) return;
00090 Set::Element::IdxViewArray<SetView> iv(home, x);
00091 GECODE_ES_FAIL(home,Element::ElementDisjoint::post(home,iv,y));
00092 }
00093
00094 void
00095 element(Space* home, const SetVarArgs& x, IntVar y, SetVar z) {
00096 if (home->failed()) return;
00097 Set::Element::IdxViewArray<SetView > iv(home, x);
00098 SetView zv(z);
00099
00100 Int::IntView yv(y);
00101 SingletonView single(yv);
00102 GECODE_ES_FAIL(home,(Element::ElementUnion<SetView,
00103 SingletonView>::post(home, z, iv, single)));
00104 }
00105
00106 void
00107 element(Space* home, const IntSetArgs& s, IntVar y, SetVar z) {
00108 for (int i=s.size(); i--;)
00109 Set::Limits::check(s[i], "Set::element");
00110 if (home->failed()) return;
00111 SetView zv(z);
00112 SharedArray<IntSet> x(s.size());
00113 for (int i=s.size(); i--;)
00114 new (&x[i]) IntSet(s[i]);
00115
00116 Int::IntView yv(y);
00117 SingletonView single(yv);
00118 GECODE_ES_FAIL(home,(Element::ElementUnionConst<SetView,
00119 SingletonView>::post(home, z, x, single)));
00120 }
00121
00122 namespace {
00123 GECODE_REGISTER2(Element::ElementUnion<Gecode::Set::SetView, Gecode::Set::SingletonView>);
00124 GECODE_REGISTER2(Element::ElementUnion<Gecode::Set::SetView, Gecode::Set::SetView>);
00125 GECODE_REGISTER1(Element::ElementDisjoint);
00126 GECODE_REGISTER2(Element::ElementUnionConst<Gecode::Set::SetView, Gecode::Set::SingletonView>);
00127 GECODE_REGISTER2(Element::ElementUnionConst<Gecode::Set::SetView, Gecode::Set::SetView>);
00128 GECODE_REGISTER2(Element::ElementIntersection<Gecode::Set::SetView, Gecode::Set::SetView>);
00129
00130 }
00131
00132 }
00133
00134
00135