libwordring
trie_base_iterator.hpp
1 #pragma once
2 
3 #include <wordring/trie/trie_heap_iterator.hpp>
4 
5 namespace wordring::detail
6 {
7  template <typename Container>
9  {
10  template <typename Allocator1>
11  friend class trie_base;
12 
13  template <typename Container1>
15 
16  template <typename Container1>
18 
19  protected:
21 
22  using typename base_type::index_type;
23  using typename base_type::node_type;
24  using typename base_type::container;
25 
26  public:
27  using difference_type = std::ptrdiff_t;
28  using value_type = std::uint8_t;
29  using pointer = value_type*;
30  using reference = value_type&;
31  using iterator_category = std::input_iterator_tag;
32 
33  static constexpr std::uint16_t null_value = 256u;
34 
35  protected:
36  using base_type::value;
37  using base_type::at_index;
38  using base_type::advance;
41  using base_type::end_index;
42 
43  using base_type::find;
44  using base_type::mother;
45  using base_type::base;
46  using base_type::limit;
47  using base_type::has_null;
49 
50  using base_type::m_c;
51  using base_type::m_index;
52 
53  public:
55  : base_type()
56  {
57  }
58 
59  protected:
60  const_trie_base_iterator(container& c, index_type index)
61  : base_type(c, index)
62  {
63  }
64 
65  public:
67  operator bool() const
68  {
69  if (m_index <= 1) return false;
70 
71  node_type const* d = m_c->data();
72  index_type idx = (d + m_index)->m_base; // 子のBASEインデックス。
73 
74  // 子が無い(BASEが1未満)場合。
75  if (idx <= 0) return true;
76  // 子はあるが、途中で終端もある(文字null_valueによる遷移)場合。
77  if ((idx + null_value) < limit() && (d + idx + null_value)->m_check == m_index) return true;
78 
79  return false;
80  }
81 
82  bool operator!() const { return operator bool() == false; }
83 
84  value_type operator*() const { return value(); }
85 
86  const_trie_base_iterator operator[](value_type label) const
87  {
88  return const_trie_base_iterator(*m_c, at_index(label));
89  }
90 
91  const_trie_base_iterator& operator++()
92  {
93  advance();
94  return *this;
95  }
96 
97  const_trie_base_iterator operator++(int)
98  {
99  auto result = *this;
100  advance();
101  return result;
102  }
103 
104  template <typename String>
105  void string(String& result) const
106  {
107  result.clear();
108  for (auto p = *this; 1 < p.m_index; p = p.parent()) result.push_back(*p);
109  std::reverse(std::begin(result), std::end(result));
110  }
111 
112  const_trie_base_iterator parent() const
113  {
114  return const_trie_base_iterator(*m_c, parent_index());
115  }
116 
122  {
123  return const_trie_base_iterator(*m_c, begin_index());
124  }
125 
126  const_trie_base_iterator end() const
127  {
128  return const_trie_base_iterator(*m_c, end_index());
129  }
130  };
131 
132  template <typename Container1>
133  inline bool operator==(const_trie_base_iterator<Container1> const& lhs, const_trie_base_iterator<Container1> const& rhs)
134  {
135  assert(lhs.m_c == rhs.m_c);
136  return lhs.m_index == rhs.m_index;
137  }
138 
139  template <typename Container1>
140  inline bool operator!=(const_trie_base_iterator<Container1> const& lhs, const_trie_base_iterator<Container1> const& rhs)
141  {
142  return !(lhs == rhs);
143  }
144 }
wordring::detail::const_trie_heap_iterator::advance
void advance()
Definition: trie_heap_iterator.hpp:68
wordring::detail::const_trie_heap_iterator::value
value_type value() const
Definition: trie_heap_iterator.hpp:41
wordring::detail::const_trie_heap_iterator::begin_index
index_type begin_index() const
Definition: trie_heap_iterator.hpp:84
wordring::detail::const_trie_heap_iterator::parent_index
index_type parent_index() const
Definition: trie_heap_iterator.hpp:73
wordring::detail::const_trie_heap_iterator::limit
index_type limit() const
Definition: trie_heap_iterator.hpp:143
wordring::detail::const_trie_heap_iterator::at_index
index_type at_index(value_type label) const
Definition: trie_heap_iterator.hpp:50
wordring::detail::const_trie_heap_iterator::has_null
bool has_null() const
Definition: trie_heap_iterator.hpp:147
wordring::detail::const_trie_base_iterator
Definition: trie_base_iterator.hpp:8
wordring::detail::trie_node
Definition: trie_heap.hpp:23
wordring::detail::const_trie_base_iterator::begin
const_trie_base_iterator begin() const
Definition: trie_base_iterator.hpp:121
wordring::detail::const_trie_heap_iterator::has_sibling
bool has_sibling() const
Definition: trie_heap_iterator.hpp:159
wordring::detail::const_trie_heap_iterator::find
index_type find(index_type first, index_type last, index_type check) const
Definition: trie_heap_iterator.hpp:102
wordring::detail
wordring::detail::trie_base
終端の空遷移を併合したTrie木の実装
Definition: trie_base.hpp:64
wordring::detail::const_trie_heap_iterator
Definition: trie_heap_iterator.hpp:10
wordring::detail::const_trie_heap_iterator::base
index_type base() const
Definition: trie_heap_iterator.hpp:127
wordring::detail::const_trie_heap_iterator::mother
index_type mother() const
Definition: trie_heap_iterator.hpp:112