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)
217 return m_start == other.m_start && m_end == other.m_end;
222 return !operator==(other);
227 m_start = other.m_start;
247 m_start = m_start->next.get();
248 m_end = m_start->next.get();
257 m_start = m_start->next.get();
258 m_end = m_start->next.get();
266 m_start = m_start->prev.get();
267 m_end = m_start->next.get();
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:37
Definition: flat_segment_tree_itr.hpp:196
Definition: flat_segment_tree.hpp:46
Definition: flat_segment_tree_itr.hpp:67
Definition: flat_segment_tree_itr.hpp:94
Definition: flat_segment_tree_itr.hpp:185