inline ExecStatus Prop<View>::post(Home home, ViewArray<View>& x, View y) { if (x.size() == 0) return ES_FAILED; x.unique(home); if (x.size() == 1) return Rel::EqDom<View,View>::post(home,x[0],y); if (x.same(home,y)) return ES_OK; // Eliminate assigned views and store them into the value set ValSet vs; add(home, vs, x); if (x.size() == 0) { ValSet::Ranges vsr(vs); GECODE_ME_CHECK(y.inter_r(home,vsr,false)); return ES_OK; } (void) new (home) Prop<View>(home, vs, x, y); return ES_OK; }
inline ExecStatus ReProp<View,rm>::post(Home home, ViewArray<View>& x, View y, BoolView b) { if (x.size() == 0) { if (rm != RM_PMI) GECODE_ME_CHECK(b.zero(home)); return ES_OK; } x.unique(home); if (x.size() == 1) return Rel::ReEqDom<View,BoolView,rm>::post(home,x[0],y,b); if (x.same(home,y)) { if (rm != RM_IMP) GECODE_ME_CHECK(b.one(home)); return ES_OK; } // Eliminate assigned views and store them into the value set ValSet vs; add(home, vs, x); switch (vs.compare(y)) { case Iter::Ranges::CS_SUBSET: if (rm != RM_IMP) GECODE_ME_CHECK(b.one(home)); return ES_OK; case Iter::Ranges::CS_DISJOINT: if (x.size() == 0) { if (rm != RM_PMI) GECODE_ME_CHECK(b.zero(home)); return ES_OK; } break; case Iter::Ranges::CS_NONE: break; default: GECODE_NEVER; } (void) new (home) ReProp<View,rm>(home, vs, x, y, b); return ES_OK; }