set-op.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
00035
00036
00037
00038 namespace Gecode { namespace Int { namespace Sequence {
00039
00041 enum TakesStatus {
00042 TS_NO,
00043 TS_YES,
00044 TS_MAYBE
00045 };
00046
00048 template<class View>
00049 forceinline TakesStatus
00050 takes(const View& x, int s) {
00051 if (x.in(s))
00052 return x.assigned() ? TS_YES : TS_MAYBE;
00053 else
00054 return TS_NO;
00055 }
00057 template<class View>
00058 forceinline TakesStatus
00059 takes(const View& x, const IntSet& s) {
00060 if ((x.max() < s.min()) || (x.min() > s.max()))
00061 return TS_NO;
00062 ViewRanges<View> ix(x);
00063 IntSetRanges is(s);
00064 switch (Iter::Ranges::compare(ix,is)) {
00065 case Iter::Ranges::CS_SUBSET: return TS_YES;
00066 case Iter::Ranges::CS_DISJOINT: return TS_NO;
00067 case Iter::Ranges::CS_NONE: return TS_MAYBE;
00068 default: GECODE_NEVER;
00069 }
00070 return TS_MAYBE;
00071 }
00072
00074 template<class View>
00075 forceinline bool
00076 includes(const View& x, int s) {
00077 return x.assigned() && x.in(s);
00078 }
00080 template<class View>
00081 forceinline bool
00082 includes(const View& x, const IntSet& s) {
00083 if ((x.max() < s.min()) || (x.min() > s.max()))
00084 return false;
00085 ViewRanges<View> ix(x);
00086 IntSetRanges is(s);
00087 return Iter::Ranges::subset(ix,is);
00088 }
00089
00091 template<class View>
00092 forceinline bool
00093 excludes(const View& x, int s) {
00094 return !x.in(s);
00095 }
00097 template<class View>
00098 forceinline bool
00099 excludes(const View& x, const IntSet& s) {
00100 if ((x.max() < s.min()) || (x.min() > s.max()))
00101 return true;
00102 ViewRanges<View> ix(x);
00103 IntSetRanges is(s);
00104 return Iter::Ranges::disjoint(ix,is);
00105 }
00106
00108 template<class View>
00109 forceinline bool
00110 undecided(const View& x, int s) {
00111 return !x.assigned() && x.in(s);
00112 }
00114 template<class View>
00115 forceinline bool
00116 undecided(const View& x, const IntSet& s) {
00117 if ((x.max() < s.min()) || (x.min() > s.max()))
00118 return false;
00119 ViewRanges<View> ix(x);
00120 IntSetRanges is(s);
00121 return Iter::Ranges::compare(ix,is) == Iter::Ranges::CS_NONE;
00122 }
00123
00125 template<class View>
00126 forceinline ModEvent
00127 include(Space& home, View& x, int s) {
00128 return x.eq(home,s);
00129 }
00131 template<class View>
00132 forceinline ModEvent
00133 include(Space& home, View& x, const IntSet& s) {
00134 IntSetRanges is(s);
00135 return x.inter_r(home,is,false);
00136 }
00137
00139 template<class View>
00140 forceinline ModEvent
00141 exclude(Space& home, View& x, int s) {
00142 return x.nq(home,s);
00143 }
00145 template<class View>
00146 forceinline ModEvent
00147 exclude(Space& home, View& x, const IntSet& s) {
00148 IntSetRanges is(s);
00149 return x.minus_r(home,is,false);
00150 }
00151
00152 }}}
00153
00154