28 #ifndef INCLUDED_MDDS_MULTI_TYPE_VECTOR_CUSTOM_FUNC2_HPP 29 #define INCLUDED_MDDS_MULTI_TYPE_VECTOR_CUSTOM_FUNC2_HPP 31 #include "multi_type_vector_types.hpp" 32 #include "multi_type_vector_trait.hpp" 34 namespace mdds {
namespace mtv {
39 template<
typename _Block1,
typename _Block2>
46 case _Block1::block_type:
47 return _Block1::create_block(init_size);
48 case _Block2::block_type:
49 return _Block2::create_block(init_size);
54 return element_block_func::create_new_block(type, init_size);
59 switch (get_block_type(block))
61 case _Block1::block_type:
62 return _Block1::clone_block(block);
63 case _Block2::block_type:
64 return _Block2::clone_block(block);
69 return element_block_func::clone_block(block);
77 switch (get_block_type(*p))
79 case _Block1::block_type:
80 _Block1::delete_block(p);
82 case _Block2::block_type:
83 _Block2::delete_block(p);
86 element_block_func::delete_block(p);
92 switch (get_block_type(block))
94 case _Block1::block_type:
95 _Block1::resize_block(block, new_size);
97 case _Block2::block_type:
98 _Block2::resize_block(block, new_size);
101 element_block_func::resize_block(block, new_size);
107 switch (get_block_type(block))
109 case _Block1::block_type:
110 _Block1::print_block(block);
112 case _Block2::block_type:
113 _Block2::print_block(block);
116 element_block_func::print_block(block);
122 switch (get_block_type(block))
124 case _Block1::block_type:
125 _Block1::erase_block(block, pos);
127 case _Block2::block_type:
128 _Block2::erase_block(block, pos);
131 element_block_func::erase(block, pos);
137 switch (get_block_type(block))
139 case _Block1::block_type:
140 _Block1::erase_block(block, pos, size);
142 case _Block2::block_type:
143 _Block2::erase_block(block, pos, size);
146 element_block_func_base::erase(block, pos, size);
152 switch (get_block_type(dest))
154 case _Block1::block_type:
155 _Block1::append_values_from_block(dest, src);
157 case _Block2::block_type:
158 _Block2::append_values_from_block(dest, src);
161 element_block_func_base::append_values_from_block(dest, src);
165 static void append_values_from_block(
168 switch (get_block_type(dest))
170 case _Block1::block_type:
171 _Block1::append_values_from_block(dest, src, begin_pos, len);
173 case _Block2::block_type:
174 _Block2::append_values_from_block(dest, src, begin_pos, len);
177 element_block_func_base::append_values_from_block(dest, src, begin_pos, len);
181 static void assign_values_from_block(
184 switch (get_block_type(dest))
186 case _Block1::block_type:
187 _Block1::assign_values_from_block(dest, src, begin_pos, len);
189 case _Block2::block_type:
190 _Block2::assign_values_from_block(dest, src, begin_pos, len);
193 element_block_func_base::assign_values_from_block(dest, src, begin_pos, len);
197 static void prepend_values_from_block(
200 switch (get_block_type(dest))
202 case _Block1::block_type:
203 _Block1::prepend_values_from_block(dest, src, begin_pos, len);
205 case _Block2::block_type:
206 _Block2::prepend_values_from_block(dest, src, begin_pos, len);
209 element_block_func_base::prepend_values_from_block(dest, src, begin_pos, len);
213 static void swap_values(
216 switch (get_block_type(blk1))
218 case _Block1::block_type:
219 _Block1::swap_values(blk1, blk2, pos1, pos2, len);
221 case _Block2::block_type:
222 _Block2::swap_values(blk1, blk2, pos1, pos2, len);
225 element_block_func_base::swap_values(blk1, blk2, pos1, pos2, len);
229 static bool equal_block(
232 if (get_block_type(left) == _Block1::block_type)
234 if (get_block_type(right) != _Block1::block_type)
237 return _Block1::get(left) == _Block1::get(right);
239 else if (mtv::get_block_type(right) == _Block1::block_type)
242 if (get_block_type(left) == _Block2::block_type)
244 if (get_block_type(right) != _Block2::block_type)
247 return _Block2::get(left) == _Block2::get(right);
249 else if (mtv::get_block_type(right) == _Block2::block_type)
252 return element_block_func::equal_block(left, right);
257 switch (get_block_type(block))
259 case _Block1::block_type:
260 _Block1::overwrite_values(block, pos, len);
262 case _Block2::block_type:
263 _Block2::overwrite_values(block, pos, len);
272 switch (get_block_type(block))
274 case _Block1::block_type:
275 _Block1::shrink_to_fit(block);
277 case _Block2::block_type:
278 _Block2::shrink_to_fit(block);
281 element_block_func::shrink_to_fit(block);
287 switch (get_block_type(block))
289 case _Block1::block_type:
290 return _Block1::size(block);
291 case _Block2::block_type:
292 return _Block2::size(block);
294 return element_block_func::size(block);
Definition: multi_type_vector_types.hpp:88
Definition: multi_type_vector_custom_func2.hpp:40
Definition: default_deleter.hpp:33
static void overwrite_values(base_element_block &block, size_t pos, size_t len)
Definition: multi_type_vector_trait.hpp:610