Generated on Mon May 10 06:46:46 2010 for Gecode by doxygen 1.6.3

set.hpp

Go to the documentation of this file.
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