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 static_assert(std::is_trivially_copyable<T>(),
"memcpy will not work");
115 if (!left || !right || left->mv_size <
sizeof(
T) + offset || right->mv_size <
sizeof(
T) + offset)
117 assert(
"invalid use of custom comparison" == 0);
123 std::memcpy(std::addressof(left_val),
static_cast<char*
>(left->mv_data) + offset,
sizeof(
T));
124 std::memcpy(std::addressof(right_val),
static_cast<char*
>(right->mv_data) + offset,
sizeof(
T));
125 return left_val < right_val ? -1 : bool(right_val < left_val);
136 template<
typename T, std::
size_t offset = 0>
139 static_assert(std::is_standard_layout<T>() &&
alignof(
T) == 1,
"memcmp will not work");
140 if (!left || !right || left->mv_size <
sizeof(
T) + offset || right->mv_size <
sizeof(
T) + offset)
142 assert(
"invalid use of custom comparison" == 0);
146 static_cast<char*
>(left->mv_data) + offset,
147 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:76
const GenericPointer< typename T::ValueType > T2 value
Definition pointer.h:1225
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