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