41#define MONERO_FIELD(obj, field) \
42 obj , decltype(std::declval<obj>().field) , offsetof(obj, field)
45#define MONERO_SORT_BY(obj, field) \
47 lmdb::native_type<decltype(std::declval<obj>().field)>, \
48 offsetof(obj, field) \
52#define MONERO_COMPARE(obj, field) \
54 decltype(std::declval<obj>().field), \
55 offsetof(obj, field) \
77 std::is_enum<T>::value, std::underlying_type<T>,
identity<T>
81 template<typename T, typename U = typename std::underlying_type<T>::type>
92 static_assert(!std::is_rvalue_reference<T&&>(),
"cannot use temporary value");
93 void const*
const temp =
reinterpret_cast<void const*
>(std::addressof(
value));
100 return {
static_cast<const std::uint8_t*
>(
value.mv_data),
value.mv_size};
111 template<
typename T, std::
size_t offset = 0>
114 if (!left || !right || left->mv_size <
sizeof(
T) + offset || right->mv_size <
sizeof(
T) + offset)
116 assert(
"invalid use of custom comparison" == 0);
122 std::memcpy(std::addressof(left_val),
static_cast<char*
>(left->mv_data) + offset,
sizeof(
T));
123 std::memcpy(std::addressof(right_val),
static_cast<char*
>(right->mv_data) + offset,
sizeof(
T));
124 return left_val < right_val ? -1 :
bool(right_val < left_val);
135 template<
typename T, std::
size_t offset = 0>
138 static_assert(!epee::has_padding<T>(),
"memcmp will not work");
139 if (!left || !right || left->mv_size <
sizeof(
T) + offset || right->mv_size <
sizeof(
T) + offset)
141 assert(
"invalid use of custom comparison" == 0);
145 static_cast<char*
>(left->mv_data) + offset,
146 static_cast<char*
>(right->mv_data) + offset,
Non-owning sequence of data. Does not deep copy.
Definition: span.h:55
#define const
Definition: ipfrdr.c:80
Lightning memory-mapped database library.
Definition: database.cpp:46
constexpr epee::span< const std::uint8_t > to_byte_span(MDB_val value) noexcept
Definition: util.h:98
int less(MDB_val const *left, MDB_val const *right) noexcept
Definition: util.h:112
constexpr U to_native(T value) noexcept
Definition: util.h:82
MDB_val to_val(T &&value) noexcept
Definition: util.h:89
typename std::conditional< std::is_enum< T >::value, std::underlying_type< T >, identity< T > >::type::type native_type
Definition: util.h:78
const GenericPointer< typename T::ValueType > T2 value
Definition: pointer.h:1225
int bool
Definition: stdbool.h:35
Generic structure used for passing keys and data in and out of the database.
Definition: lmdb.h:286
Prevent instantiation of std::underlying_type<T> when T is not enum.
Definition: util.h:63
T type
Definition: util.h:64