mdds
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 
13 namespace mdds { namespace mtv {
14 
15 template<typename _MtvT>
16 class collection;
17 
18 namespace detail {
19 
20 template<typename _MtvT>
22 {
23  typedef _MtvT mtv_type;
24  friend collection<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 
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 
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 
91 public:
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 
125 template<typename _MtvT>
126 class collection
127 {
128 public:
129  typedef _MtvT mtv_type;
130  typedef typename mtv_type::size_type size_type;
131 
132 private:
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 
149 public:
151 
152  collection();
153 
163  template<typename _T>
164  collection(const _T& begin, const _T& end);
165 
172  const_iterator begin() const;
173 
181  const_iterator end() const;
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 
233 private:
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:16
const_iterator begin() const
const_iterator end() const
detail::side_iterator< mtv_type > const_iterator
collection range.
Definition: collection.hpp:150
size_type size() const
void swap(collection &other)
Definition: cref_wrapper.hpp:12
void set_element_range(size_type start, size_type size)
void set_collection_range(size_type start, size_type size)
Definition: collection.hpp:21