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;
205 m_start(other.m_start), m_end(other.m_end)
215 return m_start == other.m_start && m_end == other.m_end;
220 return !operator==(other);
225 m_start = other.m_start;
245 m_start = m_start->next.get();
246 m_end = m_start->next.get();
255 m_start = m_start->next.get();
256 m_end = m_start->next.get();
264 m_start = m_start->prev.get();
265 m_end = m_start->next.get();
274 m_start = m_start->prev.get();
275 m_end = m_start->next.get();
287 m_node.start = m_start->value_leaf.key;
288 m_node.end = m_end->value_leaf.key;
289 m_node.value = m_start->value_leaf.value;
293 const typename fst_type::node* m_start;
294 const typename fst_type::node* m_end;
Definition: flat_segment_tree_itr.hpp:37
Definition: flat_segment_tree_itr.hpp:196
Definition: default_deleter.hpp:33
Definition: flat_segment_tree_itr.hpp:67
Definition: flat_segment_tree_itr.hpp:94
Definition: flat_segment_tree_itr.hpp:185