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>
40 struct custom_block_func2
42 static base_element_block* create_new_block(element_t type,
size_t init_size)
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);
57 static base_element_block* clone_block(
const base_element_block& block)
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);
72 static void delete_block(
const base_element_block* p)
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);
120 static void erase(base_element_block& block,
size_t pos)
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);
135 static void erase(base_element_block& block,
size_t pos,
size_t size)
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);
150 static void append_values_from_block(base_element_block& dest,
const base_element_block& src)
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(
166 base_element_block& dest,
const base_element_block& src,
size_t begin_pos,
size_t len)
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(
182 base_element_block& dest,
const base_element_block& src,
size_t begin_pos,
size_t len)
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(
198 base_element_block& dest,
const base_element_block& src,
size_t begin_pos,
size_t len)
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(
214 base_element_block& blk1, base_element_block& blk2,
size_t pos1,
size_t pos2,
size_t len)
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(
230 const base_element_block& left,
const base_element_block& right)
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);
255 static void overwrite_values(base_element_block& block,
size_t pos,
size_t len)
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);
270 static void shrink_to_fit(base_element_block& block)
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);
285 static size_t size(
const base_element_block& 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);