this repo has no description
1/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ 2/* 3 * Main authors: 4 * Guido Tack <tack@gecode.org> 5 * Christian Schulte <schulte@gecode.org> 6 * 7 * Copyright: 8 * Guido Tack, 2004 9 * Christian Schulte, 2004 10 * 11 * This file is part of Gecode, the generic constraint 12 * development environment: 13 * http://www.gecode.org 14 * 15 * Permission is hereby granted, free of charge, to any person obtaining 16 * a copy of this software and associated documentation files (the 17 * "Software"), to deal in the Software without restriction, including 18 * without limitation the rights to use, copy, modify, merge, publish, 19 * distribute, sublicense, and/or sell copies of the Software, and to 20 * permit persons to whom the Software is furnished to do so, subject to 21 * the following conditions: 22 * 23 * The above copyright notice and this permission notice shall be 24 * included in all copies or substantial portions of the Software. 25 * 26 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 27 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 28 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 29 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 30 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 31 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 32 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 33 * 34 */ 35 36#include <gecode/set/element.hh> 37 38namespace Gecode { 39 40 namespace Int { 41 template<> 42 /// VarArg type for constant %Set views 43 class ViewToVarArg<Gecode::Set::ConstSetView> { 44 public: 45 typedef IntSetArgs argtype; 46 }; 47 } 48 49 using namespace Gecode::Set; 50 51 void 52 element(Home home, SetOpType op, const SetVarArgs& x, SetVar y, SetVar z, 53 const IntSet& universe) { 54 GECODE_POST; 55 56 switch (op) { 57 case SOT_DUNION: 58 { 59 Set::Element::ElementDisjoint<SetView,SetView>::IdxViewArray 60 iv(home, x); 61 GECODE_ES_FAIL((Element::ElementDisjoint<SetView,SetView>:: 62 post(home,iv,y))); 63 } 64 // fall through 65 case SOT_UNION: 66 { 67 Set::Element::ElementUnion<SetView,SetView,SetView>::IdxViewArray 68 iv(home, x); 69 GECODE_ES_FAIL( 70 (Element::ElementUnion<SetView,SetView,SetView>:: 71 post(home,iv,y,z))); 72 } 73 break; 74 case SOT_INTER: 75 { 76 Set::Element::ElementIntersection<SetView,SetView,SetView>::IdxViewArray 77 iv(home, x); 78 GECODE_ES_FAIL( 79 (Element::ElementIntersection<SetView,SetView,SetView>:: 80 post(home,iv,y,z,universe))); 81 } 82 break; 83 case SOT_MINUS: 84 throw IllegalOperation("Set::element"); 85 break; 86 default: 87 throw UnknownOperation("Set::element"); 88 } 89 } 90 91 void 92 element(Home home, SetOpType op, const IntVarArgs& x, SetVar y, SetVar z, 93 const IntSet& universe) { 94 GECODE_POST; 95 96 switch (op) { 97 case SOT_DUNION: 98 { 99 Set::Element::ElementDisjoint<SingletonView,SetView>::IdxViewArray 100 iv(home, x); 101 GECODE_ES_FAIL((Element::ElementDisjoint<SingletonView,SetView> 102 ::post(home,iv,y))); 103 } 104 // fall through 105 case SOT_UNION: 106 { 107 Set::Element::ElementUnion<SingletonView,SetView,SetView>::IdxViewArray 108 iv(home, x); 109 GECODE_ES_FAIL( 110 (Element::ElementUnion<SingletonView,SetView,SetView>:: 111 post(home,iv,y,z))); 112 } 113 break; 114 case SOT_INTER: 115 { 116 Set::Element::ElementIntersection<SingletonView,SetView, 117 SetView>::IdxViewArray iv(home, x); 118 GECODE_ES_FAIL( 119 (Element::ElementIntersection<SingletonView,SetView, 120 SetView>::post(home,iv,y,z,universe))); 121 } 122 break; 123 case SOT_MINUS: 124 throw IllegalOperation("Set::element"); 125 break; 126 default: 127 throw UnknownOperation("Set::element"); 128 } 129 } 130 131 void 132 element(Home home, SetOpType op, const IntSetArgs& x, SetVar y, SetVar z, 133 const IntSet& universe) { 134 GECODE_POST; 135 136 switch (op) { 137 case SOT_DUNION: 138 { 139 Set::Element::ElementDisjoint<ConstSetView,SetView>::IdxViewArray 140 iv(home, x.size()); 141 for (int i=x.size(); i--;) { 142 iv[i].idx = i; iv[i].view = ConstSetView(home, x[i]); 143 } 144 GECODE_ES_FAIL((Element::ElementDisjoint<ConstSetView,SetView>:: 145 post(home,iv,y))); 146 } 147 // fall through 148 case SOT_UNION: 149 { 150 GECODE_ES_FAIL( 151 (Element::ElementUnionConst<SetView,SetView>:: 152 post(home,z,x,y))); 153 } 154 break; 155 case SOT_INTER: 156 { 157 Set::Element::ElementIntersection<ConstSetView, 158 SetView,SetView>::IdxViewArray iv(home, x.size()); 159 for (int i=x.size(); i--;) { 160 iv[i].idx = i; iv[i].view = ConstSetView(home, x[i]); 161 } 162 GECODE_ES_FAIL( 163 (Element::ElementIntersection<ConstSetView,SetView,SetView>:: 164 post(home,iv,y,z,universe))); 165 } 166 break; 167 case SOT_MINUS: 168 throw IllegalOperation("Set::element"); 169 break; 170 default: 171 throw UnknownOperation("Set::element"); 172 } 173 174 } 175 176 void 177 element(Home home, SetOpType op, const IntArgs& x, SetVar y, SetVar z, 178 const IntSet& universe) { 179 IntSetArgs xs(x.size()); 180 for (int i=x.size(); i--;) 181 xs[i]=IntSet(x[i],x[i]); 182 element(home,op,xs,y,z,universe); 183 } 184 185 void 186 element(Home home, const SetVarArgs& x, IntVar y, SetVar z) { 187 if (x.size() == 0) 188 throw Set::TooFewArguments("Set::element"); 189 GECODE_POST; 190 Set::Element::ElementUnion<SetView,SingletonView,SetView>::IdxViewArray 191 iv(home, x); 192 SetView zv(z); 193 194 Int::IntView yv(y); 195 SingletonView single(yv); 196 GECODE_ES_FAIL((Element::ElementUnion<SetView,SingletonView,SetView> 197 ::post(home, iv, single,zv))); 198 } 199 200 void 201 element(Home home, const IntSetArgs& x, IntVar y, SetVar z) { 202 if (x.size() == 0) 203 throw Set::TooFewArguments("Set::element"); 204 for (int i=x.size(); i--;) 205 Set::Limits::check(x[i], "Set::element"); 206 GECODE_POST; 207 SetView zv(z); 208 209 Int::IntView yv(y); 210 SingletonView single(yv); 211 GECODE_ES_FAIL((Element::ElementUnionConst<SetView, 212 SingletonView>::post(home, z, x, single))); 213 } 214 215 216 namespace { 217 IntVar 218 pair(Home home, IntVar x, int w, IntVar y, int h) { 219 IntVar xy(home,0,w*h-1); 220 if (Int::Element::Pair::post(home,x,y,xy,w,h) != ES_OK) 221 home.fail(); 222 return xy; 223 } 224 } 225 226 void 227 element(Home home, const IntSetArgs& a, 228 IntVar x, int w, IntVar y, int h, SetVar z) { 229 if (a.size() == 0) 230 throw Set::TooFewArguments("Set::element"); 231 if (a.size() != w*h) 232 throw Set::ArgumentSizeMismatch("Set::element"); 233 GECODE_POST; 234 element(home, a, pair(home,x,w,y,h), z); 235 } 236 237 void 238 element(Home home, const SetVarArgs& a, 239 IntVar x, int w, IntVar y, int h, SetVar z) { 240 if (a.size() == 0) 241 throw Set::TooFewArguments("Set::element"); 242 if (a.size() != w*h) 243 throw Set::ArgumentSizeMismatch("Set::element"); 244 GECODE_POST; 245 element(home, a, pair(home,x,w,y,h), z); 246 } 247 248} 249 250// STATISTICS: set-post 251