1 #ifndef COMPACT_TRIE2_MINI_OFFSETS_HPP
2 #define COMPACT_TRIE2_MINI_OFFSETS_HPP
4 #include <range/v3/iterator/basic_iterator.hpp>
5 #include <range/v3/range/access.hpp>
6 #include <range/v3/view/facade.hpp>
20 class MiniOffsets :
public ranges::view_facade<MiniOffsets<Rng>> {
22 friend ranges::range_access;
26 friend ranges::range_access;
27 using I = ranges::iterator_t<Rng>;
28 struct mixin : ranges::basic_mixin<cursor> {
30 using ranges::basic_mixin<cursor>::basic_mixin;
32 I base()
const {
return this->get().it_; }
33 void write(
const std::uint16_t val) {
35 assert(val < (1 << 2 * 8));
37 std::memcpy(&*this->get().it_, &val, 2);
43 explicit cursor(I it) : it_(std::forward<I>(it)) {}
44 void next() { ranges::advance(it_, 2); }
45 std::uint16_t read()
const {
47 std::memcpy(&n, &*it_, 2);
51 bool equal(cursor
const& that)
const {
return it_ == that.it_; }
52 void prev() { ranges::advance(it_, -2); }
53 void advance(ranges::iter_difference_t<I> n) {
54 ranges::advance(it_, 2 * n);
56 auto distance_to(cursor
const& that)
const {
57 assert((that.it_ - it_) % 2 == 0);
58 return (that.it_ - it_) / 2;
62 constexpr cursor() =
default;
65 using Iterator = cursor;
67 auto begin_cursor()
const {
return Iterator{ranges::begin(rng_)}; }
68 auto end_cursor()
const {
return Iterator{ranges::end(rng_)}; }
69 explicit MiniOffsets(Rng&& rng) : rng_(std::forward<Rng>(rng)) {}
74 template <
class Rng> MiniOffsets<Rng> make_mini_offsets(Rng&& rng) {
75 return MiniOffsets<Rng>{std::forward<Rng>(rng)};
2 byte wide view onto the offsets of child nodes, relative to the CompactTrie2::next_row_offset().
Definition: mini_offsets.hpp:20
namespace compact_trie2
Definition: compact_trie2.hpp:19
Definition: mini_offsets.hpp:28
Definition: mini_offsets.hpp:25