values-union.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 Union {
00044 protected:
00046 I i;
00048 J j;
00050 int v;
00052 bool done;
00053 public:
00055
00056
00057 Union(void);
00059 Union(I& i, J& j);
00061 void init(I& i, J& j);
00063
00065
00066
00067 bool operator ()(void) const;
00069 void operator ++(void);
00071
00073
00074
00075 int val(void) const;
00077 };
00078
00079
00080 template<class I, class J>
00081 forceinline
00082 Union<I,J>::Union(void) : v(0) {}
00083
00084 template<class I, class J>
00085 forceinline void
00086 Union<I,J>::operator ++(void) {
00087 if (i()) {
00088 if (j()) {
00089 if (i.val() == j.val()) {
00090 v=i.val(); ++i; ++j;
00091 } else if (i.val() < j.val()) {
00092 v=i.val(); ++i;
00093 } else {
00094 v=j.val(); ++j;
00095 }
00096 } else {
00097 v=i.val(); ++i;
00098 }
00099 } else if (j()) {
00100 v=j.val(); ++j;
00101 } else {
00102 done=true;
00103 }
00104 }
00105
00106 template<class I, class J>
00107 inline void
00108 Union<I,J>::init(I& i0, J& j0) {
00109 i=i0; j=j0; v=0; done=false;
00110 operator ++();
00111 }
00112
00113 template<class I, class J>
00114 forceinline
00115 Union<I,J>::Union(I& i0, J& j0) : i(i0), j(j0), v(0), done(false) {
00116 operator ++();
00117 }
00118
00119 template<class I, class J>
00120 forceinline bool
00121 Union<I,J>::operator ()(void) const {
00122 return !done;
00123 }
00124
00125 template<class I, class J>
00126 forceinline int
00127 Union<I,J>::val(void) const {
00128 return v;
00129 }
00130
00131 }}}
00132
00133