| 44 | using namespace Gecode::Set::RelOp; |
| 45 | |
| 46 | void |
| 47 | rel(Home home, SetVar x, SetOpType op, const IntSet& y, SetRelType r, |
| 48 | const IntSet& z) { |
| 49 | Set::Limits::check(y, "Set::rel"); |
| 50 | Set::Limits::check(z, "Set::rel"); |
| 51 | ConstSetView yv(home, y); |
| 52 | ConstSetView zv(home, z); |
| 53 | |
| 54 | if (op==SOT_MINUS) { |
| 55 | switch (r) { |
| 56 | case SRT_EQ: |
| 57 | { |
| 58 | GlbRanges<ConstSetView> yr(yv); |
| 59 | RangesCompl<GlbRanges<ConstSetView> > yrc(yr); |
| 60 | IntSet yc(yrc); |
| 61 | ConstSetView cy(home, yc); |
| 62 | GECODE_ES_FAIL( |
| 63 | (Intersection<ConstSetView, |
| 64 | SetView,ConstSetView> |
| 65 | ::post(home,cy,x,zv))); |
| 66 | } |
| 67 | break; |
| 68 | case SRT_LQ: case SRT_LE: case SRT_GQ: case SRT_GR: |
| 69 | { |
| 70 | GlbRanges<ConstSetView> yr(yv); |
| 71 | RangesCompl<GlbRanges<ConstSetView> > yrc(yr); |
| 72 | IntSet yc(yrc); |
| 73 | ConstSetView cy(home, yc); |
| 74 | SetVar tmp(home,IntSet::empty,Set::Limits::min,Set::Limits::max); |
| 75 | GECODE_ES_FAIL( |
| 76 | (Intersection<ConstSetView, |
| 77 | SetView,SetView> |
| 78 | ::post(home,cy,x,tmp))); |
| 79 | dom(home,tmp,r,z); |
| 80 | } |
| 81 | break; |
| 82 | case SRT_NQ: |
| 83 | { |
| 84 | SetVar tmp(home); |
| 85 | GECODE_ES_FAIL( |
| 86 | (Distinct<SetView,ConstSetView> |
| 87 | ::post(home,tmp,zv))); |
| 88 | GlbRanges<ConstSetView> yr(yv); |
| 89 | RangesCompl<GlbRanges<ConstSetView> > yrc(yr); |
| 90 | IntSet yc(yrc); |
| 91 | ConstSetView cy(home, yc); |
| 92 | GECODE_ES_FAIL( |
| 93 | (Intersection<ConstSetView, |
| 94 | SetView,SetView> |
| 95 | ::post(home,cy,x,tmp))); |
| 96 | } |
| 97 | break; |
| 98 | case SRT_SUB: |
| 99 | { |
| 100 | GlbRanges<ConstSetView> yr(yv); |
| 101 | RangesCompl<GlbRanges<ConstSetView> > yrc(yr); |
| 102 | IntSet yc(yrc); |
| 103 | ConstSetView cy(home, yc); |