db: adjust lexicographical_tri_compare to take a bounded type list
When comparing tuples, we don't want to overrun the type list.
This commit is contained in:
12
keys.hh
12
keys.hh
@@ -141,14 +141,16 @@ public:
|
||||
{ }
|
||||
|
||||
bool operator()(const prefix_view_on_full_tuple& k1, const PrefixTopLevel& k2) const {
|
||||
return lexicographical_tri_compare(prefix_type->types().begin(),
|
||||
return lexicographical_tri_compare(
|
||||
prefix_type->types().begin(), prefix_type->types().end(),
|
||||
k1.begin(), k1.end(),
|
||||
prefix_type->begin(k2), prefix_type->end(k2),
|
||||
tri_compare) < 0;
|
||||
}
|
||||
|
||||
bool operator()(const PrefixTopLevel& k1, const prefix_view_on_full_tuple& k2) const {
|
||||
return lexicographical_tri_compare(prefix_type->types().begin(),
|
||||
return lexicographical_tri_compare(
|
||||
prefix_type->types().begin(), prefix_type->types().end(),
|
||||
prefix_type->begin(k1), prefix_type->end(k1),
|
||||
k2.begin(), k2.end(),
|
||||
tri_compare) < 0;
|
||||
@@ -183,14 +185,16 @@ public:
|
||||
{ }
|
||||
|
||||
bool operator()(const TopLevel& k1, const PrefixTopLevel& k2) const {
|
||||
return lexicographical_tri_compare(prefix_type->types().begin(),
|
||||
return lexicographical_tri_compare(
|
||||
prefix_type->types().begin(), prefix_type->types().end(),
|
||||
full_type->begin(k1), full_type->end(k1),
|
||||
prefix_type->begin(k2), prefix_type->end(k2),
|
||||
tri_compare) < 0;
|
||||
}
|
||||
|
||||
bool operator()(const PrefixTopLevel& k1, const TopLevel& k2) const {
|
||||
return lexicographical_tri_compare(prefix_type->types().begin(),
|
||||
return lexicographical_tri_compare(
|
||||
prefix_type->types().begin(), prefix_type->types().end(),
|
||||
prefix_type->begin(k1), prefix_type->end(k1),
|
||||
full_type->begin(k2), full_type->end(k2),
|
||||
tri_compare) < 0;
|
||||
|
||||
2
tuple.hh
2
tuple.hh
@@ -233,7 +233,7 @@ public:
|
||||
if (_byte_order_comparable) {
|
||||
return compare_unsigned(b1, b2);
|
||||
}
|
||||
return lexicographical_tri_compare(_types.begin(),
|
||||
return lexicographical_tri_compare(_types.begin(), _types.end(),
|
||||
begin(b1), end(b1), begin(b2), end(b2), [] (auto&& type, auto&& v1, auto&& v2) {
|
||||
return type->compare(v1, v2);
|
||||
});
|
||||
|
||||
12
types.hh
12
types.hh
@@ -55,16 +55,18 @@ bool lexicographical_compare(TypesIterator types, InputIt1 first1, InputIt1 last
|
||||
// than zero when the first value is respectively smaller, equal or greater
|
||||
// than the second value.
|
||||
template <typename TypesIterator, typename InputIt1, typename InputIt2, typename Compare>
|
||||
int lexicographical_tri_compare(TypesIterator types, InputIt1 first1, InputIt1 last1,
|
||||
InputIt2 first2, InputIt2 last2, Compare comp) {
|
||||
while (first1 != last1 && first2 != last2) {
|
||||
auto c = comp(*types, *first1, *first2);
|
||||
int lexicographical_tri_compare(TypesIterator types_first, TypesIterator types_last,
|
||||
InputIt1 first1, InputIt1 last1,
|
||||
InputIt2 first2, InputIt2 last2,
|
||||
Compare comp) {
|
||||
while (types_first != types_last && first1 != last1 && first2 != last2) {
|
||||
auto c = comp(*types_first, *first1, *first2);
|
||||
if (c) {
|
||||
return c;
|
||||
}
|
||||
++first1;
|
||||
++first2;
|
||||
++types;
|
||||
++types_first;
|
||||
}
|
||||
bool e1 = first1 == last1;
|
||||
bool e2 = first2 == last2;
|
||||
|
||||
Reference in New Issue
Block a user