28 #ifndef INCLUDED_MDDS_COLLECTION_HPP
29 #define INCLUDED_MDDS_COLLECTION_HPP
31 #include "mdds/multi_type_vector_types.hpp"
33 #include <type_traits>
37 namespace mdds {
namespace mtv {
39 template<
typename _MtvT>
44 template<
typename _MtvT>
47 typedef _MtvT mtv_type;
48 friend collection<mtv_type>;
50 typedef typename mtv_type::size_type size_type;
51 typedef typename mtv_type::const_iterator const_iterator;
52 typedef typename mtv_type::const_position_type const_position_type;
57 const mtv_type* vector;
58 const_iterator block_pos;
59 const_iterator block_end;
61 mtv_item(
const mtv_type* v,
const const_iterator& bp,
const const_iterator& be) :
62 vector(v), block_pos(bp), block_end(be) {}
68 friend class side_iterator;
71 mdds::mtv::element_t type;
79 template<
typename _Blk>
80 typename _Blk::value_type get()
const
82 return _Blk::get_value(*__position.first->data, __position.second);
87 const_position_type __position;
90 enum begin_state_type { begin_state };
91 enum end_state_type { end_state };
93 std::vector<mtv_item> m_vectors;
96 size_type m_elem_pos_end;
97 size_type m_index_offset;
101 std::vector<mtv_item>&& vectors, size_type elem_pos, size_type elem_size,
102 size_type index_offset, uintptr_t identity, begin_state_type);
105 std::vector<mtv_item>&& vectors, size_type elem_pos, size_type elem_size,
106 size_type index_offset, uintptr_t identity, end_state_type);
109 typedef node value_type;
113 template<
typename _T>
116 const value_type& operator*()
const
121 const value_type* operator->()
const
126 side_iterator& operator++();
128 side_iterator operator++(
int);
130 bool operator== (
const side_iterator& other)
const;
131 bool operator!= (
const side_iterator& other)
const;
142 template<
typename _MtvT>
146 typedef _MtvT mtv_type;
147 typedef typename mtv_type::size_type size_type;
156 range() : start(0),
size(0) {}
159 std::vector<const mtv_type*> m_vectors;
160 size_type m_mtv_size;
161 uintptr_t m_identity;
181 template<
typename _T>
182 collection(
const _T&
begin,
const _T&
end);
208 size_type
size()
const;
253 void check_collection_range(size_type start, size_type
size)
const;
254 void check_element_range(size_type start, size_type
size)
const;
256 std::vector<typename const_iterator::mtv_item> build_iterator_state()
const;
258 void init_insert_vector(
const std::unique_ptr<mtv_type>& p);
260 void init_insert_vector(
const std::shared_ptr<mtv_type>& p);
262 template<
typename _T>
263 void init_insert_vector(
const _T& t,
typename std::enable_if<std::is_pointer<_T>::value>::type* = 0);
265 template<
typename _T>
266 void init_insert_vector(
const _T& t,
typename std::enable_if<!std::is_pointer<_T>::value>::type* = 0);
268 void check_vector_size(
const mtv_type& t);
273 #include "collection_def.inl"