ranges-diff.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
00046 template<class I, class J>
00047 class Diff : public MinMax {
00048 protected:
00050 I i;
00052 J j;
00053 private:
00054 IsRangeIter<I> constraintI; IsRangeIter<J> constraintJ;
00055 public:
00057
00058
00059 Diff(void);
00061 Diff(I& i, J& j);
00063 void init(I& i, J& j);
00065
00067
00068
00069 void operator ++(void);
00071 };
00072
00073
00074
00075 template<class I, class J>
00076 forceinline void
00077 Diff<I,J>::operator ++(void) {
00078
00079
00080 while (true) {
00081 if (!i()) break;
00082 mi = ma+1;
00083 ma = i.max();
00084 if (mi > i.max()) {
00085 ++i;
00086 if (!i()) break;
00087 mi = i.min();
00088 ma = i.max();
00089 }
00090 while (j() && (j.max() < mi))
00091 ++j;
00092 if (j() && (j.min() <= ma)) {
00093
00094
00095 if ((mi >= j.min()) && (ma <= j.max()))
00096 continue;
00097
00098 if (j.min() <= mi) {
00099 mi = j.max()+1;
00100
00101 ++j;
00102 if (j() && (j.min() <= ma))
00103 ma = j.min()-1;
00104 } else {
00105 ma = j.min()-1;
00106 }
00107 }
00108 return;
00109 }
00110 finish();
00111 }
00112
00113 template<class I, class J>
00114 forceinline
00115 Diff<I,J>::Diff(void) {}
00116
00117 template<class I, class J>
00118 forceinline
00119 Diff<I,J>::Diff(I& i0, J& j0)
00120 : i(i0), j(j0) {
00121 if (!i()) {
00122 finish();
00123 } else {
00124 mi = i.min()-1; ma = mi;
00125 operator ++();
00126 }
00127 }
00128
00129 template<class I, class J>
00130 forceinline void
00131 Diff<I,J>::init(I& i0, J& j0) {
00132 i = i0; j = j0;
00133 if (!i()) {
00134 finish();
00135 } else {
00136 mi = i.min()-1; ma = mi;
00137 operator ++();
00138 }
00139 }
00140
00141 }}}
00142
00143
00144