28#ifndef INCLUDED_MDDS_FLAT_SEGMENT_TREE_ITR_HPP
29#define INCLUDED_MDDS_FLAT_SEGMENT_TREE_ITR_HPP
31namespace mdds {
namespace __fst {
36template<
typename _FstType>
39 typedef _FstType fst_type;
41 static const typename fst_type::node* init_pos(
const fst_type* _db,
bool _end)
43 return _end ? _db->m_right_leaf.get() : _db->m_left_leaf.get();
46 static void inc(
const fst_type* _db,
const typename fst_type::node*& p,
bool& end)
48 if (p == _db->m_right_leaf.get())
54 static void dec(
const typename fst_type::node*& p,
bool& end)
66template<
typename _FstType>
69 typedef _FstType fst_type;
71 static const typename fst_type::node* init_pos(
const fst_type* _db,
bool _end)
73 return _end ? _db->m_left_leaf.get() : _db->m_right_leaf.get();
76 static void inc(
const fst_type* _db,
const typename fst_type::node*& p,
bool& end)
78 if (p == _db->m_left_leaf.get())
84 static void dec(
const typename fst_type::node*& p,
bool& end)
93template<
typename _FstType,
typename _Hdl>
96 typedef _Hdl handler_type;
99 typedef _FstType fst_type;
102 typedef ::std::pair<typename fst_type::key_type, typename fst_type::value_type> value_type;
103 typedef value_type* pointer;
104 typedef value_type& reference;
105 typedef ptrdiff_t difference_type;
106 typedef ::std::bidirectional_iterator_tag iterator_category;
108 explicit const_iterator_base(
const fst_type* _db,
bool _end) : m_db(_db), m_pos(
nullptr), m_end_pos(_end)
113 m_pos = handler_type::init_pos(_db, _end);
117 : m_db(_db), m_pos(pos), m_end_pos(
false)
127 m_end_pos = r.m_end_pos;
134 handler_type::inc(m_db, m_pos, m_end_pos);
141 handler_type::dec(m_pos, m_end_pos);
150 return (m_pos == r.m_pos) && (m_end_pos == r.m_end_pos);
155 return !operator==(r);
158 const value_type& operator*()
160 return get_current_node_pair();
163 const value_type* operator->()
165 return &get_current_node_pair();
169 const typename fst_type::node* get_pos()
const
173 const fst_type* get_parent()
const
179 const value_type& get_current_node_pair()
181 m_current_pair = value_type(m_pos->value_leaf.key, m_pos->value_leaf.value);
182 return m_current_pair;
185 const fst_type* m_db;
186 const typename fst_type::node* m_pos;
187 value_type m_current_pair;
191template<
typename _FstType>
194 typedef _FstType fst_type;
198 : m_start(start), m_end(end)
206 typename fst_type::key_type start;
207 typename fst_type::key_type end;
208 typename fst_type::value_type value;
221 const_segment_iterator(const_segment_iterator&& other)
222 : m_start(std::move(other.m_start)), m_end(std::move(other.m_end))
228 ~const_segment_iterator()
231 bool operator==(
const const_segment_iterator& other)
const
233 return m_start == other.m_start && m_end == other.m_end;
236 bool operator!=(
const const_segment_iterator& other)
const
238 return !operator==(other);
241 const_segment_iterator& operator=(
const const_segment_iterator& other)
243 m_start = other.m_start;
250 const_segment_iterator& operator=(const_segment_iterator&& other)
252 m_start = std::move(other.m_start);
253 m_end = std::move(other.m_end);
259 const value_type& operator*()
264 const value_type* operator->()
269 const_segment_iterator& operator++()
272 m_start = m_start->next.get();
273 m_end = m_start->next.get();
278 const_segment_iterator operator++(
int)
281 const_segment_iterator ret = *
this;
282 m_start = m_start->next.get();
283 m_end = m_start->next.get();
288 const_segment_iterator& operator--()
291 m_start = m_start->prev.get();
292 m_end = m_start->next.get();
297 const_segment_iterator operator--(
int)
300 const_segment_iterator ret = *
this;
301 m_start = m_start->prev.get();
302 m_end = m_start->next.get();
314 m_node.start = m_start->value_leaf.key;
315 m_node.end = m_end->value_leaf.key;
316 m_node.value = m_start->value_leaf.value;
320 const typename fst_type::node* m_start;
321 const typename fst_type::node* m_end;
Definition: flat_segment_tree_itr.hpp:95
Definition: flat_segment_tree_itr.hpp:193
Definition: flat_segment_tree_itr.hpp:205
Definition: flat_segment_tree_itr.hpp:38
Definition: flat_segment_tree_itr.hpp:68