28 #ifndef INCLUDED_MDDS_MULTI_TYPE_VECTOR_TRAIT_HPP 29 #define INCLUDED_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(
83 base_element_block* element_block_func_base::create_new_block(element_t type,
size_t init_size)
87 case element_type_numeric:
88 return numeric_element_block::create_block(init_size);
89 case element_type_string:
90 return string_element_block::create_block(init_size);
91 case element_type_short:
92 return short_element_block::create_block(init_size);
93 case element_type_ushort:
94 return ushort_element_block::create_block(init_size);
95 case element_type_int:
96 return int_element_block::create_block(init_size);
97 case element_type_uint:
98 return uint_element_block::create_block(init_size);
99 case element_type_long:
100 return long_element_block::create_block(init_size);
101 case element_type_ulong:
102 return ulong_element_block::create_block(init_size);
103 case element_type_boolean:
104 return boolean_element_block::create_block(init_size);
105 case element_type_char:
106 return char_element_block::create_block(init_size);
107 case element_type_uchar:
108 return uchar_element_block::create_block(init_size);
110 throw general_error(
"create_new_block: failed to create a new block of unknown type.");
116 switch (get_block_type(block))
118 case element_type_numeric:
119 return numeric_element_block::clone_block(block);
120 case element_type_string:
121 return string_element_block::clone_block(block);
122 case element_type_short:
123 return short_element_block::clone_block(block);
124 case element_type_ushort:
125 return ushort_element_block::clone_block(block);
126 case element_type_int:
127 return int_element_block::clone_block(block);
128 case element_type_uint:
129 return uint_element_block::clone_block(block);
130 case element_type_long:
131 return long_element_block::clone_block(block);
132 case element_type_ulong:
133 return ulong_element_block::clone_block(block);
134 case element_type_boolean:
135 return boolean_element_block::clone_block(block);
136 case element_type_char:
137 return char_element_block::clone_block(block);
138 case element_type_uchar:
139 return uchar_element_block::clone_block(block);
141 throw general_error(
"clone_block: failed to clone a block of unknown type.");
150 switch (get_block_type(*p))
152 case element_type_numeric:
153 numeric_element_block::delete_block(p);
155 case element_type_string:
156 string_element_block::delete_block(p);
158 case element_type_short:
159 short_element_block::delete_block(p);
161 case element_type_ushort:
162 ushort_element_block::delete_block(p);
164 case element_type_int:
165 int_element_block::delete_block(p);
167 case element_type_uint:
168 uint_element_block::delete_block(p);
170 case element_type_long:
171 long_element_block::delete_block(p);
173 case element_type_ulong:
174 ulong_element_block::delete_block(p);
176 case element_type_boolean:
177 boolean_element_block::delete_block(p);
179 case element_type_char:
180 char_element_block::delete_block(p);
182 case element_type_uchar:
183 uchar_element_block::delete_block(p);
186 throw general_error(
"delete_block: failed to delete a block of unknown type.");
190 void element_block_func_base::resize_block(
base_element_block& block,
size_t new_size)
192 switch (get_block_type(block))
194 case element_type_numeric:
195 numeric_element_block::resize_block(block, new_size);
197 case element_type_string:
198 string_element_block::resize_block(block, new_size);
200 case element_type_short:
201 short_element_block::resize_block(block, new_size);
203 case element_type_ushort:
204 ushort_element_block::resize_block(block, new_size);
206 case element_type_int:
207 int_element_block::resize_block(block, new_size);
209 case element_type_uint:
210 uint_element_block::resize_block(block, new_size);
212 case element_type_long:
213 long_element_block::resize_block(block, new_size);
215 case element_type_ulong:
216 ulong_element_block::resize_block(block, new_size);
218 case element_type_boolean:
219 boolean_element_block::resize_block(block, new_size);
221 case element_type_char:
222 char_element_block::resize_block(block, new_size);
224 case element_type_uchar:
225 uchar_element_block::resize_block(block, new_size);
228 throw general_error(
"resize_block: failed to resize a block of unknown type.");
234 switch (get_block_type(block))
236 case element_type_numeric:
237 numeric_element_block::print_block(block);
239 case element_type_string:
240 string_element_block::print_block(block);
242 case element_type_short:
243 short_element_block::print_block(block);
245 case element_type_ushort:
246 ushort_element_block::print_block(block);
248 case element_type_int:
249 int_element_block::print_block(block);
251 case element_type_uint:
252 uint_element_block::print_block(block);
254 case element_type_long:
255 long_element_block::print_block(block);
257 case element_type_ulong:
258 ulong_element_block::print_block(block);
260 case element_type_boolean:
261 boolean_element_block::print_block(block);
263 case element_type_char:
264 char_element_block::print_block(block);
266 case element_type_uchar:
267 uchar_element_block::print_block(block);
270 throw general_error(
"print_block: failed to print a block of unknown type.");
276 switch (get_block_type(block))
278 case element_type_numeric:
279 numeric_element_block::erase_block(block, pos);
281 case element_type_string:
282 string_element_block::erase_block(block, pos);
284 case element_type_short:
285 short_element_block::erase_block(block, pos);
287 case element_type_ushort:
288 ushort_element_block::erase_block(block, pos);
290 case element_type_int:
291 int_element_block::erase_block(block, pos);
293 case element_type_uint:
294 uint_element_block::erase_block(block, pos);
296 case element_type_long:
297 long_element_block::erase_block(block, pos);
299 case element_type_ulong:
300 ulong_element_block::erase_block(block, pos);
302 case element_type_boolean:
303 boolean_element_block::erase_block(block, pos);
305 case element_type_char:
306 char_element_block::erase_block(block, pos);
308 case element_type_uchar:
309 uchar_element_block::erase_block(block, pos);
312 throw general_error(
"erase: failed to erase an element from a block of unknown type.");
316 void element_block_func_base::erase(
base_element_block& block,
size_t pos,
size_t size)
318 switch (get_block_type(block))
320 case element_type_numeric:
321 numeric_element_block::erase_block(block, pos, size);
323 case element_type_string:
324 string_element_block::erase_block(block, pos, size);
326 case element_type_short:
327 short_element_block::erase_block(block, pos, size);
329 case element_type_ushort:
330 ushort_element_block::erase_block(block, pos, size);
332 case element_type_int:
333 int_element_block::erase_block(block, pos, size);
335 case element_type_uint:
336 uint_element_block::erase_block(block, pos, size);
338 case element_type_long:
339 long_element_block::erase_block(block, pos, size);
341 case element_type_ulong:
342 ulong_element_block::erase_block(block, pos, size);
344 case element_type_boolean:
345 boolean_element_block::erase_block(block, pos, size);
347 case element_type_char:
348 char_element_block::erase_block(block, pos, size);
350 case element_type_uchar:
351 uchar_element_block::erase_block(block, pos, size);
354 throw general_error(
"erase: failed to erase elements from a block of unknown type.");
360 switch (get_block_type(dest))
362 case element_type_numeric:
363 numeric_element_block::append_values_from_block(dest, src);
365 case element_type_string:
366 string_element_block::append_values_from_block(dest, src);
368 case element_type_short:
369 short_element_block::append_values_from_block(dest, src);
371 case element_type_ushort:
372 ushort_element_block::append_values_from_block(dest, src);
374 case element_type_int:
375 int_element_block::append_values_from_block(dest, src);
377 case element_type_uint:
378 uint_element_block::append_values_from_block(dest, src);
380 case element_type_long:
381 long_element_block::append_values_from_block(dest, src);
383 case element_type_ulong:
384 ulong_element_block::append_values_from_block(dest, src);
386 case element_type_boolean:
387 boolean_element_block::append_values_from_block(dest, src);
389 case element_type_char:
390 char_element_block::append_values_from_block(dest, src);
392 case element_type_uchar:
393 uchar_element_block::append_values_from_block(dest, src);
396 throw general_error(
"append_values: failed to append values to a block of unknown type.");
400 void element_block_func_base::append_values_from_block(
403 switch (get_block_type(dest))
405 case element_type_numeric:
406 numeric_element_block::append_values_from_block(dest, src, begin_pos, len);
408 case element_type_string:
409 string_element_block::append_values_from_block(dest, src, begin_pos, len);
411 case element_type_short:
412 short_element_block::append_values_from_block(dest, src, begin_pos, len);
414 case element_type_ushort:
415 ushort_element_block::append_values_from_block(dest, src, begin_pos, len);
417 case element_type_int:
418 int_element_block::append_values_from_block(dest, src, begin_pos, len);
420 case element_type_uint:
421 uint_element_block::append_values_from_block(dest, src, begin_pos, len);
423 case element_type_long:
424 long_element_block::append_values_from_block(dest, src, begin_pos, len);
426 case element_type_ulong:
427 ulong_element_block::append_values_from_block(dest, src, begin_pos, len);
429 case element_type_boolean:
430 boolean_element_block::append_values_from_block(dest, src, begin_pos, len);
432 case element_type_char:
433 char_element_block::append_values_from_block(dest, src, begin_pos, len);
435 case element_type_uchar:
436 uchar_element_block::append_values_from_block(dest, src, begin_pos, len);
439 throw general_error(
"append_values: failed to append values to a block of unknown type.");
443 void element_block_func_base::assign_values_from_block(
446 switch (get_block_type(dest))
448 case element_type_numeric:
449 numeric_element_block::assign_values_from_block(dest, src, begin_pos, len);
451 case element_type_string:
452 string_element_block::assign_values_from_block(dest, src, begin_pos, len);
454 case element_type_short:
455 short_element_block::assign_values_from_block(dest, src, begin_pos, len);
457 case element_type_ushort:
458 ushort_element_block::assign_values_from_block(dest, src, begin_pos, len);
460 case element_type_int:
461 int_element_block::assign_values_from_block(dest, src, begin_pos, len);
463 case element_type_uint:
464 uint_element_block::assign_values_from_block(dest, src, begin_pos, len);
466 case element_type_long:
467 long_element_block::assign_values_from_block(dest, src, begin_pos, len);
469 case element_type_ulong:
470 ulong_element_block::assign_values_from_block(dest, src, begin_pos, len);
472 case element_type_boolean:
473 boolean_element_block::assign_values_from_block(dest, src, begin_pos, len);
475 case element_type_char:
476 char_element_block::assign_values_from_block(dest, src, begin_pos, len);
478 case element_type_uchar:
479 uchar_element_block::assign_values_from_block(dest, src, begin_pos, len);
482 throw general_error(
"assign_values_from_block: failed to assign values to a block of unknown type.");
486 void element_block_func_base::prepend_values_from_block(
489 switch (get_block_type(dest))
491 case element_type_numeric:
492 numeric_element_block::prepend_values_from_block(dest, src, begin_pos, len);
494 case element_type_string:
495 string_element_block::prepend_values_from_block(dest, src, begin_pos, len);
497 case element_type_short:
498 short_element_block::prepend_values_from_block(dest, src, begin_pos, len);
500 case element_type_ushort:
501 ushort_element_block::prepend_values_from_block(dest, src, begin_pos, len);
503 case element_type_int:
504 int_element_block::prepend_values_from_block(dest, src, begin_pos, len);
506 case element_type_uint:
507 uint_element_block::prepend_values_from_block(dest, src, begin_pos, len);
509 case element_type_long:
510 long_element_block::prepend_values_from_block(dest, src, begin_pos, len);
512 case element_type_ulong:
513 ulong_element_block::prepend_values_from_block(dest, src, begin_pos, len);
515 case element_type_boolean:
516 boolean_element_block::prepend_values_from_block(dest, src, begin_pos, len);
518 case element_type_char:
519 char_element_block::prepend_values_from_block(dest, src, begin_pos, len);
521 case element_type_uchar:
522 uchar_element_block::prepend_values_from_block(dest, src, begin_pos, len);
525 throw general_error(
"prepend_values_from_block: failed to prepend values to a block of unknown type.");
529 void element_block_func_base::swap_values(
532 element_t blk1_type = get_block_type(blk1);
533 assert(blk1_type == get_block_type(blk2));
536 case element_type_numeric:
537 numeric_element_block::swap_values(blk1, blk2, pos1, pos2, len);
539 case element_type_string:
540 string_element_block::swap_values(blk1, blk2, pos1, pos2, len);
542 case element_type_short:
543 short_element_block::swap_values(blk1, blk2, pos1, pos2, len);
545 case element_type_ushort:
546 ushort_element_block::swap_values(blk1, blk2, pos1, pos2, len);
548 case element_type_int:
549 int_element_block::swap_values(blk1, blk2, pos1, pos2, len);
551 case element_type_uint:
552 uint_element_block::swap_values(blk1, blk2, pos1, pos2, len);
554 case element_type_long:
555 long_element_block::swap_values(blk1, blk2, pos1, pos2, len);
557 case element_type_ulong:
558 ulong_element_block::swap_values(blk1, blk2, pos1, pos2, len);
560 case element_type_boolean:
561 boolean_element_block::swap_values(blk1, blk2, pos1, pos2, len);
563 case element_type_char:
564 char_element_block::swap_values(blk1, blk2, pos1, pos2, len);
566 case element_type_uchar:
567 uchar_element_block::swap_values(blk1, blk2, pos1, pos2, len);
576 element_t block_type = get_block_type(left);
577 if (block_type != get_block_type(right))
582 case element_type_numeric:
583 return numeric_element_block::get(left) == numeric_element_block::get(right);
584 case element_type_string:
585 return string_element_block::get(left) == string_element_block::get(right);
586 case element_type_short:
587 return short_element_block::get(left) == short_element_block::get(right);
588 case element_type_ushort:
589 return ushort_element_block::get(left) == ushort_element_block::get(right);
590 case element_type_int:
591 return int_element_block::get(left) == int_element_block::get(right);
592 case element_type_uint:
593 return uint_element_block::get(left) == uint_element_block::get(right);
594 case element_type_long:
595 return long_element_block::get(left) == long_element_block::get(right);
596 case element_type_ulong:
597 return ulong_element_block::get(left) == ulong_element_block::get(right);
598 case element_type_boolean:
599 return boolean_element_block::get(left) == boolean_element_block::get(right);
600 case element_type_char:
601 return char_element_block::get(left) == char_element_block::get(right);
602 case element_type_uchar:
603 return uchar_element_block::get(left) == uchar_element_block::get(right);
617 switch (get_block_type(block))
619 case element_type_numeric:
620 numeric_element_block::shrink_to_fit(block);
622 case element_type_string:
623 string_element_block::shrink_to_fit(block);
625 case element_type_short:
626 short_element_block::shrink_to_fit(block);
628 case element_type_ushort:
629 ushort_element_block::shrink_to_fit(block);
631 case element_type_int:
632 int_element_block::shrink_to_fit(block);
634 case element_type_uint:
635 uint_element_block::shrink_to_fit(block);
637 case element_type_long:
638 long_element_block::shrink_to_fit(block);
640 case element_type_ulong:
641 ulong_element_block::shrink_to_fit(block);
643 case element_type_boolean:
644 boolean_element_block::shrink_to_fit(block);
646 case element_type_char:
647 char_element_block::shrink_to_fit(block);
649 case element_type_uchar:
650 uchar_element_block::shrink_to_fit(block);
653 throw general_error(
"shrink_to_fit: failed to print a block of unknown type.");
659 switch (get_block_type(block))
661 case element_type_numeric:
662 return numeric_element_block::size(block);
663 case element_type_string:
664 return string_element_block::size(block);
665 case element_type_short:
666 return short_element_block::size(block);
667 case element_type_ushort:
668 return ushort_element_block::size(block);
669 case element_type_int:
670 return int_element_block::size(block);
671 case element_type_uint:
672 return uint_element_block::size(block);
673 case element_type_long:
674 return long_element_block::size(block);
675 case element_type_ulong:
676 return ulong_element_block::size(block);
677 case element_type_boolean:
678 return boolean_element_block::size(block);
679 case element_type_char:
680 return char_element_block::size(block);
681 case element_type_uchar:
682 return uchar_element_block::size(block);
684 throw general_error(
"size: failed to print a block of unknown type.");
Definition: multi_type_vector_trait.hpp:37
Definition: multi_type_vector_trait.hpp:692
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:610