29 #include <boost/range/iterator_range.hpp> 46 mdb_size_t
count(MDB_cursor* cur);
63 std::pair<epee::span<const std::uint8_t>, epee::span<const std::uint8_t>>
64 get(MDB_cursor& cur, MDB_cursor_op op, std::size_t key, std::size_t value);
81 template<
typename T,
typename F = T, std::
size_t offset = 0>
85 epee::span<const std::uint8_t>
values;
89 values.remove_prefix(
sizeof(
T));
129 (
values.empty() && rhs.values.empty()) ||
130 values.data() == rhs.values.data();
160 template<
typename U,
typename G = U, std::
size_t uoffset = 0>
163 static_assert(std::is_same<U, T>(),
"bad ELECTRONEUM_FIELD usage?");
164 static_assert(std::is_pod<U>(),
"value type must be pod");
165 static_assert(std::is_pod<G>(),
"field type must be pod");
166 static_assert(
sizeof(
G) + uoffset <=
sizeof(U),
"bad field and/or offset");
167 assert(
sizeof(
G) + uoffset <=
values.size());
185 template<
typename T,
typename D>
188 std::unique_ptr<MDB_cursor, D>
cur;
210 return {std::move(
cur)};
248 template<
typename U = T,
typename F = U, std::
size_t offset = 0>
251 static_assert(std::is_same<U, T>(),
"was ELECTRONEUM_FIELD used with wrong type?");
266 template<
typename U = T,
typename F = U, std::
size_t offset = 0>
267 boost::iterator_range<value_iterator<U, F, offset>>
make_range()
const 273 template<
typename T,
typename F, std::
size_t offset>
277 return lhs.equal(rhs);
280 template<
typename T,
typename F, std::
size_t offset>
284 return !lhs.equal(rhs);
boost::iterator_range< value_iterator< U, F, offset > > make_range() const
Definition: value_stream.h:267
const uint32_t T[512]
Definition: groestl_tables.h:37
void reset()
Definition: value_stream.h:220
bool operator!=(key_iterator< K, V > const &lhs, key_iterator< K, V > const &rhs) noexcept
Definition: key_stream.h:259
G get_value() const noexcept
Definition: value_stream.h:161
std::pair< epee::span< const std::uint8_t >, epee::span< const std::uint8_t > > get(MDB_cursor &cur, MDB_cursor_op op, std::size_t key, std::size_t value)
Definition: value_stream.cpp:52
#define F(w, k)
Definition: sha512-blocks.c:61
std::input_iterator_tag iterator_category
Definition: value_stream.h:99
Definition: value_stream.h:82
Definition: blockchain_ancestry.cpp:72
std::unique_ptr< MDB_cursor, D > cur
Definition: value_stream.h:188
epee::span< const std::uint8_t > values
Definition: value_stream.h:85
const
Definition: build_protob.py:9
std::unique_ptr< MDB_cursor, D > give_cursor() noexcept
Definition: value_stream.h:208
value_type operator*() const noexcept
Definition: value_stream.h:176
~value_iterator()=default
MDB_cursor * cur
Definition: value_stream.h:84
value_stream & operator=(value_stream &&)=default
mdb_size_t count(MDB_cursor *cur)
Definition: value_stream.cpp:39
std::size_t difference_type
Definition: value_stream.h:98
value_iterator(MDB_cursor *cur)
Definition: value_stream.h:111
void increment()
Definition: value_stream.h:87
std::size_t count() const
Definition: value_stream.h:230
value_iterator & operator=(value_iterator const &)=default
bool is_end() const noexcept
Definition: value_stream.h:123
value_iterator< U, F, offset > make_iterator() const
Definition: value_stream.h:249
void * memcpy(void *a, const void *b, size_t c)
Definition: glibc_compat.cpp:16
value_iterator() noexcept
Construct an "end" iterator.
Definition: value_stream.h:102
Definition: database.cpp:45
Definition: value_stream.h:186
value_iterator & operator++()
Invalidates all prior copies of the iterator.
Definition: value_stream.h:134
void pointer
Definition: value_stream.h:97
bool operator==(key_iterator< K, V > const &lhs, key_iterator< K, V > const &rhs) noexcept
Definition: key_stream.h:252
value_stream(std::unique_ptr< MDB_cursor, D > cur)
Take ownership of cur without changing position. nullptr valid.
Definition: value_stream.h:192
F value_type
Definition: value_stream.h:95
bool equal(value_iterator const &rhs) const noexcept
Definition: value_stream.h:126
Definition: blockchain_usage.cpp:71
value_iterator operator++(int)
Definition: value_stream.h:141