ranges-add.hpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 namespace Gecode { namespace Iter { namespace Ranges {
00039
00045 template<class I>
00046 class AddRange : public MinMax {
00047 private:
00049 IsRangeIter<I> _checkI;
00050 protected:
00052 I i;
00054 int r_min;
00056 int r_max;
00057 public:
00059
00060
00061 AddRange(void);
00063 AddRange(I& i, int min, int max);
00065 void init(I& i, int min, int max);
00067
00069
00070
00071 void operator ++(void);
00073 };
00074
00075
00081 template<class I>
00082 class SubRange : public AddRange<I> {
00083 public:
00085
00086
00087 SubRange(void);
00089 SubRange(I& i, int min, int max);
00091 void init(I& i, int min, int max);
00093 };
00094
00095 template<class I>
00096 forceinline
00097 AddRange<I>::AddRange(void) {}
00098
00099 template<class I>
00100 forceinline void
00101 AddRange<I>::operator ++(void) {
00102 if (i()) {
00103 mi = r_min + i.min();
00104 ma = r_max + i.max();
00105 ++i;
00106 while (i() && (ma+1 >= r_min+i.min())) {
00107 ma = r_max + i.max(); ++i;
00108 }
00109 } else {
00110 finish();
00111 }
00112 }
00113
00114 template<class I>
00115 forceinline
00116 AddRange<I>::AddRange(I& i0, int r_min0, int r_max0)
00117 : i(i0), r_min(r_min0), r_max(r_max0) {
00118 operator ++();
00119 }
00120
00121 template<class I>
00122 forceinline void
00123 AddRange<I>::init(I& i0, int r_min0, int r_max0) {
00124 i = i0; r_min = r_min0; r_max = r_max0;
00125 operator ++();
00126 }
00127
00128
00129 template<class I>
00130 forceinline
00131 SubRange<I>::SubRange(void) {}
00132
00133 template<class I>
00134 forceinline
00135 SubRange<I>::SubRange(I& i, int r_min, int r_max)
00136 : AddRange<I>(i,-r_max,-r_min) {}
00137
00138 template<class I>
00139 forceinline void
00140 SubRange<I>::init(I& i, int r_min, int r_max) {
00141 AddRange<I>::init(i,-r_max,-r_min);
00142 }
00143
00144 }}}
00145
00146
00147