| 53 | |
| 54 | template<class OptTask, class Cap, class PL> |
| 55 | ExecStatus |
| 56 | OptProp<OptTask,Cap,PL>::post(Home home, Cap c, TaskArray<OptTask>& t) { |
| 57 | // Capacity must be nonnegative |
| 58 | GECODE_ME_CHECK(c.gq(home, 0)); |
| 59 | // Check for overload by single task and remove excluded tasks |
| 60 | int n=t.size(), m=0; |
| 61 | for (int i=n; i--; ) { |
| 62 | if (t[i].c() > c.max()) |
| 63 | GECODE_ME_CHECK(t[i].excluded(home)); |
| 64 | if (t[i].excluded()) |
| 65 | t[i]=t[--n]; |
| 66 | else if (t[i].mandatory()) |
| 67 | m++; |
| 68 | } |
| 69 | t.size(n); |
| 70 | if (t.size() < 2) { |
| 71 | if (t.size() == 1) { |
| 72 | if (t[0].mandatory()) { |
| 73 | GECODE_ME_CHECK(c.gq(home, t[0].c())); |
| 74 | return ES_OK; |
| 75 | } else if (c.min() >= t[0].c()) { |
| 76 | return ES_OK; |
| 77 | } |
| 78 | } else { |
| 79 | return ES_OK; |
| 80 | } |
| 81 | } |
| 82 | if (c.assigned() && (c.val() == 1)) { |
| 83 | TaskArray<typename TaskTraits<OptTask>::UnaryTask> mt(home,t.size()); |
| 84 | for (int i=0; i<t.size(); i++) |
| 85 | mt[i]=t[i]; |
| 86 | return Unary::OptProp<typename TaskTraits<OptTask>::UnaryTask,PL> |
| 87 | ::post(home,mt); |
| 88 | } |
| 89 | if (m == t.size()) { |
| 90 | TaskArray<typename TaskTraits<OptTask>::ManTask> mt(home,m); |
| 91 | for (int i=0; i<m; i++) |
| 92 | mt[i].init(t[i]); |
| 93 | return ManProp<typename TaskTraits<OptTask>::ManTask,Cap,PL> |
| 94 | ::post(home,c,mt); |
| 95 | } |
| 96 | (void) new (home) OptProp<OptTask,Cap,PL>(home,c,t); |
| 97 | return ES_OK; |
| 98 | } |
| 99 | |
| 100 | template<class OptTask, class Cap, class PL> |
| 101 | Actor* |