28 #ifndef __MDDS_MULTI_TYPE_VECTOR_TRAIT_HPP__ 29 #define __MDDS_MULTI_TYPE_VECTOR_TRAIT_HPP__ 31 #include "multi_type_vector_types.hpp" 35 namespace mdds {
namespace mtv {
55 inline static void append_values_from_block(
58 inline static void assign_values_from_block(
61 inline static void prepend_values_from_block(
64 inline static void swap_values(
81 base_element_block* element_block_func_base::create_new_block(element_t type,
size_t init_size)
85 case element_type_numeric:
86 return numeric_element_block::create_block(init_size);
87 case element_type_string:
88 return string_element_block::create_block(init_size);
89 case element_type_short:
90 return short_element_block::create_block(init_size);
91 case element_type_ushort:
92 return ushort_element_block::create_block(init_size);
93 case element_type_int:
94 return int_element_block::create_block(init_size);
95 case element_type_uint:
96 return uint_element_block::create_block(init_size);
97 case element_type_long:
98 return long_element_block::create_block(init_size);
99 case element_type_ulong:
100 return ulong_element_block::create_block(init_size);
101 case element_type_boolean:
102 return boolean_element_block::create_block(init_size);
103 case element_type_char:
104 return char_element_block::create_block(init_size);
105 case element_type_uchar:
106 return uchar_element_block::create_block(init_size);
108 throw general_error(
"create_new_block: failed to create a new block of unknown type.");
114 switch (get_block_type(block))
116 case element_type_numeric:
117 return numeric_element_block::clone_block(block);
118 case element_type_string:
119 return string_element_block::clone_block(block);
120 case element_type_short:
121 return short_element_block::clone_block(block);
122 case element_type_ushort:
123 return ushort_element_block::clone_block(block);
124 case element_type_int:
125 return int_element_block::clone_block(block);
126 case element_type_uint:
127 return uint_element_block::clone_block(block);
128 case element_type_long:
129 return long_element_block::clone_block(block);
130 case element_type_ulong:
131 return ulong_element_block::clone_block(block);
132 case element_type_boolean:
133 return boolean_element_block::clone_block(block);
134 case element_type_char:
135 return char_element_block::clone_block(block);
136 case element_type_uchar:
137 return uchar_element_block::clone_block(block);
139 throw general_error(
"clone_block: failed to clone a block of unknown type.");
148 switch (get_block_type(*p))
150 case element_type_numeric:
151 numeric_element_block::delete_block(p);
153 case element_type_string:
154 string_element_block::delete_block(p);
156 case element_type_short:
157 short_element_block::delete_block(p);
159 case element_type_ushort:
160 ushort_element_block::delete_block(p);
162 case element_type_int:
163 int_element_block::delete_block(p);
165 case element_type_uint:
166 uint_element_block::delete_block(p);
168 case element_type_long:
169 long_element_block::delete_block(p);
171 case element_type_ulong:
172 ulong_element_block::delete_block(p);
174 case element_type_boolean:
175 boolean_element_block::delete_block(p);
177 case element_type_char:
178 char_element_block::delete_block(p);
180 case element_type_uchar:
181 uchar_element_block::delete_block(p);
184 throw general_error(
"delete_block: failed to delete a block of unknown type.");
188 void element_block_func_base::resize_block(
base_element_block& block,
size_t new_size)
190 switch (get_block_type(block))
192 case element_type_numeric:
193 numeric_element_block::resize_block(block, new_size);
195 case element_type_string:
196 string_element_block::resize_block(block, new_size);
198 case element_type_short:
199 short_element_block::resize_block(block, new_size);
201 case element_type_ushort:
202 ushort_element_block::resize_block(block, new_size);
204 case element_type_int:
205 int_element_block::resize_block(block, new_size);
207 case element_type_uint:
208 uint_element_block::resize_block(block, new_size);
210 case element_type_long:
211 long_element_block::resize_block(block, new_size);
213 case element_type_ulong:
214 ulong_element_block::resize_block(block, new_size);
216 case element_type_boolean:
217 boolean_element_block::resize_block(block, new_size);
219 case element_type_char:
220 char_element_block::resize_block(block, new_size);
222 case element_type_uchar:
223 uchar_element_block::resize_block(block, new_size);
226 throw general_error(
"resize_block: failed to resize a block of unknown type.");
232 switch (get_block_type(block))
234 case element_type_numeric:
235 numeric_element_block::print_block(block);
237 case element_type_string:
238 string_element_block::print_block(block);
240 case element_type_short:
241 short_element_block::print_block(block);
243 case element_type_ushort:
244 ushort_element_block::print_block(block);
246 case element_type_int:
247 int_element_block::print_block(block);
249 case element_type_uint:
250 uint_element_block::print_block(block);
252 case element_type_long:
253 long_element_block::print_block(block);
255 case element_type_ulong:
256 ulong_element_block::print_block(block);
258 case element_type_boolean:
259 boolean_element_block::print_block(block);
261 case element_type_char:
262 char_element_block::print_block(block);
264 case element_type_uchar:
265 uchar_element_block::print_block(block);
268 throw general_error(
"print_block: failed to print a block of unknown type.");
274 switch (get_block_type(block))
276 case element_type_numeric:
277 numeric_element_block::erase_block(block, pos);
279 case element_type_string:
280 string_element_block::erase_block(block, pos);
282 case element_type_short:
283 short_element_block::erase_block(block, pos);
285 case element_type_ushort:
286 ushort_element_block::erase_block(block, pos);
288 case element_type_int:
289 int_element_block::erase_block(block, pos);
291 case element_type_uint:
292 uint_element_block::erase_block(block, pos);
294 case element_type_long:
295 long_element_block::erase_block(block, pos);
297 case element_type_ulong:
298 ulong_element_block::erase_block(block, pos);
300 case element_type_boolean:
301 boolean_element_block::erase_block(block, pos);
303 case element_type_char:
304 char_element_block::erase_block(block, pos);
306 case element_type_uchar:
307 uchar_element_block::erase_block(block, pos);
310 throw general_error(
"erase: failed to erase an element from a block of unknown type.");
314 void element_block_func_base::erase(
base_element_block& block,
size_t pos,
size_t size)
316 switch (get_block_type(block))
318 case element_type_numeric:
319 numeric_element_block::erase_block(block, pos, size);
321 case element_type_string:
322 string_element_block::erase_block(block, pos, size);
324 case element_type_short:
325 short_element_block::erase_block(block, pos, size);
327 case element_type_ushort:
328 ushort_element_block::erase_block(block, pos, size);
330 case element_type_int:
331 int_element_block::erase_block(block, pos, size);
333 case element_type_uint:
334 uint_element_block::erase_block(block, pos, size);
336 case element_type_long:
337 long_element_block::erase_block(block, pos, size);
339 case element_type_ulong:
340 ulong_element_block::erase_block(block, pos, size);
342 case element_type_boolean:
343 boolean_element_block::erase_block(block, pos, size);
345 case element_type_char:
346 char_element_block::erase_block(block, pos, size);
348 case element_type_uchar:
349 uchar_element_block::erase_block(block, pos, size);
352 throw general_error(
"erase: failed to erase elements from a block of unknown type.");
358 switch (get_block_type(dest))
360 case element_type_numeric:
361 numeric_element_block::append_values_from_block(dest, src);
363 case element_type_string:
364 string_element_block::append_values_from_block(dest, src);
366 case element_type_short:
367 short_element_block::append_values_from_block(dest, src);
369 case element_type_ushort:
370 ushort_element_block::append_values_from_block(dest, src);
372 case element_type_int:
373 int_element_block::append_values_from_block(dest, src);
375 case element_type_uint:
376 uint_element_block::append_values_from_block(dest, src);
378 case element_type_long:
379 long_element_block::append_values_from_block(dest, src);
381 case element_type_ulong:
382 ulong_element_block::append_values_from_block(dest, src);
384 case element_type_boolean:
385 boolean_element_block::append_values_from_block(dest, src);
387 case element_type_char:
388 char_element_block::append_values_from_block(dest, src);
390 case element_type_uchar:
391 uchar_element_block::append_values_from_block(dest, src);
394 throw general_error(
"append_values: failed to append values to a block of unknown type.");
398 void element_block_func_base::append_values_from_block(
401 switch (get_block_type(dest))
403 case element_type_numeric:
404 numeric_element_block::append_values_from_block(dest, src, begin_pos, len);
406 case element_type_string:
407 string_element_block::append_values_from_block(dest, src, begin_pos, len);
409 case element_type_short:
410 short_element_block::append_values_from_block(dest, src, begin_pos, len);
412 case element_type_ushort:
413 ushort_element_block::append_values_from_block(dest, src, begin_pos, len);
415 case element_type_int:
416 int_element_block::append_values_from_block(dest, src, begin_pos, len);
418 case element_type_uint:
419 uint_element_block::append_values_from_block(dest, src, begin_pos, len);
421 case element_type_long:
422 long_element_block::append_values_from_block(dest, src, begin_pos, len);
424 case element_type_ulong:
425 ulong_element_block::append_values_from_block(dest, src, begin_pos, len);
427 case element_type_boolean:
428 boolean_element_block::append_values_from_block(dest, src, begin_pos, len);
430 case element_type_char:
431 char_element_block::append_values_from_block(dest, src, begin_pos, len);
433 case element_type_uchar:
434 uchar_element_block::append_values_from_block(dest, src, begin_pos, len);
437 throw general_error(
"append_values: failed to append values to a block of unknown type.");
441 void element_block_func_base::assign_values_from_block(
444 switch (get_block_type(dest))
446 case element_type_numeric:
447 numeric_element_block::assign_values_from_block(dest, src, begin_pos, len);
449 case element_type_string:
450 string_element_block::assign_values_from_block(dest, src, begin_pos, len);
452 case element_type_short:
453 short_element_block::assign_values_from_block(dest, src, begin_pos, len);
455 case element_type_ushort:
456 ushort_element_block::assign_values_from_block(dest, src, begin_pos, len);
458 case element_type_int:
459 int_element_block::assign_values_from_block(dest, src, begin_pos, len);
461 case element_type_uint:
462 uint_element_block::assign_values_from_block(dest, src, begin_pos, len);
464 case element_type_long:
465 long_element_block::assign_values_from_block(dest, src, begin_pos, len);
467 case element_type_ulong:
468 ulong_element_block::assign_values_from_block(dest, src, begin_pos, len);
470 case element_type_boolean:
471 boolean_element_block::assign_values_from_block(dest, src, begin_pos, len);
473 case element_type_char:
474 char_element_block::assign_values_from_block(dest, src, begin_pos, len);
476 case element_type_uchar:
477 uchar_element_block::assign_values_from_block(dest, src, begin_pos, len);
480 throw general_error(
"assign_values_from_block: failed to assign values to a block of unknown type.");
484 void element_block_func_base::prepend_values_from_block(
487 switch (get_block_type(dest))
489 case element_type_numeric:
490 numeric_element_block::prepend_values_from_block(dest, src, begin_pos, len);
492 case element_type_string:
493 string_element_block::prepend_values_from_block(dest, src, begin_pos, len);
495 case element_type_short:
496 short_element_block::prepend_values_from_block(dest, src, begin_pos, len);
498 case element_type_ushort:
499 ushort_element_block::prepend_values_from_block(dest, src, begin_pos, len);
501 case element_type_int:
502 int_element_block::prepend_values_from_block(dest, src, begin_pos, len);
504 case element_type_uint:
505 uint_element_block::prepend_values_from_block(dest, src, begin_pos, len);
507 case element_type_long:
508 long_element_block::prepend_values_from_block(dest, src, begin_pos, len);
510 case element_type_ulong:
511 ulong_element_block::prepend_values_from_block(dest, src, begin_pos, len);
513 case element_type_boolean:
514 boolean_element_block::prepend_values_from_block(dest, src, begin_pos, len);
516 case element_type_char:
517 char_element_block::prepend_values_from_block(dest, src, begin_pos, len);
519 case element_type_uchar:
520 uchar_element_block::prepend_values_from_block(dest, src, begin_pos, len);
523 throw general_error(
"prepend_values_from_block: failed to prepend values to a block of unknown type.");
527 void element_block_func_base::swap_values(
530 element_t blk1_type = get_block_type(blk1);
531 assert(blk1_type == get_block_type(blk2));
534 case element_type_numeric:
535 numeric_element_block::swap_values(blk1, blk2, pos1, pos2, len);
537 case element_type_string:
538 string_element_block::swap_values(blk1, blk2, pos1, pos2, len);
540 case element_type_short:
541 short_element_block::swap_values(blk1, blk2, pos1, pos2, len);
543 case element_type_ushort:
544 ushort_element_block::swap_values(blk1, blk2, pos1, pos2, len);
546 case element_type_int:
547 int_element_block::swap_values(blk1, blk2, pos1, pos2, len);
549 case element_type_uint:
550 uint_element_block::swap_values(blk1, blk2, pos1, pos2, len);
552 case element_type_long:
553 long_element_block::swap_values(blk1, blk2, pos1, pos2, len);
555 case element_type_ulong:
556 ulong_element_block::swap_values(blk1, blk2, pos1, pos2, len);
558 case element_type_boolean:
559 boolean_element_block::swap_values(blk1, blk2, pos1, pos2, len);
561 case element_type_char:
562 char_element_block::swap_values(blk1, blk2, pos1, pos2, len);
564 case element_type_uchar:
565 uchar_element_block::swap_values(blk1, blk2, pos1, pos2, len);
574 element_t block_type = get_block_type(left);
575 if (block_type != get_block_type(right))
580 case element_type_numeric:
581 return numeric_element_block::get(left) == numeric_element_block::get(right);
582 case element_type_string:
583 return string_element_block::get(left) == string_element_block::get(right);
584 case element_type_short:
585 return short_element_block::get(left) == short_element_block::get(right);
586 case element_type_ushort:
587 return ushort_element_block::get(left) == ushort_element_block::get(right);
588 case element_type_int:
589 return int_element_block::get(left) == int_element_block::get(right);
590 case element_type_uint:
591 return uint_element_block::get(left) == uint_element_block::get(right);
592 case element_type_long:
593 return long_element_block::get(left) == long_element_block::get(right);
594 case element_type_ulong:
595 return ulong_element_block::get(left) == ulong_element_block::get(right);
596 case element_type_boolean:
597 return boolean_element_block::get(left) == boolean_element_block::get(right);
598 case element_type_char:
599 return char_element_block::get(left) == char_element_block::get(right);
600 case element_type_uchar:
601 return uchar_element_block::get(left) == uchar_element_block::get(right);
615 switch (get_block_type(block))
617 case element_type_numeric:
618 numeric_element_block::shrink_to_fit(block);
620 case element_type_string:
621 string_element_block::shrink_to_fit(block);
623 case element_type_short:
624 short_element_block::shrink_to_fit(block);
626 case element_type_ushort:
627 ushort_element_block::shrink_to_fit(block);
629 case element_type_int:
630 int_element_block::shrink_to_fit(block);
632 case element_type_uint:
633 uint_element_block::shrink_to_fit(block);
635 case element_type_long:
636 long_element_block::shrink_to_fit(block);
638 case element_type_ulong:
639 ulong_element_block::shrink_to_fit(block);
641 case element_type_boolean:
642 boolean_element_block::shrink_to_fit(block);
644 case element_type_char:
645 char_element_block::shrink_to_fit(block);
647 case element_type_uchar:
648 uchar_element_block::shrink_to_fit(block);
651 throw general_error(
"shrink_to_fit: failed to print a block of unknown type.");
Definition: multi_type_vector_trait.hpp:37
Definition: multi_type_vector_trait.hpp:659
Definition: multi_type_vector_types.hpp:88
Definition: global.hpp:58
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:608