29 #ifndef INCLUDED_MDDS_MULTI_TYPE_VECTOR_DIR_CUSTOM_FUNC3_HPP
30 #define INCLUDED_MDDS_MULTI_TYPE_VECTOR_DIR_CUSTOM_FUNC3_HPP
35 namespace mdds {
namespace mtv {
37 template<
typename _Block1,
typename _Block2,
typename _Block3>
44 case _Block1::block_type:
45 return _Block1::create_block(init_size);
46 case _Block2::block_type:
47 return _Block2::create_block(init_size);
48 case _Block3::block_type:
49 return _Block3::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);
65 case _Block3::block_type:
66 return _Block3::clone_block(block);
71 return element_block_func::clone_block(block);
79 switch (get_block_type(*p))
81 case _Block1::block_type:
82 _Block1::delete_block(p);
84 case _Block2::block_type:
85 _Block2::delete_block(p);
87 case _Block3::block_type:
88 _Block3::delete_block(p);
91 element_block_func::delete_block(p);
97 switch (get_block_type(block))
99 case _Block1::block_type:
100 _Block1::resize_block(block, new_size);
102 case _Block2::block_type:
103 _Block2::resize_block(block, new_size);
105 case _Block3::block_type:
106 _Block3::resize_block(block, new_size);
109 element_block_func::resize_block(block, new_size);
115 switch (get_block_type(block))
117 case _Block1::block_type:
118 _Block1::print_block(block);
120 case _Block2::block_type:
121 _Block2::print_block(block);
123 case _Block3::block_type:
124 _Block3::print_block(block);
127 element_block_func::print_block(block);
133 switch (get_block_type(block))
135 case _Block1::block_type:
136 _Block1::erase_block(block, pos);
138 case _Block2::block_type:
139 _Block2::erase_block(block, pos);
141 case _Block3::block_type:
142 _Block3::erase_block(block, pos);
145 element_block_func::erase(block, pos);
151 switch (get_block_type(block))
153 case _Block1::block_type:
154 _Block1::erase_block(block, pos, size);
156 case _Block2::block_type:
157 _Block2::erase_block(block, pos, size);
159 case _Block3::block_type:
160 _Block3::erase_block(block, pos, size);
163 element_block_func_base::erase(block, pos, size);
169 switch (get_block_type(dest))
171 case _Block1::block_type:
172 _Block1::append_values_from_block(dest, src);
174 case _Block2::block_type:
175 _Block2::append_values_from_block(dest, src);
177 case _Block3::block_type:
178 _Block3::append_values_from_block(dest, src);
181 element_block_func_base::append_values_from_block(dest, src);
185 static void append_values_from_block(
188 switch (get_block_type(dest))
190 case _Block1::block_type:
191 _Block1::append_values_from_block(dest, src, begin_pos, len);
193 case _Block2::block_type:
194 _Block2::append_values_from_block(dest, src, begin_pos, len);
196 case _Block3::block_type:
197 _Block3::append_values_from_block(dest, src, begin_pos, len);
200 element_block_func_base::append_values_from_block(dest, src, begin_pos, len);
204 static void assign_values_from_block(
207 switch (get_block_type(dest))
209 case _Block1::block_type:
210 _Block1::assign_values_from_block(dest, src, begin_pos, len);
212 case _Block2::block_type:
213 _Block2::assign_values_from_block(dest, src, begin_pos, len);
215 case _Block3::block_type:
216 _Block3::assign_values_from_block(dest, src, begin_pos, len);
219 element_block_func_base::assign_values_from_block(dest, src, begin_pos, len);
223 static void prepend_values_from_block(
226 switch (get_block_type(dest))
228 case _Block1::block_type:
229 _Block1::prepend_values_from_block(dest, src, begin_pos, len);
231 case _Block2::block_type:
232 _Block2::prepend_values_from_block(dest, src, begin_pos, len);
234 case _Block3::block_type:
235 _Block3::prepend_values_from_block(dest, src, begin_pos, len);
238 element_block_func_base::prepend_values_from_block(dest, src, begin_pos, len);
242 static void swap_values(
245 switch (get_block_type(blk1))
247 case _Block1::block_type:
248 _Block1::swap_values(blk1, blk2, pos1, pos2, len);
250 case _Block2::block_type:
251 _Block2::swap_values(blk1, blk2, pos1, pos2, len);
253 case _Block3::block_type:
254 _Block3::swap_values(blk1, blk2, pos1, pos2, len);
257 element_block_func_base::swap_values(blk1, blk2, pos1, pos2, len);
261 static bool equal_block(
264 if (get_block_type(left) == _Block1::block_type)
266 if (get_block_type(right) != _Block1::block_type)
269 return _Block1::get(left) == _Block1::get(right);
271 else if (mtv::get_block_type(right) == _Block1::block_type)
274 if (get_block_type(left) == _Block2::block_type)
276 if (get_block_type(right) != _Block2::block_type)
279 return _Block2::get(left) == _Block2::get(right);
281 else if (mtv::get_block_type(right) == _Block2::block_type)
284 if (get_block_type(left) == _Block3::block_type)
286 if (get_block_type(right) != _Block3::block_type)
289 return _Block3::get(left) == _Block3::get(right);
291 else if (mtv::get_block_type(right) == _Block3::block_type)
294 return element_block_func::equal_block(left, right);
299 switch (get_block_type(block))
301 case _Block1::block_type:
302 _Block1::overwrite_values(block, pos, len);
304 case _Block2::block_type:
305 _Block2::overwrite_values(block, pos, len);
307 case _Block3::block_type:
308 _Block3::overwrite_values(block, pos, len);
317 switch (get_block_type(block))
319 case _Block1::block_type:
320 _Block1::shrink_to_fit(block);
322 case _Block2::block_type:
323 _Block2::shrink_to_fit(block);
325 case _Block3::block_type:
326 _Block3::shrink_to_fit(block);
329 element_block_func::shrink_to_fit(block);
335 switch (get_block_type(block))
337 case _Block1::block_type:
338 return _Block1::size(block);
339 case _Block2::block_type:
340 return _Block2::size(block);
341 case _Block3::block_type:
342 return _Block3::size(block);
344 return element_block_func::size(block);
Definition: types.hpp:173
Definition: custom_func3.hpp:39
static void overwrite_values(base_element_block &block, size_t pos, size_t len)
Definition: trait.hpp:660