mirror of
https://github.com/isar/libmdbx.git
synced 2025-01-30 22:47:16 +08:00
mdbx++: добавление compare_positions()
для курсоров.
This commit is contained in:
parent
adcbb39379
commit
eee3e6eb6b
44
mdbx.h++
44
mdbx.h++
@ -567,6 +567,7 @@ MDBX_DECLARE_EXCEPTION(dangling_map_id);
|
|||||||
[[noreturn]] LIBMDBX_API void throw_out_range();
|
[[noreturn]] LIBMDBX_API void throw_out_range();
|
||||||
[[noreturn]] LIBMDBX_API void throw_allocators_mismatch();
|
[[noreturn]] LIBMDBX_API void throw_allocators_mismatch();
|
||||||
[[noreturn]] LIBMDBX_API void throw_bad_value_size();
|
[[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 bytes);
|
||||||
static MDBX_CXX14_CONSTEXPR size_t check_length(size_t headroom,
|
static MDBX_CXX14_CONSTEXPR size_t check_length(size_t headroom,
|
||||||
size_t payload);
|
size_t payload);
|
||||||
@ -4339,6 +4340,34 @@ public:
|
|||||||
friend MDBX_CXX11_CONSTEXPR bool operator!=(const cursor &a,
|
friend MDBX_CXX11_CONSTEXPR bool operator!=(const cursor &a,
|
||||||
const cursor &b) noexcept;
|
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.
|
/// \brief Returns the application context associated with the cursor.
|
||||||
inline void *get_context() const noexcept;
|
inline void *get_context() const noexcept;
|
||||||
|
|
||||||
@ -6192,6 +6221,21 @@ MDBX_CXX11_CONSTEXPR bool operator!=(const cursor &a,
|
|||||||
return a.handle_ != b.handle_;
|
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,
|
inline cursor::move_result::move_result(const cursor &cursor,
|
||||||
bool throw_notfound)
|
bool throw_notfound)
|
||||||
: pair_result(slice(), slice(), false) {
|
: pair_result(slice(), slice(), false) {
|
||||||
|
@ -233,6 +233,11 @@ namespace mdbx {
|
|||||||
"into an incompatible memory allocation scheme.");
|
"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() {
|
[[noreturn]] __cold void throw_bad_value_size() {
|
||||||
throw bad_value_size(MDBX_BAD_VALSIZE);
|
throw bad_value_size(MDBX_BAD_VALSIZE);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user