gecode » set » var

00001 /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ 00002 /* 00003 * Main authors: 00004 * Guido Tack <tack@gecode.org> 00005 * Christian Schulte <schulte@gecode.org> 00006 * Gabor Szokoli <szokoli@gecode.org> 00007 * 00008 * Copyright: 00009 * Guido Tack, 2004 00010 * Christian Schulte, 2004 00011 * Gabor Szokoli, 2004 00012 * 00013 * Last modified: 00014 * $Date: 2009-02-05 11:48:53 +0100 (Thu, 05 Feb 2009) $ by $Author: schulte $ 00015 * $Revision: 8155 $ 00016 * 00017 * This file is part of Gecode, the generic constraint 00018 * development environment: 00019 * http://www.gecode.org 00020 * 00021 * Permission is hereby granted, free of charge, to any person obtaining 00022 * a copy of this software and associated documentation files (the 00023 * "Software"), to deal in the Software without restriction, including 00024 * without limitation the rights to use, copy, modify, merge, publish, 00025 * distribute, sublicense, and/or sell copies of the Software, and to 00026 * permit persons to whom the Software is furnished to do so, subject to 00027 * the following conditions: 00028 * 00029 * The above copyright notice and this permission notice shall be 00030 * included in all copies or substantial portions of the Software. 00031 * 00032 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 00033 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 00034 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 00035 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 00036 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 00037 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 00038 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 00039 * 00040 */ 00041 00042 namespace Gecode { 00043 00044 /* 00045 * Constructors and access 00046 * 00047 */ 00048 00049 forceinline 00050 SetVar::SetVar(void) {} 00051 00052 forceinline 00053 SetVar::SetVar(const SetVar& x) 00054 : VarBase<Set::SetVarImp>(x.varimp) {} 00055 00056 forceinline 00057 SetVar::SetVar(const Set::SetView& x) 00058 : VarBase<Set::SetVarImp>(x.var()) {} 00059 00060 forceinline void 00061 SetVar::init(Space& home) { 00062 varimp = new (home) Set::SetVarImp(home); 00063 } 00064 00065 forceinline void 00066 SetVar::init(Space& home,int lbMin,int lbMax,int ubMin,int ubMax, 00067 unsigned int cardMin, unsigned int cardMax) { 00068 varimp = new (home) Set::SetVarImp(home, lbMin, lbMax, ubMin, ubMax, 00069 cardMin, cardMax); 00070 } 00071 00072 forceinline void 00073 SetVar::init(Space& home, const IntSet& glb,int ubMin,int ubMax, 00074 unsigned int cardMin, unsigned int cardMax) { 00075 varimp = new (home) Set::SetVarImp(home, glb, ubMin, ubMax, 00076 cardMin, cardMax); 00077 } 00078 00079 forceinline void 00080 SetVar::init(Space& home, int lbMin,int lbMax,const IntSet& lub, 00081 unsigned int cardMin, unsigned int cardMax) { 00082 varimp = new (home) Set::SetVarImp(home, lbMin, lbMax, lub, 00083 cardMin, cardMax); 00084 } 00085 00086 forceinline void 00087 SetVar::init(Space& home, const IntSet& glb, const IntSet& lub, 00088 unsigned int cardMin, unsigned int cardMax) { 00089 varimp = new (home) Set::SetVarImp(home, glb, lub, cardMin, cardMax); 00090 } 00091 00092 00093 00094 /* 00095 * Variable information 00096 * 00097 */ 00098 00099 forceinline unsigned int 00100 SetVar::glbSize(void) const { return varimp->glbSize(); } 00101 00102 forceinline unsigned int 00103 SetVar::lubSize(void) const { return varimp->lubSize(); } 00104 00105 forceinline unsigned int 00106 SetVar::unknownSize(void) const { return varimp->lubSize()-varimp->glbSize(); } 00107 00108 forceinline bool 00109 SetVar::assigned(void) const { return varimp->assigned(); } 00110 00111 forceinline bool 00112 SetVar::contains(int i) const { return varimp->knownIn(i); } 00113 00114 forceinline bool 00115 SetVar::notContains(int i) const { return varimp->knownOut(i); } 00116 00117 forceinline unsigned int 00118 SetVar::cardMin(void) const { return varimp->cardMin(); } 00119 00120 forceinline unsigned int 00121 SetVar::cardMax(void) const { return varimp->cardMax(); } 00122 00123 forceinline int 00124 SetVar::lubMin(void) const { return varimp->lubMin(); } 00125 00126 forceinline int 00127 SetVar::lubMax(void) const { return varimp->lubMax(); } 00128 00129 forceinline int 00130 SetVar::glbMin(void) const { return varimp->glbMin(); } 00131 00132 forceinline int 00133 SetVar::glbMax(void) const { return varimp->glbMax(); } 00134 00135 /* 00136 * Cloning 00137 * 00138 */ 00139 00140 forceinline void 00141 SetVar::update(Space& home, bool share, SetVar& y) { 00142 varimp = y.varimp->copy(home,share); 00143 } 00144 00145 00146 /* 00147 * Range and value iterators for set variables 00148 * 00149 */ 00150 00151 forceinline 00152 SetVarGlbRanges::SetVarGlbRanges(void) {} 00153 00154 forceinline 00155 SetVarGlbRanges::SetVarGlbRanges(const SetVar& s) 00156 : iter(s.var()) {} 00157 00158 forceinline 00159 bool 00160 SetVarGlbRanges::operator ()(void) const { return iter(); } 00161 00162 forceinline 00163 void 00164 SetVarGlbRanges::operator ++(void) { ++iter; } 00165 00166 forceinline 00167 int 00168 SetVarGlbRanges::min(void) const { return iter.min(); } 00169 00170 forceinline 00171 int 00172 SetVarGlbRanges::max(void) const { return iter.max(); } 00173 00174 forceinline 00175 unsigned int 00176 SetVarGlbRanges::width(void) const { return iter.width(); } 00177 00178 forceinline 00179 SetVarLubRanges::SetVarLubRanges(void) {} 00180 00181 forceinline 00182 SetVarLubRanges::SetVarLubRanges(const SetVar& s) 00183 : iter(s.var()) {} 00184 00185 forceinline 00186 bool 00187 SetVarLubRanges::operator ()(void) const { return iter(); } 00188 00189 forceinline 00190 void 00191 SetVarLubRanges::operator ++(void) { ++iter; } 00192 00193 forceinline 00194 int 00195 SetVarLubRanges::min(void) const { return iter.min(); } 00196 00197 forceinline 00198 int 00199 SetVarLubRanges::max(void) const { return iter.max(); } 00200 00201 forceinline 00202 unsigned int 00203 SetVarLubRanges::width(void) const { return iter.width(); } 00204 00205 forceinline 00206 SetVarUnknownRanges::SetVarUnknownRanges(void) {} 00207 00208 forceinline 00209 SetVarUnknownRanges::SetVarUnknownRanges(const SetVar& s) { 00210 iter.init(s.var()); 00211 } 00212 00213 forceinline 00214 bool 00215 SetVarUnknownRanges::operator ()(void) const { return iter(); } 00216 00217 forceinline 00218 void 00219 SetVarUnknownRanges::operator ++(void) { ++iter; } 00220 00221 forceinline 00222 int 00223 SetVarUnknownRanges::min(void) const { return iter.min(); } 00224 00225 forceinline 00226 int 00227 SetVarUnknownRanges::max(void) const { return iter.max(); } 00228 00229 forceinline 00230 unsigned int 00231 SetVarUnknownRanges::width(void) const { return iter.width(); } 00232 00233 forceinline 00234 SetVarGlbValues::SetVarGlbValues(const SetVar& x) { 00235 SetVarGlbRanges ivr(x); 00236 iter.init(ivr); 00237 } 00238 00239 forceinline bool 00240 SetVarGlbValues::operator ()(void) const { 00241 return iter(); 00242 } 00243 00244 forceinline void 00245 SetVarGlbValues::operator ++(void) { 00246 ++iter; 00247 } 00248 00249 forceinline int 00250 SetVarGlbValues::val(void) const { 00251 return iter.val(); 00252 } 00253 00254 forceinline 00255 SetVarLubValues::SetVarLubValues(const SetVar& x) { 00256 SetVarLubRanges ivr(x); 00257 iter.init(ivr); 00258 } 00259 00260 forceinline bool 00261 SetVarLubValues::operator ()(void) const { 00262 return iter(); 00263 } 00264 00265 forceinline void 00266 SetVarLubValues::operator ++(void) { 00267 ++iter; 00268 } 00269 00270 forceinline int 00271 SetVarLubValues::val(void) const { 00272 return iter.val(); 00273 } 00274 00275 forceinline 00276 SetVarUnknownValues::SetVarUnknownValues(const SetVar& x) { 00277 SetVarUnknownRanges ivr(x); 00278 iter.init(ivr); 00279 } 00280 00281 forceinline bool 00282 SetVarUnknownValues::operator ()(void) const { 00283 return iter(); 00284 } 00285 00286 forceinline void 00287 SetVarUnknownValues::operator ++(void) { 00288 ++iter; 00289 } 00290 00291 forceinline int 00292 SetVarUnknownValues::val(void) const { 00293 return iter.val(); 00294 } 00295 00296 } 00297 00298 // STATISTICS: set-var 00299