28 #ifndef INCLUDED_MDDS_FLAT_SEGMENT_TREE_ITR_HPP
29 #define INCLUDED_MDDS_FLAT_SEGMENT_TREE_ITR_HPP
31 namespace mdds {
namespace __fst {
36 template<
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)
66 template<
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)
93 template<
typename _FstType,
typename _Hdl>
96 typedef _Hdl handler_type;
98 typedef _FstType fst_type;
101 typedef ::std::pair<typename fst_type::key_type, typename fst_type::value_type> value_type;
102 typedef value_type* pointer;
103 typedef value_type& reference;
104 typedef ptrdiff_t difference_type;
105 typedef ::std::bidirectional_iterator_tag iterator_category;
108 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) {}
120 m_db(r.m_db), m_pos(r.m_pos), m_end_pos(r.m_end_pos) {}
126 m_end_pos = r.m_end_pos;
133 handler_type::inc(m_db, m_pos, m_end_pos);
140 handler_type::dec(m_pos, m_end_pos);
149 return (m_pos == r.m_pos) && (m_end_pos == r.m_end_pos);
154 return !operator==(r);
157 const value_type& operator*()
159 return get_current_node_pair();
162 const value_type* operator->()
164 return &get_current_node_pair();
168 const typename fst_type::node* get_pos()
const {
return m_pos; }
169 const fst_type* get_parent()
const {
return m_db; }
172 const value_type& get_current_node_pair()
174 m_current_pair = value_type(m_pos->value_leaf.key, m_pos->value_leaf.value);
175 return m_current_pair;
178 const fst_type* m_db;
179 const typename fst_type::node* m_pos;
180 value_type m_current_pair;
184 template<
typename _FstType>
187 typedef _FstType fst_type;
191 m_start(start), m_end(end)
198 typename fst_type::key_type start;
199 typename fst_type::key_type end;
200 typename fst_type::value_type value;
207 m_start(other.m_start), m_end(other.m_end)
213 ~const_segment_iterator() {}
215 bool operator== (
const const_segment_iterator& other)
const
217 return m_start == other.m_start && m_end == other.m_end;
220 bool operator!= (
const const_segment_iterator& other)
const
222 return !operator==(other);
225 const_segment_iterator& operator=(
const const_segment_iterator& other)
227 m_start = other.m_start;
234 const value_type& operator*()
239 const value_type* operator->()
244 const_segment_iterator& operator++()
247 m_start = m_start->next.get();
248 m_end = m_start->next.get();
253 const_segment_iterator operator++(
int)
256 const_segment_iterator ret = *
this;
257 m_start = m_start->next.get();
258 m_end = m_start->next.get();
263 const_segment_iterator& operator--()
266 m_start = m_start->prev.get();
267 m_end = m_start->next.get();
272 const_segment_iterator operator--(
int)
275 const_segment_iterator ret = *
this;
276 m_start = m_start->prev.get();
277 m_end = m_start->next.get();
289 m_node.start = m_start->value_leaf.key;
290 m_node.end = m_end->value_leaf.key;
291 m_node.value = m_start->value_leaf.value;
295 const typename fst_type::node* m_start;
296 const typename fst_type::node* m_end;
Definition: flat_segment_tree_itr.hpp:95
Definition: flat_segment_tree_itr.hpp:186
Definition: flat_segment_tree_itr.hpp:197
Definition: flat_segment_tree_itr.hpp:38
Definition: flat_segment_tree_itr.hpp:68