Generated on Wed Nov 1 15:04:41 2006 for Gecode by doxygen 1.4.5

ranges-compl.icc

Go to the documentation of this file.
00001 /*
00002  *  Main authors:
00003  *     Christian Schulte <schulte@gecode.org>
00004  *     Guido Tack <tack@gecode.org>
00005  *
00006  *  Copyright:
00007  *     Guido Tack, 2004
00008  *     Christian Schulte, 2005
00009  *
00010  *  Last modified:
00011  *     $Date: 2006-08-04 16:05:50 +0200 (Fri, 04 Aug 2006) $ by $Author: schulte $
00012  *     $Revision: 3515 $
00013  *
00014  *  This file is part of Gecode, the generic constraint
00015  *  development environment:
00016  *     http://www.gecode.org
00017  *
00018  *  See the file "LICENSE" for information on usage and
00019  *  redistribution of this file, and for a
00020  *     DISCLAIMER OF ALL WARRANTIES.
00021  *
00022  */
00023 
00024 namespace Gecode { namespace Iter { namespace Ranges {
00025 
00037   template <int UMIN, int UMAX, class I>
00038   class Compl : public MinMax {
00039   protected:
00041     I i;
00043     void start(void);
00044   public:
00046 
00047 
00048     Compl(void);
00050     Compl(I& i);
00052     void init(I& i);
00054 
00056 
00057 
00058     void operator++(void);
00060   };
00061 
00062 
00074   template <class I>
00075   class ComplVal : public MinMax {
00076   protected:
00078     int UMIN, UMAX;
00080     I i;
00082     void start(void);
00083   public:
00085 
00086 
00087     ComplVal(void);
00089     ComplVal(int umin, int umax, I& i);
00091     void init(int umin, int umax, I& i);
00093 
00095 
00096 
00097     void operator++(void);
00099   };
00100 
00101 
00102   template <int UMIN, int UMAX, class I>
00103   forceinline void
00104   Compl<UMIN,UMAX,I>::start(void) {
00105     if (i()) {
00106       assert((i.min() >= UMIN) && (i.max() <= UMAX));
00107       if (i.min() > UMIN) {
00108         mi = UMIN;
00109         ma = i.min()-1;
00110       } else if (i.max() < UMAX) {
00111         mi = i.max()+1;
00112         ++i;
00113         ma = i() ? (i.min()-1) : UMAX;
00114       } else {
00115         finish();
00116       }
00117     } else {
00118       mi = UMIN;
00119       ma = UMAX;
00120     }
00121   }
00122 
00123   template <int UMIN, int UMAX, class I>
00124   forceinline
00125   Compl<UMIN,UMAX,I>::Compl(void) {}
00126 
00127   template <int UMIN, int UMAX, class I>
00128   forceinline
00129   Compl<UMIN,UMAX,I>::Compl(I& i0) : i(i0) {
00130     start();
00131   }
00132 
00133   template <int UMIN, int UMAX, class I>
00134   forceinline void
00135   Compl<UMIN,UMAX,I>::init(I& i0) {
00136     i=i0; start();
00137   }
00138 
00139   template <int UMIN, int UMAX, class I>
00140   forceinline void
00141   Compl<UMIN,UMAX,I>::operator++(void) {
00142     assert(!i() || (i.max() <= UMAX));
00143     if (i() && (i.max() < UMAX)) {
00144       mi = i.max()+1;
00145       ++i;
00146       ma = i() ? (i.min()-1) : UMAX;
00147     } else {
00148       finish();
00149     }
00150   }
00151 
00152   template <class I>
00153   forceinline void
00154   ComplVal<I>::start(void) {
00155     if (i()) {
00156       assert((i.min() >= UMIN) && (i.max() <= UMAX));
00157       if (i.min() > UMIN) {
00158         mi = UMIN;
00159         ma = i.min()-1;
00160       } else if (i.max() < UMAX) {
00161         mi = i.max()+1;
00162         ++i;
00163         ma = i() ? (i.min()-1) : UMAX;
00164       } else {
00165         finish();
00166       }
00167     } else {
00168       mi = UMIN;
00169       ma = UMAX;
00170     }
00171   }
00172 
00173   template <class I>
00174   forceinline
00175   ComplVal<I>::ComplVal(void) {}
00176 
00177   template <class I>
00178   forceinline
00179   ComplVal<I>::ComplVal(int umin, int umax, I& i0)
00180     : UMIN(umin), UMAX(umax), i(i0) {
00181     start();
00182   }
00183 
00184   template <class I>
00185   forceinline void
00186   ComplVal<I>::init(int umin, int umax, I& i0) {
00187     UMIN=umin; UMAX=umax; i=i0; start();
00188   }
00189 
00190   template <class I>
00191   forceinline void
00192   ComplVal<I>::operator++(void) {
00193     assert(!i() || (i.max() <= UMAX));
00194     if (i() && (i.max() < UMAX)) {
00195       mi = i.max()+1;
00196       ++i;
00197       ma = i() ? (i.min()-1) : UMAX;
00198     } else {
00199       finish();
00200     }
00201   }
00202 
00203 }}}
00204 
00205 // STATISTICS: iter-any
00206