| 50 | } |
| 51 | |
| 52 | forceinline ExecStatus |
| 53 | LinkMulti::post(Home home, ViewArray<BoolView>& x, IntView y, int o) { |
| 54 | int n=x.size(); |
| 55 | GECODE_ME_CHECK(y.gq(home,o)); |
| 56 | GECODE_ME_CHECK(y.lq(home,o+n-1)); |
| 57 | assert(n > 0); |
| 58 | if (n == 1) { |
| 59 | GECODE_ME_CHECK(x[0].one(home)); |
| 60 | assert(y.val() == o); |
| 61 | } else if (y.assigned()) { |
| 62 | int j=y.val()-o; |
| 63 | GECODE_ME_CHECK(x[j].one(home)); |
| 64 | for (int i=0; i<j; i++) |
| 65 | GECODE_ME_CHECK(x[i].zero(home)); |
| 66 | for (int i=j+1; i<n; i++) |
| 67 | GECODE_ME_CHECK(x[i].zero(home)); |
| 68 | } else { |
| 69 | for (int i=0; i<n; i++) |
| 70 | if (x[i].one()) { |
| 71 | for (int j=0; j<i; j++) |
| 72 | GECODE_ME_CHECK(x[j].zero(home)); |
| 73 | for (int j=i+1; j<n; j++) |
| 74 | GECODE_ME_CHECK(x[j].zero(home)); |
| 75 | GECODE_ME_CHECK(y.eq(home,o+i)); |
| 76 | return ES_OK; |
| 77 | } else if (x[i].zero()) { |
| 78 | GECODE_ME_CHECK(y.nq(home,o+i)); |
| 79 | } |
| 80 | (void) new (home) LinkMulti(home,x,y,o); |
| 81 | } |
| 82 | return ES_OK; |
| 83 | } |
| 84 | |
| 85 | }}} |
| 86 | |