mirror of
https://github.com/isar/libmdbx.git
synced 2025-01-02 01:04:13 +08:00
mdbx++: добавление cursor::scan(predicate...)
и т.п.
This commit is contained in:
parent
4999264460
commit
0b68980489
83
mdbx.h++
83
mdbx.h++
@ -4457,6 +4457,89 @@ protected:
|
|||||||
MDBX_val *value) const;
|
MDBX_val *value) const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
template <typename CALLABLE_PREDICATE>
|
||||||
|
bool scan(CALLABLE_PREDICATE predicate, move_operation start = first,
|
||||||
|
move_operation turn = next) {
|
||||||
|
struct wrapper : public exception_thunk {
|
||||||
|
static int probe(void *context, MDBX_val *key, MDBX_val *value,
|
||||||
|
void *arg) noexcept {
|
||||||
|
auto thunk = static_cast<wrapper *>(context);
|
||||||
|
assert(thunk->is_clean());
|
||||||
|
auto &predicate = *static_cast<CALLABLE_PREDICATE *>(arg);
|
||||||
|
try {
|
||||||
|
return predicate(pair(*key, *value)) ? MDBX_RESULT_TRUE
|
||||||
|
: MDBX_RESULT_FALSE;
|
||||||
|
} catch (... /* capture any exception to rethrow it over C code */) {
|
||||||
|
thunk->capture();
|
||||||
|
return MDBX_RESULT_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} thunk;
|
||||||
|
return error::boolean_or_throw(
|
||||||
|
::mdbx_cursor_scan(handle_, wrapper::probe, &thunk,
|
||||||
|
MDBX_cursor_op(start), MDBX_cursor_op(turn),
|
||||||
|
&predicate),
|
||||||
|
thunk);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename CALLABLE_PREDICATE>
|
||||||
|
bool fullscan(CALLABLE_PREDICATE predicate, bool backward = false) {
|
||||||
|
return scan(std::move(predicate), backward ? last : first,
|
||||||
|
backward ? previous : next);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename CALLABLE_PREDICATE>
|
||||||
|
bool scan_from(CALLABLE_PREDICATE predicate, slice &from,
|
||||||
|
move_operation start = key_greater_or_equal,
|
||||||
|
move_operation turn = next) {
|
||||||
|
struct wrapper : public exception_thunk {
|
||||||
|
static int probe(void *context, MDBX_val *key, MDBX_val *value,
|
||||||
|
void *arg) noexcept {
|
||||||
|
auto thunk = static_cast<wrapper *>(context);
|
||||||
|
assert(thunk->is_clean());
|
||||||
|
auto &predicate = *static_cast<CALLABLE_PREDICATE *>(arg);
|
||||||
|
try {
|
||||||
|
return predicate(pair(*key, *value)) ? MDBX_RESULT_TRUE
|
||||||
|
: MDBX_RESULT_FALSE;
|
||||||
|
} catch (... /* capture any exception to rethrow it over C code */) {
|
||||||
|
thunk->capture();
|
||||||
|
return MDBX_RESULT_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} thunk;
|
||||||
|
return error::boolean_or_throw(
|
||||||
|
::mdbx_cursor_scan_from(handle_, wrapper::probe, &thunk,
|
||||||
|
MDBX_cursor_op(start), &from, nullptr,
|
||||||
|
MDBX_cursor_op(turn), &predicate),
|
||||||
|
thunk);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename CALLABLE_PREDICATE>
|
||||||
|
bool scan_from(CALLABLE_PREDICATE predicate, pair &from,
|
||||||
|
move_operation start = pair_greater_or_equal,
|
||||||
|
move_operation turn = next) {
|
||||||
|
struct wrapper : public exception_thunk {
|
||||||
|
static int probe(void *context, MDBX_val *key, MDBX_val *value,
|
||||||
|
void *arg) noexcept {
|
||||||
|
auto thunk = static_cast<wrapper *>(context);
|
||||||
|
assert(thunk->is_clean());
|
||||||
|
auto &predicate = *static_cast<CALLABLE_PREDICATE *>(arg);
|
||||||
|
try {
|
||||||
|
return predicate(pair(*key, *value)) ? MDBX_RESULT_TRUE
|
||||||
|
: MDBX_RESULT_FALSE;
|
||||||
|
} catch (... /* capture any exception to rethrow it over C code */) {
|
||||||
|
thunk->capture();
|
||||||
|
return MDBX_RESULT_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} thunk;
|
||||||
|
return error::boolean_or_throw(
|
||||||
|
::mdbx_cursor_scan_from(handle_, wrapper::probe, &thunk,
|
||||||
|
MDBX_cursor_op(start), &from.key, &from.value,
|
||||||
|
MDBX_cursor_op(turn), &predicate),
|
||||||
|
thunk);
|
||||||
|
}
|
||||||
|
|
||||||
move_result move(move_operation operation, bool throw_notfound) {
|
move_result move(move_operation operation, bool throw_notfound) {
|
||||||
return move_result(*this, operation, throw_notfound);
|
return move_result(*this, operation, throw_notfound);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user