28 #ifndef INCLUDED_MULTI_TYPE_VECTOR_CUSTOM_FUNC3_HPP 29 #define INCLUDED_MULTI_TYPE_VECTOR_CUSTOM_FUNC3_HPP 31 #include "multi_type_vector_types.hpp" 32 #include "multi_type_vector_trait.hpp" 34 namespace mdds {
namespace mtv {
36 template<
typename _Block1,
typename _Block2,
typename _Block3>
43 case _Block1::block_type:
44 return _Block1::create_block(init_size);
45 case _Block2::block_type:
46 return _Block2::create_block(init_size);
47 case _Block3::block_type:
48 return _Block3::create_block(init_size);
53 return element_block_func::create_new_block(type, init_size);
58 switch (get_block_type(block))
60 case _Block1::block_type:
61 return _Block1::clone_block(block);
62 case _Block2::block_type:
63 return _Block2::clone_block(block);
64 case _Block3::block_type:
65 return _Block3::clone_block(block);
70 return element_block_func::clone_block(block);
78 switch (get_block_type(*p))
80 case _Block1::block_type:
81 _Block1::delete_block(p);
83 case _Block2::block_type:
84 _Block2::delete_block(p);
86 case _Block3::block_type:
87 _Block3::delete_block(p);
90 element_block_func::delete_block(p);
96 switch (get_block_type(block))
98 case _Block1::block_type:
99 _Block1::resize_block(block, new_size);
101 case _Block2::block_type:
102 _Block2::resize_block(block, new_size);
104 case _Block3::block_type:
105 _Block3::resize_block(block, new_size);
108 element_block_func::resize_block(block, new_size);
114 switch (get_block_type(block))
116 case _Block1::block_type:
117 _Block1::print_block(block);
119 case _Block2::block_type:
120 _Block2::print_block(block);
122 case _Block3::block_type:
123 _Block3::print_block(block);
126 element_block_func::print_block(block);
132 switch (get_block_type(block))
134 case _Block1::block_type:
135 _Block1::erase_block(block, pos);
137 case _Block2::block_type:
138 _Block2::erase_block(block, pos);
140 case _Block3::block_type:
141 _Block3::erase_block(block, pos);
144 element_block_func::erase(block, pos);
150 switch (get_block_type(block))
152 case _Block1::block_type:
153 _Block1::erase_block(block, pos, size);
155 case _Block2::block_type:
156 _Block2::erase_block(block, pos, size);
158 case _Block3::block_type:
159 _Block3::erase_block(block, pos, size);
162 element_block_func_base::erase(block, pos, size);
168 switch (get_block_type(dest))
170 case _Block1::block_type:
171 _Block1::append_values_from_block(dest, src);
173 case _Block2::block_type:
174 _Block2::append_values_from_block(dest, src);
176 case _Block3::block_type:
177 _Block3::append_values_from_block(dest, src);
180 element_block_func_base::append_values_from_block(dest, src);
184 static void append_values_from_block(
187 switch (get_block_type(dest))
189 case _Block1::block_type:
190 _Block1::append_values_from_block(dest, src, begin_pos, len);
192 case _Block2::block_type:
193 _Block2::append_values_from_block(dest, src, begin_pos, len);
195 case _Block3::block_type:
196 _Block3::append_values_from_block(dest, src, begin_pos, len);
199 element_block_func_base::append_values_from_block(dest, src, begin_pos, len);
203 static void assign_values_from_block(
206 switch (get_block_type(dest))
208 case _Block1::block_type:
209 _Block1::assign_values_from_block(dest, src, begin_pos, len);
211 case _Block2::block_type:
212 _Block2::assign_values_from_block(dest, src, begin_pos, len);
214 case _Block3::block_type:
215 _Block3::assign_values_from_block(dest, src, begin_pos, len);
218 element_block_func_base::assign_values_from_block(dest, src, begin_pos, len);
222 static void prepend_values_from_block(
225 switch (get_block_type(dest))
227 case _Block1::block_type:
228 _Block1::prepend_values_from_block(dest, src, begin_pos, len);
230 case _Block2::block_type:
231 _Block2::prepend_values_from_block(dest, src, begin_pos, len);
233 case _Block3::block_type:
234 _Block3::prepend_values_from_block(dest, src, begin_pos, len);
237 element_block_func_base::prepend_values_from_block(dest, src, begin_pos, len);
241 static void swap_values(
244 switch (get_block_type(blk1))
246 case _Block1::block_type:
247 _Block1::swap_values(blk1, blk2, pos1, pos2, len);
249 case _Block2::block_type:
250 _Block2::swap_values(blk1, blk2, pos1, pos2, len);
252 case _Block3::block_type:
253 _Block3::swap_values(blk1, blk2, pos1, pos2, len);
256 element_block_func_base::swap_values(blk1, blk2, pos1, pos2, len);
260 static bool equal_block(
263 if (get_block_type(left) == _Block1::block_type)
265 if (get_block_type(right) != _Block1::block_type)
268 return _Block1::get(left) == _Block1::get(right);
270 else if (mtv::get_block_type(right) == _Block1::block_type)
273 if (get_block_type(left) == _Block2::block_type)
275 if (get_block_type(right) != _Block2::block_type)
278 return _Block2::get(left) == _Block2::get(right);
280 else if (mtv::get_block_type(right) == _Block2::block_type)
283 if (get_block_type(left) == _Block3::block_type)
285 if (get_block_type(right) != _Block3::block_type)
288 return _Block3::get(left) == _Block3::get(right);
290 else if (mtv::get_block_type(right) == _Block3::block_type)
293 return element_block_func::equal_block(left, right);
298 switch (get_block_type(block))
300 case _Block1::block_type:
301 _Block1::overwrite_values(block, pos, len);
303 case _Block2::block_type:
304 _Block2::overwrite_values(block, pos, len);
306 case _Block3::block_type:
307 _Block3::overwrite_values(block, pos, len);
316 switch (get_block_type(block))
318 case _Block1::block_type:
319 _Block1::shrink_to_fit(block);
321 case _Block2::block_type:
322 _Block2::shrink_to_fit(block);
324 case _Block3::block_type:
325 _Block3::shrink_to_fit(block);
328 element_block_func::shrink_to_fit(block);
334 switch (get_block_type(block))
336 case _Block1::block_type:
337 return _Block1::size(block);
338 case _Block2::block_type:
339 return _Block2::size(block);
340 case _Block3::block_type:
341 return _Block3::size(block);
343 return element_block_func::size(block);
Definition: multi_type_vector_types.hpp:87
Definition: multi_type_vector_custom_func3.hpp:37
Definition: flat_segment_tree.hpp:46
static void overwrite_values(base_element_block &block, size_t pos, size_t len)
Definition: multi_type_vector_trait.hpp:618