ranges-add.icc
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 protected:
00049 I i;
00051 int r_min;
00053 int r_max;
00054 public:
00056
00057
00058 AddRange(void);
00060 AddRange(I& i, int min, int max);
00062 void init(I& i, int min, int max);
00064
00066
00067
00068 void operator++(void);
00070 };
00071
00072
00078 template <class I>
00079 class SubRange : public AddRange<I> {
00080 public:
00082
00083
00084 SubRange(void);
00086 SubRange(I& i, int min, int max);
00088 void init(I& i, int min, int max);
00090 };
00091
00092 template <class I>
00093 forceinline
00094 AddRange<I>::AddRange(void) {}
00095
00096 template <class I>
00097 forceinline void
00098 AddRange<I>::operator++(void) {
00099 if (i()) {
00100 mi = r_min + i.min();
00101 ma = r_max + i.max();
00102 ++i;
00103 while (i() && (ma+1 >= r_min+i.min())) {
00104 ma = r_max + i.max(); ++i;
00105 }
00106 } else {
00107 finish();
00108 }
00109 }
00110
00111 template <class I>
00112 forceinline
00113 AddRange<I>::AddRange(I& i0, int r_min0, int r_max0)
00114 : i(i0), r_min(r_min0), r_max(r_max0) {
00115 operator++();
00116 }
00117
00118 template <class I>
00119 forceinline void
00120 AddRange<I>::init(I& i0, int r_min0, int r_max0) {
00121 i = i0; r_min = r_min0; r_max = r_max0;
00122 operator++();
00123 }
00124
00125
00126 template <class I>
00127 forceinline
00128 SubRange<I>::SubRange(void) {}
00129
00130 template <class I>
00131 forceinline
00132 SubRange<I>::SubRange(I& i, int r_min, int r_max)
00133 : AddRange<I>(i,-r_max,-r_min) {}
00134
00135 template <class I>
00136 forceinline void
00137 SubRange<I>::init(I& i, int r_min, int r_max) {
00138 AddRange<I>::init(i,-r_max,-r_min);
00139 }
00140
00141 }}}
00142
00143
00144