mdds
Loading...
Searching...
No Matches
collection.hpp
1// SPDX-FileCopyrightText: 2016 - 2025 Kohei Yoshida
2//
3// SPDX-License-Identifier: MIT
4
5#pragma once
6
7#include "mdds/multi_type_vector/types.hpp"
8
9#include <type_traits>
10#include <vector>
11#include <memory>
12
13namespace mdds { namespace mtv {
14
15template<typename _MtvT>
16class collection;
17
18namespace detail {
19
20template<typename _MtvT>
21class side_iterator
22{
23 typedef _MtvT mtv_type;
25
26 typedef typename mtv_type::size_type size_type;
27 typedef typename mtv_type::const_iterator const_iterator;
28 typedef typename mtv_type::const_position_type const_position_type;
29
31 struct mtv_item
32 {
33 const mtv_type* vector;
34 const_iterator block_pos;
35 const_iterator block_end;
36
37 mtv_item(const mtv_type* v, const const_iterator& bp, const const_iterator& be)
38 : vector(v), block_pos(bp), block_end(be)
39 {}
40 };
41
43 struct node
44 {
45 friend class side_iterator;
46
48 mdds::mtv::element_t type;
49
51 size_type index;
52
54 size_type position;
55
56 template<typename _Blk>
57 typename _Blk::value_type get() const
58 {
59 return _Blk::get_value(*__position.first->data, __position.second);
60 }
61
62 private:
64 const_position_type __position;
65 };
66
67 enum begin_state_type
68 {
69 begin_state
70 };
71 enum end_state_type
72 {
73 end_state
74 };
75
76 std::vector<mtv_item> m_vectors;
77 node m_cur_node;
78 size_type m_elem_pos;
79 size_type m_elem_pos_end;
80 size_type m_index_offset;
81 uintptr_t m_identity;
82
83 side_iterator(
84 std::vector<mtv_item>&& vectors, size_type elem_pos, size_type elem_size, size_type index_offset,
85 uintptr_t identity, begin_state_type);
86
87 side_iterator(
88 std::vector<mtv_item>&& vectors, size_type elem_pos, size_type elem_size, size_type index_offset,
89 uintptr_t identity, end_state_type);
90
91public:
92 typedef node value_type;
93
94 side_iterator();
95
96 template<typename _T>
97 side_iterator(const _T& begin, const _T& end);
98
99 const value_type& operator*() const
100 {
101 return m_cur_node;
102 }
103
104 const value_type* operator->() const
105 {
106 return &m_cur_node;
107 }
108
109 side_iterator& operator++();
110
111 side_iterator operator++(int);
112
113 bool operator==(const side_iterator& other) const;
114 bool operator!=(const side_iterator& other) const;
115};
116
117} // namespace detail
118
125template<typename _MtvT>
126class collection
127{
128public:
129 typedef _MtvT mtv_type;
130 typedef typename mtv_type::size_type size_type;
131
132private:
133 struct range
134 {
135 size_type start;
136 size_type size;
137
138 range() : start(0), size(0)
139 {}
140 };
141
142 std::vector<const mtv_type*> m_vectors;
143 size_type m_mtv_size;
144 uintptr_t m_identity;
145
146 range m_elem_range;
147 range m_col_range;
148
149public:
151
152 collection();
153
163 template<typename _T>
164 collection(const _T& begin, const _T& end);
165
173
182
190 size_type size() const;
191
197 void swap(collection& other);
198
213 void set_collection_range(size_type start, size_type size);
214
231 void set_element_range(size_type start, size_type size);
232
233private:
234 void check_collection_range(size_type start, size_type size) const;
235 void check_element_range(size_type start, size_type size) const;
236
237 std::vector<typename const_iterator::mtv_item> build_iterator_state() const;
238
239 void init_insert_vector(const std::unique_ptr<mtv_type>& p);
240
241 void init_insert_vector(const std::shared_ptr<mtv_type>& p);
242
243 template<typename _T>
244 void init_insert_vector(const _T& t, typename std::enable_if<std::is_pointer<_T>::value>::type* = 0);
245
246 template<typename _T>
247 void init_insert_vector(const _T& t, typename std::enable_if<!std::is_pointer<_T>::value>::type* = 0);
248
249 void check_vector_size(const mtv_type& t);
250};
251
252}} // namespace mdds::mtv
253
254#include "collection_def.inl"
Definition collection.hpp:127
const_iterator end() const
detail::side_iterator< mtv_type > const_iterator
collection range.
Definition collection.hpp:150
void swap(collection &other)
collection(const _T &begin, const _T &end)
size_type size() const
void set_element_range(size_type start, size_type size)
const_iterator begin() const
void set_collection_range(size_type start, size_type size)
Definition collection.hpp:22