29#ifndef INCLUDED_MDDS_MULTI_TYPE_VECTOR_TRAIT_2_HPP
30#define INCLUDED_MDDS_MULTI_TYPE_VECTOR_TRAIT_2_HPP
36namespace mdds {
namespace mtv {
56 inline static void append_values_from_block(
59 inline static void assign_values_from_block(
62 inline static void prepend_values_from_block(
65 inline static void swap_values(
84base_element_block* element_block_func_base::create_new_block(element_t type,
size_t init_size)
88 case element_type_float:
89 return float_element_block::create_block(init_size);
90 case element_type_double:
91 return double_element_block::create_block(init_size);
92 case element_type_string:
93 return string_element_block::create_block(init_size);
94 case element_type_int16:
95 return int16_element_block::create_block(init_size);
96 case element_type_uint16:
97 return uint16_element_block::create_block(init_size);
98 case element_type_int32:
99 return int32_element_block::create_block(init_size);
100 case element_type_uint32:
101 return uint32_element_block::create_block(init_size);
102 case element_type_int64:
103 return int64_element_block::create_block(init_size);
104 case element_type_uint64:
105 return uint64_element_block::create_block(init_size);
106 case element_type_boolean:
107 return boolean_element_block::create_block(init_size);
108 case element_type_int8:
109 return int8_element_block::create_block(init_size);
110 case element_type_uint8:
111 return uint8_element_block::create_block(init_size);
113 throw general_error(
"create_new_block: failed to create a new block of unknown type.");
117base_element_block* element_block_func_base::clone_block(
const base_element_block& block)
119 switch (get_block_type(block))
121 case element_type_float:
122 return float_element_block::clone_block(block);
123 case element_type_double:
124 return double_element_block::clone_block(block);
125 case element_type_string:
126 return string_element_block::clone_block(block);
127 case element_type_int16:
128 return int16_element_block::clone_block(block);
129 case element_type_uint16:
130 return uint16_element_block::clone_block(block);
131 case element_type_int32:
132 return int32_element_block::clone_block(block);
133 case element_type_uint32:
134 return uint32_element_block::clone_block(block);
135 case element_type_int64:
136 return int64_element_block::clone_block(block);
137 case element_type_uint64:
138 return uint64_element_block::clone_block(block);
139 case element_type_boolean:
140 return boolean_element_block::clone_block(block);
141 case element_type_int8:
142 return int8_element_block::clone_block(block);
143 case element_type_uint8:
144 return uint8_element_block::clone_block(block);
146 throw general_error(
"clone_block: failed to clone a block of unknown type.");
150void element_block_func_base::delete_block(
const base_element_block* p)
155 switch (get_block_type(*p))
157 case element_type_float:
158 float_element_block::delete_block(p);
160 case element_type_double:
161 double_element_block::delete_block(p);
163 case element_type_string:
164 string_element_block::delete_block(p);
166 case element_type_int16:
167 int16_element_block::delete_block(p);
169 case element_type_uint16:
170 uint16_element_block::delete_block(p);
172 case element_type_int32:
173 int32_element_block::delete_block(p);
175 case element_type_uint32:
176 uint32_element_block::delete_block(p);
178 case element_type_int64:
179 int64_element_block::delete_block(p);
181 case element_type_uint64:
182 uint64_element_block::delete_block(p);
184 case element_type_boolean:
185 boolean_element_block::delete_block(p);
187 case element_type_int8:
188 int8_element_block::delete_block(p);
190 case element_type_uint8:
191 uint8_element_block::delete_block(p);
195#ifdef MDDS_MULTI_TYPE_VECTOR_DEBUG
198 std::ostringstream os;
199 os << __FILE__ <<
"#" << __LINE__ <<
" (element_block_func_base:delete_block): "
200 <<
"failed to delete a block of unknown type (" << get_block_type(*p) <<
")" << std::endl;
201 throw general_error(os.str());
203 throw general_error(
"delete_block: failed to delete a block of unknown type.");
209void element_block_func_base::resize_block(base_element_block& block,
size_t new_size)
211 switch (get_block_type(block))
213 case element_type_float:
214 float_element_block::resize_block(block, new_size);
216 case element_type_double:
217 double_element_block::resize_block(block, new_size);
219 case element_type_string:
220 string_element_block::resize_block(block, new_size);
222 case element_type_int16:
223 int16_element_block::resize_block(block, new_size);
225 case element_type_uint16:
226 uint16_element_block::resize_block(block, new_size);
228 case element_type_int32:
229 int32_element_block::resize_block(block, new_size);
231 case element_type_uint32:
232 uint32_element_block::resize_block(block, new_size);
234 case element_type_int64:
235 int64_element_block::resize_block(block, new_size);
237 case element_type_uint64:
238 uint64_element_block::resize_block(block, new_size);
240 case element_type_boolean:
241 boolean_element_block::resize_block(block, new_size);
243 case element_type_int8:
244 int8_element_block::resize_block(block, new_size);
246 case element_type_uint8:
247 uint8_element_block::resize_block(block, new_size);
250 throw general_error(
"resize_block: failed to resize a block of unknown type.");
254void element_block_func_base::print_block(
const base_element_block& block)
256 switch (get_block_type(block))
258 case element_type_float:
259 float_element_block::print_block(block);
261 case element_type_double:
262 double_element_block::print_block(block);
264 case element_type_string:
265 string_element_block::print_block(block);
267 case element_type_int16:
268 int16_element_block::print_block(block);
270 case element_type_uint16:
271 uint16_element_block::print_block(block);
273 case element_type_int32:
274 int32_element_block::print_block(block);
276 case element_type_uint32:
277 uint32_element_block::print_block(block);
279 case element_type_int64:
280 int64_element_block::print_block(block);
282 case element_type_uint64:
283 uint64_element_block::print_block(block);
285 case element_type_boolean:
286 boolean_element_block::print_block(block);
288 case element_type_int8:
289 int8_element_block::print_block(block);
291 case element_type_uint8:
292 uint8_element_block::print_block(block);
295 throw general_error(
"print_block: failed to print a block of unknown type.");
299void element_block_func_base::erase(base_element_block& block,
size_t pos)
301 switch (get_block_type(block))
303 case element_type_float:
304 float_element_block::erase_block(block, pos);
306 case element_type_double:
307 double_element_block::erase_block(block, pos);
309 case element_type_string:
310 string_element_block::erase_block(block, pos);
312 case element_type_int16:
313 int16_element_block::erase_block(block, pos);
315 case element_type_uint16:
316 uint16_element_block::erase_block(block, pos);
318 case element_type_int32:
319 int32_element_block::erase_block(block, pos);
321 case element_type_uint32:
322 uint32_element_block::erase_block(block, pos);
324 case element_type_int64:
325 int64_element_block::erase_block(block, pos);
327 case element_type_uint64:
328 uint64_element_block::erase_block(block, pos);
330 case element_type_boolean:
331 boolean_element_block::erase_block(block, pos);
333 case element_type_int8:
334 int8_element_block::erase_block(block, pos);
336 case element_type_uint8:
337 uint8_element_block::erase_block(block, pos);
340 throw general_error(
"erase: failed to erase an element from a block of unknown type.");
344void element_block_func_base::erase(base_element_block& block,
size_t pos,
size_t size)
346 switch (get_block_type(block))
348 case element_type_float:
349 float_element_block::erase_block(block, pos, size);
351 case element_type_double:
352 double_element_block::erase_block(block, pos, size);
354 case element_type_string:
355 string_element_block::erase_block(block, pos, size);
357 case element_type_int16:
358 int16_element_block::erase_block(block, pos, size);
360 case element_type_uint16:
361 uint16_element_block::erase_block(block, pos, size);
363 case element_type_int32:
364 int32_element_block::erase_block(block, pos, size);
366 case element_type_uint32:
367 uint32_element_block::erase_block(block, pos, size);
369 case element_type_int64:
370 int64_element_block::erase_block(block, pos, size);
372 case element_type_uint64:
373 uint64_element_block::erase_block(block, pos, size);
375 case element_type_boolean:
376 boolean_element_block::erase_block(block, pos, size);
378 case element_type_int8:
379 int8_element_block::erase_block(block, pos, size);
381 case element_type_uint8:
382 uint8_element_block::erase_block(block, pos, size);
385 throw general_error(
"erase: failed to erase elements from a block of unknown type.");
389void element_block_func_base::append_values_from_block(base_element_block& dest,
const base_element_block& src)
391 switch (get_block_type(dest))
393 case element_type_float:
394 float_element_block::append_values_from_block(dest, src);
396 case element_type_double:
397 double_element_block::append_values_from_block(dest, src);
399 case element_type_string:
400 string_element_block::append_values_from_block(dest, src);
402 case element_type_int16:
403 int16_element_block::append_values_from_block(dest, src);
405 case element_type_uint16:
406 uint16_element_block::append_values_from_block(dest, src);
408 case element_type_int32:
409 int32_element_block::append_values_from_block(dest, src);
411 case element_type_uint32:
412 uint32_element_block::append_values_from_block(dest, src);
414 case element_type_int64:
415 int64_element_block::append_values_from_block(dest, src);
417 case element_type_uint64:
418 uint64_element_block::append_values_from_block(dest, src);
420 case element_type_boolean:
421 boolean_element_block::append_values_from_block(dest, src);
423 case element_type_int8:
424 int8_element_block::append_values_from_block(dest, src);
426 case element_type_uint8:
427 uint8_element_block::append_values_from_block(dest, src);
430 throw general_error(
"append_values: failed to append values to a block of unknown type.");
434void element_block_func_base::append_values_from_block(
435 base_element_block& dest,
const base_element_block& src,
size_t begin_pos,
size_t len)
437 switch (get_block_type(dest))
439 case element_type_float:
440 float_element_block::append_values_from_block(dest, src, begin_pos, len);
442 case element_type_double:
443 double_element_block::append_values_from_block(dest, src, begin_pos, len);
445 case element_type_string:
446 string_element_block::append_values_from_block(dest, src, begin_pos, len);
448 case element_type_int16:
449 int16_element_block::append_values_from_block(dest, src, begin_pos, len);
451 case element_type_uint16:
452 uint16_element_block::append_values_from_block(dest, src, begin_pos, len);
454 case element_type_int32:
455 int32_element_block::append_values_from_block(dest, src, begin_pos, len);
457 case element_type_uint32:
458 uint32_element_block::append_values_from_block(dest, src, begin_pos, len);
460 case element_type_int64:
461 int64_element_block::append_values_from_block(dest, src, begin_pos, len);
463 case element_type_uint64:
464 uint64_element_block::append_values_from_block(dest, src, begin_pos, len);
466 case element_type_boolean:
467 boolean_element_block::append_values_from_block(dest, src, begin_pos, len);
469 case element_type_int8:
470 int8_element_block::append_values_from_block(dest, src, begin_pos, len);
472 case element_type_uint8:
473 uint8_element_block::append_values_from_block(dest, src, begin_pos, len);
476 throw general_error(
"append_values: failed to append values to a block of unknown type.");
480void element_block_func_base::assign_values_from_block(
481 base_element_block& dest,
const base_element_block& src,
size_t begin_pos,
size_t len)
483 switch (get_block_type(dest))
485 case element_type_float:
486 float_element_block::assign_values_from_block(dest, src, begin_pos, len);
488 case element_type_double:
489 double_element_block::assign_values_from_block(dest, src, begin_pos, len);
491 case element_type_string:
492 string_element_block::assign_values_from_block(dest, src, begin_pos, len);
494 case element_type_int16:
495 int16_element_block::assign_values_from_block(dest, src, begin_pos, len);
497 case element_type_uint16:
498 uint16_element_block::assign_values_from_block(dest, src, begin_pos, len);
500 case element_type_int32:
501 int32_element_block::assign_values_from_block(dest, src, begin_pos, len);
503 case element_type_uint32:
504 uint32_element_block::assign_values_from_block(dest, src, begin_pos, len);
506 case element_type_int64:
507 int64_element_block::assign_values_from_block(dest, src, begin_pos, len);
509 case element_type_uint64:
510 uint64_element_block::assign_values_from_block(dest, src, begin_pos, len);
512 case element_type_boolean:
513 boolean_element_block::assign_values_from_block(dest, src, begin_pos, len);
515 case element_type_int8:
516 int8_element_block::assign_values_from_block(dest, src, begin_pos, len);
518 case element_type_uint8:
519 uint8_element_block::assign_values_from_block(dest, src, begin_pos, len);
522 throw general_error(
"assign_values_from_block: failed to assign values to a block of unknown type.");
526void element_block_func_base::prepend_values_from_block(
527 base_element_block& dest,
const base_element_block& src,
size_t begin_pos,
size_t len)
529 switch (get_block_type(dest))
531 case element_type_float:
532 float_element_block::prepend_values_from_block(dest, src, begin_pos, len);
534 case element_type_double:
535 double_element_block::prepend_values_from_block(dest, src, begin_pos, len);
537 case element_type_string:
538 string_element_block::prepend_values_from_block(dest, src, begin_pos, len);
540 case element_type_int16:
541 int16_element_block::prepend_values_from_block(dest, src, begin_pos, len);
543 case element_type_uint16:
544 uint16_element_block::prepend_values_from_block(dest, src, begin_pos, len);
546 case element_type_int32:
547 int32_element_block::prepend_values_from_block(dest, src, begin_pos, len);
549 case element_type_uint32:
550 uint32_element_block::prepend_values_from_block(dest, src, begin_pos, len);
552 case element_type_int64:
553 int64_element_block::prepend_values_from_block(dest, src, begin_pos, len);
555 case element_type_uint64:
556 uint64_element_block::prepend_values_from_block(dest, src, begin_pos, len);
558 case element_type_boolean:
559 boolean_element_block::prepend_values_from_block(dest, src, begin_pos, len);
561 case element_type_int8:
562 int8_element_block::prepend_values_from_block(dest, src, begin_pos, len);
564 case element_type_uint8:
565 uint8_element_block::prepend_values_from_block(dest, src, begin_pos, len);
568 throw general_error(
"prepend_values_from_block: failed to prepend values to a block of unknown type.");
572void element_block_func_base::swap_values(
573 base_element_block& blk1, base_element_block& blk2,
size_t pos1,
size_t pos2,
size_t len)
575 element_t blk1_type = get_block_type(blk1);
576 assert(blk1_type == get_block_type(blk2));
580 case element_type_float:
581 float_element_block::swap_values(blk1, blk2, pos1, pos2, len);
583 case element_type_double:
584 double_element_block::swap_values(blk1, blk2, pos1, pos2, len);
586 case element_type_string:
587 string_element_block::swap_values(blk1, blk2, pos1, pos2, len);
589 case element_type_int16:
590 int16_element_block::swap_values(blk1, blk2, pos1, pos2, len);
592 case element_type_uint16:
593 uint16_element_block::swap_values(blk1, blk2, pos1, pos2, len);
595 case element_type_int32:
596 int32_element_block::swap_values(blk1, blk2, pos1, pos2, len);
598 case element_type_uint32:
599 uint32_element_block::swap_values(blk1, blk2, pos1, pos2, len);
601 case element_type_int64:
602 int64_element_block::swap_values(blk1, blk2, pos1, pos2, len);
604 case element_type_uint64:
605 uint64_element_block::swap_values(blk1, blk2, pos1, pos2, len);
607 case element_type_boolean:
608 boolean_element_block::swap_values(blk1, blk2, pos1, pos2, len);
610 case element_type_int8:
611 int8_element_block::swap_values(blk1, blk2, pos1, pos2, len);
613 case element_type_uint8:
614 uint8_element_block::swap_values(blk1, blk2, pos1, pos2, len);
617 throw general_error(
"swap_values: block of unknown type.");
621bool element_block_func_base::equal_block(
const base_element_block& left,
const base_element_block& right)
623 element_t block_type = get_block_type(left);
624 if (block_type != get_block_type(right))
629 case element_type_float:
630 return float_element_block::get(left) == float_element_block::get(right);
631 case element_type_double:
632 return double_element_block::get(left) == double_element_block::get(right);
633 case element_type_string:
634 return string_element_block::get(left) == string_element_block::get(right);
635 case element_type_int16:
636 return int16_element_block::get(left) == int16_element_block::get(right);
637 case element_type_uint16:
638 return uint16_element_block::get(left) == uint16_element_block::get(right);
639 case element_type_int32:
640 return int32_element_block::get(left) == int32_element_block::get(right);
641 case element_type_uint32:
642 return uint32_element_block::get(left) == uint32_element_block::get(right);
643 case element_type_int64:
644 return int64_element_block::get(left) == int64_element_block::get(right);
645 case element_type_uint64:
646 return uint64_element_block::get(left) == uint64_element_block::get(right);
647 case element_type_boolean:
648 return boolean_element_block::get(left) == boolean_element_block::get(right);
649 case element_type_int8:
650 return int8_element_block::get(left) == int8_element_block::get(right);
651 case element_type_uint8:
652 return uint8_element_block::get(left) == uint8_element_block::get(right);
665 switch (get_block_type(block))
667 case element_type_float:
668 float_element_block::shrink_to_fit(block);
670 case element_type_double:
671 double_element_block::shrink_to_fit(block);
673 case element_type_string:
674 string_element_block::shrink_to_fit(block);
676 case element_type_int16:
677 int16_element_block::shrink_to_fit(block);
679 case element_type_uint16:
680 uint16_element_block::shrink_to_fit(block);
682 case element_type_int32:
683 int32_element_block::shrink_to_fit(block);
685 case element_type_uint32:
686 uint32_element_block::shrink_to_fit(block);
688 case element_type_int64:
689 int64_element_block::shrink_to_fit(block);
691 case element_type_uint64:
692 uint64_element_block::shrink_to_fit(block);
694 case element_type_boolean:
695 boolean_element_block::shrink_to_fit(block);
697 case element_type_int8:
698 int8_element_block::shrink_to_fit(block);
700 case element_type_uint8:
701 uint8_element_block::shrink_to_fit(block);
704 throw general_error(
"shrink_to_fit: failed to print a block of unknown type.");
708size_t element_block_func_base::size(
const base_element_block& block)
710 switch (get_block_type(block))
712 case element_type_float:
713 return float_element_block::size(block);
714 case element_type_double:
715 return double_element_block::size(block);
716 case element_type_string:
717 return string_element_block::size(block);
718 case element_type_int16:
719 return int16_element_block::size(block);
720 case element_type_uint16:
721 return uint16_element_block::size(block);
722 case element_type_int32:
723 return int32_element_block::size(block);
724 case element_type_uint32:
725 return uint32_element_block::size(block);
726 case element_type_int64:
727 return int64_element_block::size(block);
728 case element_type_uint64:
729 return uint64_element_block::size(block);
730 case element_type_boolean:
731 return boolean_element_block::size(block);
732 case element_type_int8:
733 return int8_element_block::size(block);
734 case element_type_uint8:
735 return uint8_element_block::size(block);
737 throw general_error(
"size: failed to print a block of unknown type.");
static void overwrite_values(base_element_block &block, size_t pos, size_t len)
Definition trait.hpp:658