28#ifndef INCLUDED_MDDS_FLAT_SEGMENT_TREE_ITR_HPP
29#define INCLUDED_MDDS_FLAT_SEGMENT_TREE_ITR_HPP
31namespace mdds {
namespace fst {
namespace detail {
36template<
typename FstType>
39 using fst_type = FstType;
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 using fst_type = FstType;
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
174 const fst_type* get_parent()
const
179 bool is_end_pos()
const
185 const value_type& get_current_node_pair()
187 m_current_pair = value_type(m_pos->value_leaf.key, m_pos->value_leaf.value);
188 return m_current_pair;
191 const fst_type* m_db;
192 const typename fst_type::node* m_pos;
193 value_type m_current_pair;
197template<
typename FstType>
200 typedef FstType fst_type;
204 : m_start(start), m_end(end)
212 typename fst_type::key_type start;
213 typename fst_type::key_type end;
214 typename fst_type::value_type value;
220 typename fst_type::key_type _start,
typename fst_type::key_type _end,
typename fst_type::value_type _value)
221 : start(std::move(_start)), end(std::move(_end)), value(std::move(_value))
224 bool operator==(
const value_type& other)
const
226 return start == other.start && end == other.end && value == other.value;
229 bool operator!=(
const value_type& other)
const
231 return !operator==(other);
242 const_segment_iterator(const_segment_iterator&& other)
243 : m_start(std::move(other.m_start)), m_end(std::move(other.m_end))
249 ~const_segment_iterator()
252 bool operator==(
const const_segment_iterator& other)
const
254 return m_start == other.m_start && m_end == other.m_end;
257 bool operator!=(
const const_segment_iterator& other)
const
259 return !operator==(other);
262 const_segment_iterator& operator=(
const const_segment_iterator& other)
264 m_start = other.m_start;
271 const_segment_iterator& operator=(const_segment_iterator&& other)
273 m_start = std::move(other.m_start);
274 m_end = std::move(other.m_end);
280 const value_type& operator*()
285 const value_type* operator->()
290 const_segment_iterator& operator++()
293 m_start = m_start->next.get();
294 m_end = m_start->next.get();
299 const_segment_iterator operator++(
int)
302 const_segment_iterator ret = *
this;
303 m_start = m_start->next.get();
304 m_end = m_start->next.get();
309 const_segment_iterator& operator--()
312 m_start = m_start->prev.get();
313 m_end = m_start->next.get();
318 const_segment_iterator operator--(
int)
321 const_segment_iterator ret = *
this;
322 m_start = m_start->prev.get();
323 m_end = m_start->next.get();
335 m_node.start = m_start->value_leaf.key;
336 m_node.end = m_end->value_leaf.key;
337 m_node.value = m_start->value_leaf.value;
341 const typename fst_type::node* m_start;
342 const typename fst_type::node* m_end;
Definition: flat_segment_tree_itr.hpp:95
Definition: flat_segment_tree_itr.hpp:199
Definition: flat_segment_tree_itr.hpp:211
Definition: flat_segment_tree_itr.hpp:38
Definition: flat_segment_tree_itr.hpp:68