ranges-operations.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
00047
00048 template<class I>
00049 unsigned int size(I& i);
00050
00052 template<class I, class J>
00053 bool equal(I& i, J& j);
00054
00056 template<class I, class J>
00057 bool subset(I& i, J& j);
00058
00060 template<class I, class J>
00061 bool disjoint(I& i, J& j);
00062
00064 enum CompareStatus {
00065 CS_SUBSET,
00066 CS_DISJOINT,
00067 CS_NONE
00068 };
00069
00071 template<class I, class J>
00072 CompareStatus compare(I& i, J& j);
00074
00075
00076 template<class I>
00077 inline unsigned int
00078 size(I& i) {
00079 IsRangeIter<I>();
00080 unsigned int s = 0;
00081 while (i()) {
00082 s += i.width(); ++i;
00083 }
00084 return s;
00085 }
00086
00087 template<class I, class J>
00088 forceinline bool
00089 equal(I& i, J& j) {
00090 IsRangeIter<I>();
00091 IsRangeIter<J>();
00092
00093 while (i() && j())
00094 if ((i.min() == j.min()) && (i.max() == j.max())) {
00095 ++i; ++j;
00096 } else {
00097 return false;
00098 }
00099 return !i() && !j();
00100 }
00101
00102 template<class I, class J>
00103 forceinline bool
00104 subset(I& i, J& j) {
00105 IsRangeIter<I>();
00106 IsRangeIter<J>();
00107
00108 while (i() && j())
00109 if (j.max() < i.min()) {
00110 ++j;
00111 } else if ((i.min() >= j.min()) && (i.max() <= j.max())) {
00112 ++i;
00113 } else {
00114 return false;
00115 }
00116 return !i();
00117 }
00118
00119 template<class I, class J>
00120 forceinline bool
00121 disjoint(I& i, J& j) {
00122 IsRangeIter<I>();
00123 IsRangeIter<J>();
00124
00125 while (i() && j())
00126 if (j.max() < i.min()) {
00127 ++j;
00128 } else if (i.max() < j.min()) {
00129 ++i;
00130 } else {
00131 return false;
00132 }
00133 return true;
00134 }
00135
00136 template<class I, class J>
00137 forceinline CompareStatus
00138 compare(I& i, J& j) {
00139 IsRangeIter<I>();
00140 IsRangeIter<J>();
00141 bool subset = true;
00142 bool disjoint = true;
00143 while (i() && j()) {
00144 if (j.max() < i.min()) {
00145 ++j;
00146 } else if (i.max() < j.min()) {
00147 ++i; subset = false;
00148 } else if ((i.min() >= j.min()) && (i.max() <= j.max())) {
00149 ++i; disjoint = false;
00150 } else if (i.max() <= j.max()) {
00151 ++i; disjoint = false; subset = false;
00152 } else if (j.max() <= i.max()) {
00153 ++j; disjoint = false; subset = false;
00154 }
00155 }
00156 if (i())
00157 subset = false;
00158 if (subset)
00159 return CS_SUBSET;
00160 return disjoint ? CS_DISJOINT : CS_NONE;
00161 }
00162
00163 }}}
00164
00165
00166