Electroneum
Public Types | Public Member Functions | Private Member Functions | Private Attributes | List of all members
lmdb::key_iterator< K, V > Class Template Reference

#include <key_stream.h>

Public Types

using value_type = std::pair< K, boost::iterator_range< value_iterator< V > >>
 
using reference = value_type
 
using pointer = void
 
using difference_type = std::size_t
 
using iterator_category = std::input_iterator_tag
 

Public Member Functions

 key_iterator () noexcept
 Construct an "end" iterator. More...
 
 key_iterator (MDB_cursor *cur)
 
bool is_end () const noexcept
 
bool equal (key_iterator const &rhs) const noexcept
 
key_iteratoroperator++ ()
 
key_iterator operator++ (int)
 
value_type operator* () const
 
get_key () const noexcept
 
template<typename T = V, typename F = T, std::size_t offset = 0>
value_iterator< T, F, offset > make_value_iterator () const
 
template<typename T = V, typename F = T, std::size_t offset = 0>
boost::iterator_range< value_iterator< T, F, offset > > make_value_range () const
 

Private Member Functions

void increment ()
 

Private Attributes

MDB_cursor * cur
 
epee::span< const std::uint8_t > key
 

Detailed Description

template<typename K, typename V>
class lmdb::key_iterator< K, V >

An InputIterator for a fixed-sized LMDB key and value. operator++ iterates over keys.

Template Parameters
KKey type in database records.
VValue type in database records.
Note
This meets requirements for an InputIterator only. The iterator can only be incremented and dereferenced. All copies of an iterator share the same LMDB cursor, and therefore incrementing any copy will change the cursor state for all (incrementing an iterator will invalidate all prior copies of the iterator). Usage is identical to std::istream_iterator.

Member Typedef Documentation

◆ difference_type

template<typename K , typename V >
using lmdb::key_iterator< K, V >::difference_type = std::size_t

◆ iterator_category

template<typename K , typename V >
using lmdb::key_iterator< K, V >::iterator_category = std::input_iterator_tag

◆ pointer

template<typename K , typename V >
using lmdb::key_iterator< K, V >::pointer = void

◆ reference

template<typename K , typename V >
using lmdb::key_iterator< K, V >::reference = value_type

◆ value_type

template<typename K , typename V >
using lmdb::key_iterator< K, V >::value_type = std::pair<K, boost::iterator_range<value_iterator<V> >>

Constructor & Destructor Documentation

◆ key_iterator() [1/2]

template<typename K , typename V >
lmdb::key_iterator< K, V >::key_iterator ( )
inlinenoexcept

Construct an "end" iterator.

◆ key_iterator() [2/2]

template<typename K , typename V >
lmdb::key_iterator< K, V >::key_iterator ( MDB_cursor *  cur)
inline
Parameters
curIterate over keys starting at this cursor position.
Exceptions
std::system_errorif unexpected LMDB error. This can happen if cur is invalid.

Member Function Documentation

◆ equal()

template<typename K , typename V >
bool lmdb::key_iterator< K, V >::equal ( key_iterator< K, V > const &  rhs) const
inlinenoexcept
Returns
True iff rhs is referencing this key.

◆ get_key()

template<typename K , typename V >
K lmdb::key_iterator< K, V >::get_key ( ) const
inlinenoexcept
Precondition
!is_end()
Returns
Current key

◆ increment()

template<typename K , typename V >
void lmdb::key_iterator< K, V >::increment ( )
inlineprivate

◆ is_end()

template<typename K , typename V >
bool lmdb::key_iterator< K, V >::is_end ( ) const
inlinenoexcept
Returns
True if this is one-past the last key.

◆ make_value_iterator()

template<typename K , typename V >
template<typename T = V, typename F = T, std::size_t offset = 0>
value_iterator<T, F, offset> lmdb::key_iterator< K, V >::make_value_iterator ( ) const
inline

Return a C++ iterator over database values from current cursor position that will reach .is_end() after the last duplicate key record. Calling make_iterator() will return an iterator whose operator* will return an entire value (V). make_iterator<ELECTRONEUM_FIELD(account, id)>() will return an iterator whose operator* will return a decltype(account.id) object - the other fields in the struct account are never copied from the database.

Exceptions
std::system_errorif LMDB has unexpected errors.
Returns
C++ iterator starting at current cursor position.

◆ make_value_range()

template<typename K , typename V >
template<typename T = V, typename F = T, std::size_t offset = 0>
boost::iterator_range<value_iterator<T, F, offset> > lmdb::key_iterator< K, V >::make_value_range ( ) const
inline

Return a range from current cursor position until last duplicate key record. Useful in for-each range loops or in templated code expecting a range of elements. Calling make_range() will return a range of T objects. make_range<ELECTRONEUM_FIELD(account, id)>() will return a range of decltype(account.id) objects - the other fields in the struct account are never copied from the database.

Exceptions
std::system_errorif LMDB has unexpected errors.
Returns
An InputIterator range over values at cursor position.

◆ operator*()

template<typename K , typename V >
value_type lmdb::key_iterator< K, V >::operator* ( ) const
inline
Precondition
!is_end()
Returns
{current key, current value range}

◆ operator++() [1/2]

template<typename K , typename V >
key_iterator& lmdb::key_iterator< K, V >::operator++ ( )
inline

Moves iterator to next key or end. Invalidates all prior copies of the iterator.

◆ operator++() [2/2]

template<typename K , typename V >
key_iterator lmdb::key_iterator< K, V >::operator++ ( int  )
inline

Moves iterator to next key or end.

Returns
A copy that is already invalidated, ignore

Member Data Documentation

◆ cur

template<typename K , typename V >
MDB_cursor* lmdb::key_iterator< K, V >::cur
private

◆ key

template<typename K , typename V >
epee::span<const std::uint8_t> lmdb::key_iterator< K, V >::key
private

The documentation for this class was generated from the following file: