mdbx++: добавление compare_positions() для курсоров.

This commit is contained in:
Леонид Юрьев (Leonid Yuriev) 2023-11-18 02:32:55 +03:00
parent adcbb39379
commit eee3e6eb6b
2 changed files with 49 additions and 0 deletions

View File

@ -567,6 +567,7 @@ MDBX_DECLARE_EXCEPTION(dangling_map_id);
[[noreturn]] LIBMDBX_API void throw_out_range();
[[noreturn]] LIBMDBX_API void throw_allocators_mismatch();
[[noreturn]] LIBMDBX_API void throw_bad_value_size();
[[noreturn]] LIBMDBX_API void throw_incomparable_cursors();
static MDBX_CXX14_CONSTEXPR size_t check_length(size_t bytes);
static MDBX_CXX14_CONSTEXPR size_t check_length(size_t headroom,
size_t payload);
@ -4339,6 +4340,34 @@ public:
friend MDBX_CXX11_CONSTEXPR bool operator!=(const cursor &a,
const cursor &b) noexcept;
friend inline int compare_position_nothrow(const cursor &left,
const cursor &right,
bool ignore_nested) noexcept;
friend inline int compare_position(const cursor &left, const cursor &right,
bool ignore_nested);
bool is_before_than(const cursor &other, bool ignore_nested = false) const {
return compare_position(*this, other, ignore_nested) < 0;
}
bool is_same_or_before_than(const cursor &other,
bool ignore_nested = false) const {
return compare_position(*this, other, ignore_nested) <= 0;
}
bool is_same_position(const cursor &other, bool ignore_nested = false) const {
return compare_position(*this, other, ignore_nested) == 0;
}
bool is_after_than(const cursor &other, bool ignore_nested = false) const {
return compare_position(*this, other, ignore_nested) > 0;
}
bool is_same_or_after_than(const cursor &other,
bool ignore_nested = false) const {
return compare_position(*this, other, ignore_nested) >= 0;
}
/// \brief Returns the application context associated with the cursor.
inline void *get_context() const noexcept;
@ -6192,6 +6221,21 @@ MDBX_CXX11_CONSTEXPR bool operator!=(const cursor &a,
return a.handle_ != b.handle_;
}
inline int compare_position_nothrow(const cursor &left, const cursor &right,
bool ignore_nested = false) noexcept {
return mdbx_cursor_compare(left.handle_, right.handle_, ignore_nested);
}
inline int compare_position(const cursor &left, const cursor &right,
bool ignore_nested = false) {
const auto diff = compare_position_nothrow(left, right, ignore_nested);
assert(compare_position_nothrow(right, left, ignore_nested) == -diff);
if (MDBX_LIKELY(int16_t(diff) == diff))
MDBX_CXX20_LIKELY
return int(diff);
throw_incomparable_cursors();
}
inline cursor::move_result::move_result(const cursor &cursor,
bool throw_notfound)
: pair_result(slice(), slice(), false) {

View File

@ -233,6 +233,11 @@ namespace mdbx {
"into an incompatible memory allocation scheme.");
}
[[noreturn]] __cold void throw_incomparable_cursors() {
throw std::logic_error(
"mdbx:: incomparable and/or invalid cursors to compare positions.");
}
[[noreturn]] __cold void throw_bad_value_size() {
throw bad_value_size(MDBX_BAD_VALSIZE);
}