28 #ifndef INCLUDED_MDDS_MULTI_TYPE_VECTOR_DIR_AOS_ITERATOR_HPP
29 #define INCLUDED_MDDS_MULTI_TYPE_VECTOR_DIR_AOS_ITERATOR_HPP
31 #include "../iterator_node.hpp"
35 namespace mdds {
namespace mtv {
namespace aos {
namespace detail {
42 template<
typename _Trait>
46 typedef typename _Trait::parent parent_type;
47 typedef typename _Trait::blocks blocks_type;
48 typedef typename _Trait::base_iterator base_iterator_type;
50 typedef typename parent_type::size_type size_type;
56 const base_iterator_type& pos,
const base_iterator_type& end, size_type block_index) :
57 m_cur_node(block_index),
66 m_cur_node(other.m_cur_node),
74 #ifdef MDDS_MULTI_TYPE_VECTOR_DEBUG
76 throw general_error(
"Current node position should never equal the end position during node update.");
79 const typename blocks_type::value_type& blk = *m_pos;
81 m_cur_node.type = mdds::mtv::get_block_type(*blk.data);
83 m_cur_node.type = mdds::mtv::element_type_empty;
85 m_cur_node.position = blk.position;
86 m_cur_node.size = blk.size;
87 m_cur_node.data = blk.data;
108 base_iterator_type m_pos;
109 base_iterator_type m_end;
114 if (m_pos != m_end && other.m_pos != other.m_end)
118 if (m_cur_node != other.m_cur_node)
121 return m_pos == other.m_pos && m_end == other.m_end;
126 return !operator==(other);
131 m_cur_node = other.m_cur_node;
139 m_cur_node.swap(other.m_cur_node);
140 std::swap(m_pos, other.m_pos);
141 std::swap(m_end, other.m_end);
144 const node& get_node()
const {
return m_cur_node; }
145 const base_iterator_type& get_pos()
const {
return m_pos; }
146 const base_iterator_type& get_end()
const {
return m_end; }
149 template<
typename _Trait,
typename _NodeUpdateFunc>
152 typedef _Trait trait;
153 typedef _NodeUpdateFunc node_update_func;
156 typedef typename trait::base_iterator base_iterator_type;
157 typedef typename common_base::size_type size_type;
159 using common_base::inc;
160 using common_base::dec;
161 using common_base::m_cur_node;
165 using common_base::get_pos;
166 using common_base::get_end;
172 typedef ptrdiff_t difference_type;
173 typedef std::bidirectional_iterator_tag iterator_category;
178 const base_iterator_type& pos,
const base_iterator_type& end, size_type block_index) :
203 node_update_func::inc(m_cur_node);
211 node_update_func::dec(m_cur_node);
216 template<
typename _Trait,
typename _NodeUpdateFunc,
typename _NonConstItrBase>
219 typedef _Trait trait;
220 typedef _NodeUpdateFunc node_update_func;
223 typedef typename trait::base_iterator base_iterator_type;
224 typedef typename common_base::size_type size_type;
226 using common_base::inc;
227 using common_base::dec;
228 using common_base::m_cur_node;
232 using common_base::get_pos;
233 using common_base::get_end;
235 typedef _NonConstItrBase iterator_base;
241 typedef ptrdiff_t difference_type;
242 typedef std::bidirectional_iterator_tag iterator_category;
247 const base_iterator_type& pos,
const base_iterator_type& end, size_type block_index) :
257 other.get_node().__private_data.block_index) {}
259 const value_type& operator*()
const
264 const value_type* operator->()
const
269 const_iterator_base& operator++()
271 node_update_func::inc(m_cur_node);
276 const_iterator_base& operator--()
279 node_update_func::dec(m_cur_node);
283 bool operator== (
const const_iterator_base& other)
const
285 return iterator_common_base<_Trait>::operator==(other);
288 bool operator!= (
const const_iterator_base& other)
const
290 return iterator_common_base<_Trait>::operator!=(other);
Definition: global.hpp:82
Definition: aos/iterator.hpp:218
const_iterator_base(const iterator_base &other)
Definition: aos/iterator.hpp:253
Definition: aos/iterator.hpp:151
Definition: aos/iterator.hpp:44