values-inter.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 Values {
00035
00042 template<class I, class J>
00043 class Inter {
00044 protected:
00046 I i;
00048 J j;
00050 void next(void);
00051 public:
00053
00054
00055 Inter(void);
00057 Inter(I& i, J& j);
00059 void init(I& i, J& j);
00061
00063
00064
00065 bool operator ()(void) const;
00067 void operator ++(void);
00069
00071
00072
00073 int val(void) const;
00075 };
00076
00077
00078 template<class I, class J>
00079 forceinline
00080 Inter<I,J>::Inter(void) {}
00081
00082 template<class I, class J>
00083 forceinline void
00084 Inter<I,J>::next(void) {
00085 do {
00086 while (i() && j() && (i.val() < j.val()))
00087 ++i;
00088 while (i() && j() && (j.val() < i.val()))
00089 ++j;
00090 } while (i() && j() && (i.val() != j.val()));
00091 }
00092
00093 template<class I, class J>
00094 inline void
00095 Inter<I,J>::init(I& i0, J& j0) {
00096 i=i0; j=j0; next();
00097 }
00098
00099 template<class I, class J>
00100 forceinline
00101 Inter<I,J>::Inter(I& i0, J& j0) : i(i0), j(j0) {
00102 next();
00103 }
00104
00105 template<class I, class J>
00106 forceinline void
00107 Inter<I,J>::operator ++(void) {
00108 ++i; ++j; next();
00109 }
00110
00111 template<class I, class J>
00112 forceinline bool
00113 Inter<I,J>::operator ()(void) const {
00114 return i() && j();
00115 }
00116
00117 template<class I, class J>
00118 forceinline int
00119 Inter<I,J>::val(void) const {
00120 assert(i.val() == j.val());
00121 return i.val();
00122 }
00123
00124 }}}
00125
00126