29 #ifndef INCLUDED_MDDS_MULTI_TYPE_VECTOR_DIR_AOS_MAIN_HPP
30 #define INCLUDED_MDDS_MULTI_TYPE_VECTOR_DIR_AOS_MAIN_HPP
32 #include "../../global.hpp"
33 #include "../types.hpp"
34 #include "../util.hpp"
35 #include "./iterator.hpp"
36 #include "./block_util.hpp"
38 #ifdef MDDS_MULTI_TYPE_VECTOR_DEBUG
42 namespace mdds {
namespace mtv {
namespace aos {
71 template<
typename ElemBlockFunc,
typename Trait = mdds::mtv::default_trait>
75 typedef size_t size_type;
78 typedef mdds::mtv::element_t element_category_type;
79 typedef ElemBlockFunc element_block_func;
109 block(size_type _position, size_type _size);
111 block(
const block& other) =
default;
112 block(block&& other) =
default;
114 void swap(block& other);
115 void clone_to(block& other)
const;
117 block& operator=(
const block&) =
default;
120 struct element_block_deleter
122 void operator() (
const element_block_type* p)
124 element_block_func::delete_block(p);
128 typedef std::vector<block> blocks_type;
130 struct blocks_to_transfer
133 size_type insert_index;
135 blocks_to_transfer();
138 struct iterator_trait
141 typedef blocks_type blocks;
142 typedef typename blocks_type::iterator base_iterator;
145 struct reverse_iterator_trait
148 typedef blocks_type blocks;
149 typedef typename blocks_type::reverse_iterator base_iterator;
152 struct const_iterator_trait
155 typedef blocks_type blocks;
156 typedef typename blocks_type::const_iterator base_iterator;
159 struct const_reverse_iterator_trait
162 typedef blocks_type blocks;
163 typedef typename blocks_type::const_reverse_iterator base_iterator;
172 typedef detail::iterator_base<iterator_trait, itr_forward_update> iterator;
173 typedef detail::iterator_base<reverse_iterator_trait, itr_no_update> reverse_iterator;
175 typedef detail::const_iterator_base<const_iterator_trait, itr_forward_update, iterator> const_iterator;
176 typedef detail::const_iterator_base<const_reverse_iterator_trait, itr_no_update, reverse_iterator> const_reverse_iterator;
195 typedef std::pair<iterator, size_type> position_type;
196 typedef std::pair<const_iterator, size_type> const_position_type;
258 template<
typename Blk>
259 static typename Blk::value_type
get(
const const_position_type& pos);
573 void get(size_type pos, T& value)
const;
587 T
get(size_type pos)
const;
910 void erase(size_type start_pos, size_type end_pos);
1051 template<
typename T>
1054 #ifdef MDDS_MULTI_TYPE_VECTOR_DEBUG
1055 void dump_blocks(std::ostream& os)
const;
1057 void check_block_integrity()
const;
1068 void delete_element_block(block& blk);
1077 void delete_element_blocks(
typename blocks_type::iterator it,
typename blocks_type::iterator it_end);
1079 template<
typename T>
1080 iterator set_impl(size_type pos, size_type block_index,
const T& value);
1082 template<
typename T>
1083 iterator release_impl(size_type pos, size_type block_index, T& value);
1085 template<
typename T>
1086 iterator push_back_impl(
const T& value);
1097 size_type get_block_position(size_type row, size_type start_block_index=0)
const;
1103 size_type get_block_position(
const const_iterator& pos_hint, size_type row)
const;
1105 void resize_impl(size_type new_size);
1107 template<
typename T>
1110 template<
typename T>
1111 iterator set_cell_to_middle_of_block(
1112 size_type block_index, size_type pos_in_block,
const T& cell);
1114 template<
typename T>
1115 void append_cell_to_block(size_type block_index,
const T& cell);
1117 template<
typename T>
1118 iterator set_cell_to_empty_block(size_type block_index, size_type pos_in_block,
const T& cell);
1120 template<
typename T>
1121 iterator set_cell_to_block_of_size_one(
1122 size_type block_index,
const T& cell);
1124 template<
typename T>
1125 void set_cell_to_top_of_data_block(
1126 size_type block_index,
const T& cell);
1128 template<
typename T>
1129 void set_cell_to_bottom_of_data_block(
1130 size_type block_index,
const T& cell);
1133 size_type start_pos, size_type end_pos, size_type block_index1,
1140 size_type start_pos, size_type end_pos, size_type block_index1,
1148 size_type start_pos, size_type end_pos, size_type block_index1, size_type block_index2,
1160 size_type start_pos, size_type end_pos, size_type block_index1,
bool overwrite);
1163 multi_type_vector& other, size_type start_pos, size_type end_pos, size_type other_pos,
1164 size_type block_index1, size_type block_index2, size_type dblock_index1, size_type dblock_index2);
1166 void swap_single_block(
1167 multi_type_vector& other, size_type start_pos, size_type end_pos, size_type other_pos,
1168 size_type block_index, size_type other_block_index);
1170 void swap_single_to_multi_blocks(
1171 multi_type_vector& other, size_type start_pos, size_type end_pos, size_type other_pos,
1172 size_type block_index, size_type dst_block_index1, size_type dst_block_index2);
1174 void swap_multi_to_multi_blocks(
1175 multi_type_vector& other, size_type start_pos, size_type end_pos, size_type other_pos,
1176 size_type block_index1, size_type block_index2, size_type dblock_index1, size_type dblock_index2);
1178 void insert_blocks_at(size_type
position, size_type insert_pos, blocks_type& new_blocks);
1180 void prepare_blocks_to_transfer(blocks_to_transfer& bucket, size_type block_index1, size_type offset1, size_type block_index2, size_type offset2);
1182 iterator set_whole_block_empty(size_type block_index,
bool overwrite);
1184 iterator set_empty_in_single_block(
1185 size_type start_row, size_type end_row, size_type block_index,
bool overwrite);
1196 iterator set_empty_in_multi_blocks(
1197 size_type start_row, size_type end_row, size_type block_index1, size_type block_index2,
1200 void erase_impl(size_type start_pos, size_type end_pos);
1201 void erase_in_single_block(size_type start_pos, size_type end_pos, size_type block_pos);
1208 iterator insert_empty_impl(size_type pos, size_type block_index, size_type length);
1210 template<
typename T>
1212 size_type row, size_type end_row, size_type block_index1,
const T& it_begin,
const T& it_end);
1214 template<
typename T>
1215 iterator insert_cells_impl(size_type row, size_type block_index,
const T& it_begin,
const T& it_end);
1217 template<
typename T>
1218 iterator set_cells_to_single_block(
1219 size_type start_row, size_type end_row, size_type block_index,
1220 const T& it_begin,
const T& it_end);
1222 template<
typename T>
1223 iterator set_cells_to_multi_blocks(
1224 size_type start_row, size_type end_row, size_type block_index1, size_type block_index2,
1225 const T& it_begin,
const T& it_end);
1227 template<
typename T>
1228 iterator set_cells_to_multi_blocks_block1_non_equal(
1229 size_type start_row, size_type end_row, size_type block_index1, size_type block_index2,
1230 const T& it_begin,
const T& it_end);
1232 template<
typename T>
1233 iterator set_cells_to_multi_blocks_block1_non_empty(
1234 size_type start_row, size_type end_row, size_type block_index1, size_type block_index2,
1235 const T& it_begin,
const T& it_end);
1245 size_type merge_with_adjacent_blocks(size_type block_index);
1254 bool merge_with_next_block(size_type block_index);
1256 template<
typename T>
1257 bool append_to_prev_block(
1258 size_type block_index, element_category_type cat, size_type length,
1259 const T& it_begin,
const T& it_end);
1261 template<
typename T>
1262 void insert_cells_to_middle(
1263 size_type row, size_type block_index,
const T& it_begin,
const T& it_end);
1278 block& set_new_block_to_middle(
1279 size_type block_index, size_type offset, size_type new_block_size,
bool overwrite);
1281 block* get_previous_block_of_type(size_type block_index, element_category_type cat);
1290 block* get_next_block_of_type(size_type block_index, element_category_type cat);
1310 const element_block_type& src_data, size_type src_offset, size_type dst_index, size_type dst_offset, size_type len);
1312 void exchange_elements(
1314 size_type dst_index1, size_type dst_offset1, size_type dst_index2, size_type dst_offset2,
1315 size_type len, blocks_type& new_blocks);
1317 bool append_empty(size_type len);
1319 inline iterator get_iterator(size_type block_index)
1321 typename blocks_type::iterator block_pos = m_blocks.begin();
1322 std::advance(block_pos, block_index);
1323 return iterator(block_pos, m_blocks.end(), block_index);
1326 inline const_iterator get_const_iterator(size_type block_index)
const
1328 typename blocks_type::const_iterator block_pos = m_blocks.begin();
1329 std::advance(block_pos, block_index);
1330 return const_iterator(block_pos, m_blocks.end(), block_index);
1334 using adjust_block_positions_func =
1335 detail::adjust_block_positions<blocks_type, Trait::loop_unrolling>;
1338 blocks_type m_blocks;
1339 size_type m_cur_size;
1344 #include "main_def.inl"
Definition: aos/iterator.hpp:218
Definition: aos/iterator.hpp:151
Definition: aos/main.hpp:73
iterator set(const iterator &pos_hint, size_type pos, const T &it_begin, const T &it_end)
static const_position_type advance_position(const const_position_type &pos, int steps)
const_position_type position(const const_iterator &pos_hint, size_type pos) const
iterator set(size_type pos, const T &value)
itr_node value_type
Definition: aos/main.hpp:193
iterator insert_empty(size_type pos, size_type length)
typename Trait::event_func event_func
Definition: aos/main.hpp:98
void get(size_type pos, T &value) const
position_type position(const iterator &pos_hint, size_type pos)
iterator set_empty(size_type start_pos, size_type end_pos)
multi_type_vector(multi_type_vector &&other)
multi_type_vector(size_type init_size, const T &value)
mtv::element_t get_type(size_type pos) const
iterator transfer(const iterator &pos_hint, size_type start_pos, size_type end_pos, multi_type_vector &dest, size_type dest_pos)
static Blk::value_type get(const const_position_type &pos)
iterator push_back_empty()
static const_position_type next_position(const const_position_type &pos)
iterator set(size_type pos, const T &it_begin, const T &it_end)
multi_type_vector(const event_func &hdl)
void swap(multi_type_vector &other)
multi_type_vector(event_func &&hdl)
position_type position(size_type pos)
static size_type logical_position(const const_position_type &pos)
iterator push_back(const T &value)
void resize(size_type new_size)
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)
bool is_empty(size_type pos) const
multi_type_vector(size_type init_size)
const_position_type position(size_type pos) const
static mtv::element_t get_element_type(const T &elem)
size_type block_size() const
multi_type_vector(const multi_type_vector &other)
iterator release(const iterator &pos_hint, size_type pos, T &value)
multi_type_vector(size_type init_size, const T &it_begin, const T &it_end)
iterator transfer(size_type start_pos, size_type end_pos, multi_type_vector &dest, size_type dest_pos)
static position_type next_position(const position_type &pos)
iterator insert_empty(const iterator &pos_hint, size_type pos, size_type length)
iterator release(size_type pos, T &value)
T get(size_type pos) const
static position_type advance_position(const position_type &pos, int steps)
iterator set(const iterator &pos_hint, size_type pos, const T &value)
iterator insert(const iterator &pos_hint, size_type pos, const T &it_begin, const T &it_end)
iterator release_range(size_type start_pos, size_type end_pos)
iterator release_range(const iterator &pos_hint, size_type start_pos, size_type end_pos)
void erase(size_type start_pos, size_type end_pos)
iterator insert(size_type pos, const T &it_begin, const T &it_end)
Definition: types.hpp:173
Definition: iterator_node.hpp:101
Definition: iterator_node.hpp:92