libwordring
trie_construct_iterator.hpp
1 #pragma once
2 
3 #include <wordring/static_vector/static_vector.hpp>
4 
5 #include <algorithm>
6 #include <iterator>
7 #include <deque>
8 #include <type_traits>
9 #include <utility>
10 
11 namespace wordring::detail
12 {
15  template <typename Iterator>
17  {
18  template <typename Iterator1>
19  friend bool operator==(trie_construct_iterator<Iterator1> const&, trie_construct_iterator<Iterator1> const&);
20 
21  template <typename Iterator1>
22  friend bool operator!=(trie_construct_iterator<Iterator1> const&, trie_construct_iterator<Iterator1> const&);
23 
24  public:
25  using iterator_type = Iterator;
26 
27  using difference_type = typename std::iterator_traits<iterator_type>::difference_type;
28  using value_type = std::uint16_t;
29  using pointer = value_type*;
30  using reference = value_type&;
31  using iterator_category = std::input_iterator_tag;
32 
33  using string_iterator = typename iterator_type::string_iterator;
34 
36 
37  static constexpr std::uint16_t null_value = 256u;
38 
39  public:
40  trie_construct_iterator(iterator_type root)
41  : m_queue(1, root)
42  {
43  assign_children();
44  }
45 
46  std::pair<string_iterator, string_iterator> parent() const
47  {
48  return m_queue.front().string();
49  }
50 
51  label_vector const& children() const
52  {
53  return m_labels;
54  }
55 
56  bool empty() const { return m_queue.empty(); }
57 
58  trie_construct_iterator& operator++()
59  {
60  m_queue.pop_front();
61  assign_children();
62  return *this;
63  }
64 
65  trie_construct_iterator operator++(int)
66  {
67  auto tmp = *this;
68  operator++();
69  return tmp;
70  }
71 
72  protected:
73  void assign_children()
74  {
75  m_labels.clear();
76  if (empty()) return;
77 
78  auto it = m_queue.front();
79  auto it1 = it.begin();
80  auto it2 = it.end();
81 
82  while (it1 != it2)
83  {
84  m_labels.push_back(*it1);
85  if (it1.has_child()) m_queue.push_back(it1);
86  ++it1;
87  }
88  if (it.has_null()) m_labels.push_back(null_value);
89  }
90 
91  protected:
92  std::deque<iterator_type> m_queue;
93  label_vector m_labels;
94  };
95 
96  template <typename Iterator1>
97  inline bool operator==(trie_construct_iterator<Iterator1> const& lhs, trie_construct_iterator<Iterator1> const& rhs)
98  {
99  return !(lhs != rhs);
100  }
101 
102  template <typename Iterator1>
103  inline bool operator!=(trie_construct_iterator<Iterator1> const& lhs, trie_construct_iterator<Iterator1> const& rhs)
104  {
105  return lhs.m_queue.size() != rhs.m_queue.size() || lhs.m_queue != rhs.m_queue;
106  }
107 
108 }
wordring::detail::trie_construct_iterator
Definition: trie_construct_iterator.hpp:16
wordring::static_vector< std::uint16_t, 257 >
wordring::detail