29 #ifndef INCLUDED_MDDS_MULTI_TYPE_VECTOR_SOA_MAIN_HPP
30 #define INCLUDED_MDDS_MULTI_TYPE_VECTOR_SOA_MAIN_HPP
32 #include "../../global.hpp"
33 #include "../types.hpp"
34 #include "../util.hpp"
35 #include "./block_util.hpp"
36 #include "./iterator.hpp"
38 namespace mdds {
namespace mtv {
namespace soa {
67 template<
typename ElemBlockFunc,
typename Trait = mdds::mtv::default_trait>
71 using size_type = std::size_t;
74 using element_category_type = mdds::mtv::element_t;
75 using element_block_func = ElemBlockFunc;
97 struct block_slot_type
104 block_slot_type(size_type _position, size_type _size) :
110 std::vector<size_type> positions;
111 std::vector<size_type> sizes;
112 std::vector<element_block_type*> element_blocks;
115 blocks_type(
const blocks_type& other);
119 positions.pop_back();
121 element_blocks.pop_back();
124 void push_back(size_type pos, size_type
size, element_block_type* data)
126 positions.push_back(pos);
127 sizes.push_back(
size);
128 element_blocks.push_back(data);
131 void push_back(
const block_slot_type& slot)
133 positions.push_back(slot.position);
134 sizes.push_back(slot.size);
135 element_blocks.push_back(slot.element_block);
138 void erase(size_type index);
139 void erase(size_type index, size_type
size);
141 void insert(size_type index, size_type pos, size_type
size, element_block_type* data);
142 void insert(size_type index,
const blocks_type& new_blocks);
150 void calc_block_position(size_type index);
152 size_type calc_next_block_position(size_type index);
154 void swap(size_type index1, size_type index2);
156 void swap(blocks_type& other);
158 void reserve(size_type n);
160 bool equals(
const blocks_type& other)
const;
164 void check_integrity()
const;
167 struct blocks_to_transfer
170 size_type insert_index = 0;
173 struct iterator_trait
176 using positions_type = std::vector<size_type>;
177 using sizes_type = std::vector<size_type>;
178 using element_blocks_type = std::vector<element_block_type*>;
180 using positions_iterator_type =
typename positions_type::iterator;
181 using sizes_iterator_type =
typename sizes_type::iterator;
182 using element_blocks_iterator_type =
typename element_blocks_type::iterator;
187 struct const_iterator_trait
190 using positions_type = std::vector<size_type>;
191 using sizes_type = std::vector<size_type>;
192 using element_blocks_type = std::vector<element_block_type*>;
194 using positions_iterator_type =
typename positions_type::const_iterator;
195 using sizes_iterator_type =
typename sizes_type::const_iterator;
196 using element_blocks_iterator_type =
typename element_blocks_type::const_iterator;
201 struct reverse_iterator_trait
204 using positions_type = std::vector<size_type>;
205 using sizes_type = std::vector<size_type>;
206 using element_blocks_type = std::vector<element_block_type*>;
208 using positions_iterator_type =
typename positions_type::reverse_iterator;
209 using sizes_iterator_type =
typename sizes_type::reverse_iterator;
210 using element_blocks_iterator_type =
typename element_blocks_type::reverse_iterator;
215 struct const_reverse_iterator_trait
218 using positions_type = std::vector<size_type>;
219 using sizes_type = std::vector<size_type>;
220 using element_blocks_type = std::vector<element_block_type*>;
222 using positions_iterator_type =
typename positions_type::const_reverse_iterator;
223 using sizes_iterator_type =
typename sizes_type::const_reverse_iterator;
224 using element_blocks_iterator_type =
typename element_blocks_type::const_reverse_iterator;
229 struct element_block_deleter
231 void operator() (
const element_block_type* p)
233 element_block_func::delete_block(p);
239 using iterator = detail::iterator_base<iterator_trait>;
240 using const_iterator = detail::const_iterator_base<const_iterator_trait, iterator>;
242 using reverse_iterator = detail::iterator_base<reverse_iterator_trait>;
243 using const_reverse_iterator = detail::const_iterator_base<const_reverse_iterator_trait, reverse_iterator>;
245 using position_type = std::pair<iterator, size_type>;
246 using const_position_type = std::pair<const_iterator, size_type>;
325 template<
typename _Blk>
326 static typename _Blk::value_type
get(
const const_position_type& pos);
815 void erase(size_type start_pos, size_type end_pos);
923 void get(size_type pos, T& value)
const;
937 T
get(size_type pos)
const;
1111 template<
typename T>
1114 #ifdef MDDS_MULTI_TYPE_VECTOR_DEBUG
1115 void dump_blocks(std::ostream& os)
const;
1117 void check_block_integrity()
const;
1121 void delete_element_block(size_type block_index);
1123 void delete_element_blocks(size_type start, size_type end);
1125 template<
typename T>
1126 bool set_cells_precheck(
1127 size_type row,
const T& it_begin,
const T& it_end, size_type& end_pos);
1129 template<
typename T>
1130 iterator set_impl(size_type pos, size_type block_index,
const T& value);
1132 template<
typename T>
1133 iterator release_impl(size_type pos, size_type block_index, T& value);
1136 multi_type_vector& other, size_type start_pos, size_type end_pos, size_type other_pos,
1137 size_type block_index1, size_type block_index2, size_type dblock_index1, size_type dblock_index2);
1139 void swap_single_block(
1140 multi_type_vector& other, size_type start_pos, size_type end_pos, size_type other_pos,
1141 size_type block_index, size_type other_block_index);
1143 void swap_single_to_multi_blocks(
1144 multi_type_vector& other, size_type start_pos, size_type end_pos, size_type other_pos,
1145 size_type block_index, size_type dst_block_index1, size_type dst_block_index2);
1147 void swap_multi_to_multi_blocks(
1148 multi_type_vector& other, size_type start_pos, size_type end_pos, size_type other_pos,
1149 size_type block_index1, size_type block_index2, size_type dblock_index1, size_type dblock_index2);
1151 template<
typename T>
1152 iterator insert_cells_impl(size_type row, size_type block_index,
const T& it_begin,
const T& it_end);
1154 void resize_impl(size_type new_size);
1161 size_type start_pos, size_type end_pos, size_type block_index1, size_type block_index2,
1173 size_type start_pos, size_type end_pos, size_type block_index1,
bool overwrite);
1175 iterator set_empty_in_single_block(
1176 size_type start_row, size_type end_row, size_type block_index,
bool overwrite);
1187 iterator set_empty_in_multi_blocks(
1188 size_type start_row, size_type end_row, size_type block_index1, size_type block_index2,
1191 void erase_impl(size_type start_pos, size_type end_pos);
1192 void erase_in_single_block(size_type start_pos, size_type end_pos, size_type block_index);
1199 iterator insert_empty_impl(size_type pos, size_type block_index, size_type length);
1201 void insert_blocks_at(size_type
position, size_type insert_pos, blocks_type& new_blocks);
1203 void prepare_blocks_to_transfer(
1204 blocks_to_transfer& bucket, size_type block_index1, size_type offset1, size_type block_index2, size_type offset2);
1206 iterator set_whole_block_empty(size_type block_index,
bool overwrite);
1208 template<
typename T>
1209 iterator push_back_impl(
const T& value);
1211 template<
typename T>
1213 size_type row, size_type end_row, size_type block_index1,
const T& it_begin,
const T& it_end);
1215 template<
typename T>
1216 iterator set_cells_to_single_block(
1217 size_type start_row, size_type end_row, size_type block_index,
1218 const T& it_begin,
const T& it_end);
1220 template<
typename T>
1221 iterator set_cells_to_multi_blocks(
1222 size_type start_row, size_type end_row, size_type block_index1, size_type block_index2,
1223 const T& it_begin,
const T& it_end);
1225 template<
typename T>
1226 iterator set_cells_to_multi_blocks_block1_non_equal(
1227 size_type start_row, size_type end_row, size_type block_index1, size_type block_index2,
1228 const T& it_begin,
const T& it_end);
1230 template<
typename T>
1231 iterator set_cells_to_multi_blocks_block1_non_empty(
1232 size_type start_row, size_type end_row, size_type block_index1, size_type block_index2,
1233 const T& it_begin,
const T& it_end);
1235 template<
typename T>
1236 iterator set_cell_to_empty_block(size_type block_index, size_type pos_in_block,
const T& cell);
1238 template<
typename T>
1239 iterator set_cell_to_non_empty_block_of_size_one(size_type block_index,
const T& cell);
1250 size_type get_block_position(size_type row, size_type start_block_index=0)
const;
1256 size_type get_block_position(
const const_iterator& pos_hint, size_type row)
const;
1258 template<
typename T>
1259 void create_new_block_with_new_cell(size_type block_index,
const T& cell);
1261 template<
typename T>
1262 void append_cell_to_block(size_type block_index,
const T& cell);
1271 template<
typename T>
1272 bool append_to_prev_block(
1273 size_type block_index, element_category_type cat, size_type length,
1274 const T& it_begin,
const T& it_end);
1276 template<
typename T>
1277 void insert_cells_to_middle(
1278 size_type row, size_type block_index,
const T& it_begin,
const T& it_end);
1280 template<
typename T>
1281 iterator set_cell_to_middle_of_block(
1282 size_type block_index, size_type pos_in_block,
const T& cell);
1289 template<
typename T>
1290 void set_cell_to_top_of_data_block(size_type block_index,
const T& cell);
1292 template<
typename T>
1293 void set_cell_to_bottom_of_data_block(size_type block_index,
const T& cell);
1296 size_type start_pos, size_type end_pos, size_type block_index1,
1303 size_type start_pos, size_type end_pos, size_type block_index1,
1314 size_type merge_with_adjacent_blocks(size_type block_index);
1323 bool merge_with_next_block(size_type block_index);
1338 size_type set_new_block_to_middle(
1339 size_type block_index, size_type offset, size_type new_block_size,
bool overwrite);
1350 bool is_previous_block_of_type(size_type block_index, element_category_type cat)
const;
1361 bool is_next_block_of_type(size_type block_index, element_category_type cat)
const;
1385 const element_block_type& src_data, size_type src_offset, size_type dst_index, size_type dst_offset, size_type len);
1387 void exchange_elements(
1389 size_type dst_index1, size_type dst_offset1, size_type dst_index2, size_type dst_offset2,
1390 size_type len, blocks_type& new_blocks);
1392 bool append_empty(size_type len);
1394 inline iterator get_iterator(size_type block_index)
1396 auto iter_pos = m_block_store.positions.begin();
1397 std::advance(iter_pos, block_index);
1398 auto iter_size = m_block_store.sizes.begin();
1399 std::advance(iter_size, block_index);
1400 auto iter_elem = m_block_store.element_blocks.begin();
1401 std::advance(iter_elem, block_index);
1404 { iter_pos, iter_size, iter_elem },
1405 { m_block_store.positions.end(), m_block_store.sizes.end(), m_block_store.element_blocks.end() },
1410 inline const_iterator get_const_iterator(size_type block_index)
const
1412 auto iter_pos = m_block_store.positions.cbegin();
1413 std::advance(iter_pos, block_index);
1414 auto iter_size = m_block_store.sizes.cbegin();
1415 std::advance(iter_size, block_index);
1416 auto iter_elem = m_block_store.element_blocks.cbegin();
1417 std::advance(iter_elem, block_index);
1419 return const_iterator(
1420 { iter_pos, iter_size, iter_elem },
1421 { m_block_store.positions.cend(), m_block_store.sizes.cend(), m_block_store.element_blocks.cend() },
1427 using adjust_block_positions_func =
1428 detail::adjust_block_positions<blocks_type, Trait::loop_unrolling>;
1431 blocks_type m_block_store;
1432 size_type m_cur_size;
1437 #include "main_def.inl"
Definition: types.hpp:113
Definition: types.hpp:122
Definition: soa/iterator.hpp:314
Definition: soa/iterator.hpp:241
Definition: soa/main.hpp:69
iterator set(size_type pos, const T &value)
iterator release_range(const iterator &pos_hint, size_type start_pos, size_type end_pos)
multi_type_vector(event_func &&hdl)
iterator set_empty(const iterator &pos_hint, size_type start_pos, size_type end_pos)
void swap(size_type start_pos, size_type end_pos, multi_type_vector &other, size_type other_pos)
void swap(multi_type_vector &other)
multi_type_vector(const multi_type_vector &other)
static mtv::element_t get_element_type(const T &elem)
iterator set_empty(size_type start_pos, size_type end_pos)
static const_position_type advance_position(const const_position_type &pos, int steps)
const_position_type position(size_type pos) const
size_type block_size() const
const_position_type position(const const_iterator &pos_hint, size_type pos) const
position_type position(size_type pos)
iterator set(size_type pos, const T &it_begin, const T &it_end)
static position_type advance_position(const position_type &pos, int steps)
multi_type_vector(size_type init_size)
iterator set(const iterator &pos_hint, size_type pos, const T &value)
iterator release(size_type pos, T &value)
mtv::element_t get_type(size_type pos) const
bool is_empty(size_type pos) const
iterator release(const iterator &pos_hint, size_type pos, T &value)
typename Trait::event_func event_func
Definition: soa/main.hpp:94
static position_type next_position(const position_type &pos)
iterator set(const iterator &pos_hint, size_type pos, const T &it_begin, const T &it_end)
static size_type logical_position(const const_position_type &pos)
iterator insert_empty(const iterator &pos_hint, size_type pos, size_type length)
multi_type_vector(const event_func &hdl)
multi_type_vector(size_type init_size, const T &value)
iterator insert(size_type pos, const T &it_begin, const T &it_end)
multi_type_vector(size_type init_size, const T &it_begin, const T &it_end)
void get(size_type pos, T &value) const
void resize(size_type new_size)
iterator transfer(const iterator &pos_hint, size_type start_pos, size_type end_pos, multi_type_vector &dest, size_type dest_pos)
iterator insert_empty(size_type pos, size_type length)
iterator release_range(size_type start_pos, size_type end_pos)
T get(size_type pos) const
position_type position(const iterator &pos_hint, size_type pos)
iterator transfer(size_type start_pos, size_type end_pos, multi_type_vector &dest, size_type dest_pos)
iterator push_back_empty()
static const_position_type next_position(const const_position_type &pos)
iterator push_back(const T &value)
void erase(size_type start_pos, size_type end_pos)
iterator insert(const iterator &pos_hint, size_type pos, const T &it_begin, const T &it_end)
static _Blk::value_type get(const const_position_type &pos)
Definition: iterator_node.hpp:101
Definition: iterator_node.hpp:92