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