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 {
37 struct element_block_func_base
39 inline static base_element_block* create_new_block(element_t type,
size_t init_size);
41 inline static base_element_block* clone_block(
const base_element_block& block);
43 inline static void delete_block(
const base_element_block* p);
45 inline static void resize_block(base_element_block& block,
size_t new_size);
47 inline static void print_block(
const base_element_block& block);
49 inline static void erase(base_element_block& block,
size_t pos);
51 inline static void erase(base_element_block& block,
size_t pos,
size_t size);
53 inline static void append_values_from_block(base_element_block& dest,
const base_element_block& src);
55 inline static void append_values_from_block(
56 base_element_block& dest,
const base_element_block& src,
size_t begin_pos,
size_t len);
58 inline static void assign_values_from_block(
59 base_element_block& dest,
const base_element_block& src,
size_t begin_pos,
size_t len);
61 inline static void prepend_values_from_block(
62 base_element_block& dest,
const base_element_block& src,
size_t begin_pos,
size_t len);
64 inline static void swap_values(
65 base_element_block& blk1, base_element_block& blk2,
size_t pos1,
size_t pos2,
size_t len);
67 inline static bool equal_block(
const base_element_block& left,
const base_element_block& right);
76 inline static void overwrite_values(base_element_block& block,
size_t pos,
size_t len);
78 inline static void shrink_to_fit(base_element_block& block);
80 inline static size_t size(
const base_element_block& block);
83 base_element_block* element_block_func_base::create_new_block(element_t type,
size_t init_size)
87 case element_type_float:
88 return float_element_block::create_block(init_size);
89 case element_type_double:
90 return double_element_block::create_block(init_size);
91 case element_type_string:
92 return string_element_block::create_block(init_size);
93 case element_type_int16:
94 return int16_element_block::create_block(init_size);
95 case element_type_uint16:
96 return uint16_element_block::create_block(init_size);
97 case element_type_int32:
98 return int32_element_block::create_block(init_size);
99 case element_type_uint32:
100 return uint32_element_block::create_block(init_size);
101 case element_type_int64:
102 return int64_element_block::create_block(init_size);
103 case element_type_uint64:
104 return uint64_element_block::create_block(init_size);
105 case element_type_boolean:
106 return boolean_element_block::create_block(init_size);
107 case element_type_int8:
108 return int8_element_block::create_block(init_size);
109 case element_type_uint8:
110 return uint8_element_block::create_block(init_size);
112 throw general_error(
"create_new_block: failed to create a new block of unknown type.");
116 base_element_block* element_block_func_base::clone_block(
const base_element_block& block)
118 switch (get_block_type(block))
120 case element_type_float:
121 return float_element_block::clone_block(block);
122 case element_type_double:
123 return double_element_block::clone_block(block);
124 case element_type_string:
125 return string_element_block::clone_block(block);
126 case element_type_int16:
127 return int16_element_block::clone_block(block);
128 case element_type_uint16:
129 return uint16_element_block::clone_block(block);
130 case element_type_int32:
131 return int32_element_block::clone_block(block);
132 case element_type_uint32:
133 return uint32_element_block::clone_block(block);
134 case element_type_int64:
135 return int64_element_block::clone_block(block);
136 case element_type_uint64:
137 return uint64_element_block::clone_block(block);
138 case element_type_boolean:
139 return boolean_element_block::clone_block(block);
140 case element_type_int8:
141 return int8_element_block::clone_block(block);
142 case element_type_uint8:
143 return uint8_element_block::clone_block(block);
145 throw general_error(
"clone_block: failed to clone a block of unknown type.");
149 void element_block_func_base::delete_block(
const base_element_block* p)
154 switch (get_block_type(*p))
156 case element_type_float:
157 float_element_block::delete_block(p);
159 case element_type_double:
160 double_element_block::delete_block(p);
162 case element_type_string:
163 string_element_block::delete_block(p);
165 case element_type_int16:
166 int16_element_block::delete_block(p);
168 case element_type_uint16:
169 uint16_element_block::delete_block(p);
171 case element_type_int32:
172 int32_element_block::delete_block(p);
174 case element_type_uint32:
175 uint32_element_block::delete_block(p);
177 case element_type_int64:
178 int64_element_block::delete_block(p);
180 case element_type_uint64:
181 uint64_element_block::delete_block(p);
183 case element_type_boolean:
184 boolean_element_block::delete_block(p);
186 case element_type_int8:
187 int8_element_block::delete_block(p);
189 case element_type_uint8:
190 uint8_element_block::delete_block(p);
194 #ifdef MDDS_MULTI_TYPE_VECTOR_DEBUG
197 cerr << __FILE__ <<
"#" << __LINE__ <<
" (element_block_func_base:delete_block): "
198 <<
"failed to delete a block of unknown type (" << get_block_type(*p) <<
")"
205 void element_block_func_base::resize_block(base_element_block& block,
size_t new_size)
207 switch (get_block_type(block))
209 case element_type_float:
210 float_element_block::resize_block(block, new_size);
212 case element_type_double:
213 double_element_block::resize_block(block, new_size);
215 case element_type_string:
216 string_element_block::resize_block(block, new_size);
218 case element_type_int16:
219 int16_element_block::resize_block(block, new_size);
221 case element_type_uint16:
222 uint16_element_block::resize_block(block, new_size);
224 case element_type_int32:
225 int32_element_block::resize_block(block, new_size);
227 case element_type_uint32:
228 uint32_element_block::resize_block(block, new_size);
230 case element_type_int64:
231 int64_element_block::resize_block(block, new_size);
233 case element_type_uint64:
234 uint64_element_block::resize_block(block, new_size);
236 case element_type_boolean:
237 boolean_element_block::resize_block(block, new_size);
239 case element_type_int8:
240 int8_element_block::resize_block(block, new_size);
242 case element_type_uint8:
243 uint8_element_block::resize_block(block, new_size);
246 throw general_error(
"resize_block: failed to resize a block of unknown type.");
250 void element_block_func_base::print_block(
const base_element_block& block)
252 switch (get_block_type(block))
254 case element_type_float:
255 float_element_block::print_block(block);
257 case element_type_double:
258 double_element_block::print_block(block);
260 case element_type_string:
261 string_element_block::print_block(block);
263 case element_type_int16:
264 int16_element_block::print_block(block);
266 case element_type_uint16:
267 uint16_element_block::print_block(block);
269 case element_type_int32:
270 int32_element_block::print_block(block);
272 case element_type_uint32:
273 uint32_element_block::print_block(block);
275 case element_type_int64:
276 int64_element_block::print_block(block);
278 case element_type_uint64:
279 uint64_element_block::print_block(block);
281 case element_type_boolean:
282 boolean_element_block::print_block(block);
284 case element_type_int8:
285 int8_element_block::print_block(block);
287 case element_type_uint8:
288 uint8_element_block::print_block(block);
291 throw general_error(
"print_block: failed to print a block of unknown type.");
295 void element_block_func_base::erase(base_element_block& block,
size_t pos)
297 switch (get_block_type(block))
299 case element_type_float:
300 float_element_block::erase_block(block, pos);
302 case element_type_double:
303 double_element_block::erase_block(block, pos);
305 case element_type_string:
306 string_element_block::erase_block(block, pos);
308 case element_type_int16:
309 int16_element_block::erase_block(block, pos);
311 case element_type_uint16:
312 uint16_element_block::erase_block(block, pos);
314 case element_type_int32:
315 int32_element_block::erase_block(block, pos);
317 case element_type_uint32:
318 uint32_element_block::erase_block(block, pos);
320 case element_type_int64:
321 int64_element_block::erase_block(block, pos);
323 case element_type_uint64:
324 uint64_element_block::erase_block(block, pos);
326 case element_type_boolean:
327 boolean_element_block::erase_block(block, pos);
329 case element_type_int8:
330 int8_element_block::erase_block(block, pos);
332 case element_type_uint8:
333 uint8_element_block::erase_block(block, pos);
336 throw general_error(
"erase: failed to erase an element from a block of unknown type.");
340 void element_block_func_base::erase(base_element_block& block,
size_t pos,
size_t size)
342 switch (get_block_type(block))
344 case element_type_float:
345 float_element_block::erase_block(block, pos, size);
347 case element_type_double:
348 double_element_block::erase_block(block, pos, size);
350 case element_type_string:
351 string_element_block::erase_block(block, pos, size);
353 case element_type_int16:
354 int16_element_block::erase_block(block, pos, size);
356 case element_type_uint16:
357 uint16_element_block::erase_block(block, pos, size);
359 case element_type_int32:
360 int32_element_block::erase_block(block, pos, size);
362 case element_type_uint32:
363 uint32_element_block::erase_block(block, pos, size);
365 case element_type_int64:
366 int64_element_block::erase_block(block, pos, size);
368 case element_type_uint64:
369 uint64_element_block::erase_block(block, pos, size);
371 case element_type_boolean:
372 boolean_element_block::erase_block(block, pos, size);
374 case element_type_int8:
375 int8_element_block::erase_block(block, pos, size);
377 case element_type_uint8:
378 uint8_element_block::erase_block(block, pos, size);
381 throw general_error(
"erase: failed to erase elements from a block of unknown type.");
385 void element_block_func_base::append_values_from_block(base_element_block& dest,
const base_element_block& src)
387 switch (get_block_type(dest))
389 case element_type_float:
390 float_element_block::append_values_from_block(dest, src);
392 case element_type_double:
393 double_element_block::append_values_from_block(dest, src);
395 case element_type_string:
396 string_element_block::append_values_from_block(dest, src);
398 case element_type_int16:
399 int16_element_block::append_values_from_block(dest, src);
401 case element_type_uint16:
402 uint16_element_block::append_values_from_block(dest, src);
404 case element_type_int32:
405 int32_element_block::append_values_from_block(dest, src);
407 case element_type_uint32:
408 uint32_element_block::append_values_from_block(dest, src);
410 case element_type_int64:
411 int64_element_block::append_values_from_block(dest, src);
413 case element_type_uint64:
414 uint64_element_block::append_values_from_block(dest, src);
416 case element_type_boolean:
417 boolean_element_block::append_values_from_block(dest, src);
419 case element_type_int8:
420 int8_element_block::append_values_from_block(dest, src);
422 case element_type_uint8:
423 uint8_element_block::append_values_from_block(dest, src);
426 throw general_error(
"append_values: failed to append values to a block of unknown type.");
430 void element_block_func_base::append_values_from_block(
431 base_element_block& dest,
const base_element_block& src,
size_t begin_pos,
size_t len)
433 switch (get_block_type(dest))
435 case element_type_float:
436 float_element_block::append_values_from_block(dest, src, begin_pos, len);
438 case element_type_double:
439 double_element_block::append_values_from_block(dest, src, begin_pos, len);
441 case element_type_string:
442 string_element_block::append_values_from_block(dest, src, begin_pos, len);
444 case element_type_int16:
445 int16_element_block::append_values_from_block(dest, src, begin_pos, len);
447 case element_type_uint16:
448 uint16_element_block::append_values_from_block(dest, src, begin_pos, len);
450 case element_type_int32:
451 int32_element_block::append_values_from_block(dest, src, begin_pos, len);
453 case element_type_uint32:
454 uint32_element_block::append_values_from_block(dest, src, begin_pos, len);
456 case element_type_int64:
457 int64_element_block::append_values_from_block(dest, src, begin_pos, len);
459 case element_type_uint64:
460 uint64_element_block::append_values_from_block(dest, src, begin_pos, len);
462 case element_type_boolean:
463 boolean_element_block::append_values_from_block(dest, src, begin_pos, len);
465 case element_type_int8:
466 int8_element_block::append_values_from_block(dest, src, begin_pos, len);
468 case element_type_uint8:
469 uint8_element_block::append_values_from_block(dest, src, begin_pos, len);
472 throw general_error(
"append_values: failed to append values to a block of unknown type.");
476 void element_block_func_base::assign_values_from_block(
477 base_element_block& dest,
const base_element_block& src,
size_t begin_pos,
size_t len)
479 switch (get_block_type(dest))
481 case element_type_float:
482 float_element_block::assign_values_from_block(dest, src, begin_pos, len);
484 case element_type_double:
485 double_element_block::assign_values_from_block(dest, src, begin_pos, len);
487 case element_type_string:
488 string_element_block::assign_values_from_block(dest, src, begin_pos, len);
490 case element_type_int16:
491 int16_element_block::assign_values_from_block(dest, src, begin_pos, len);
493 case element_type_uint16:
494 uint16_element_block::assign_values_from_block(dest, src, begin_pos, len);
496 case element_type_int32:
497 int32_element_block::assign_values_from_block(dest, src, begin_pos, len);
499 case element_type_uint32:
500 uint32_element_block::assign_values_from_block(dest, src, begin_pos, len);
502 case element_type_int64:
503 int64_element_block::assign_values_from_block(dest, src, begin_pos, len);
505 case element_type_uint64:
506 uint64_element_block::assign_values_from_block(dest, src, begin_pos, len);
508 case element_type_boolean:
509 boolean_element_block::assign_values_from_block(dest, src, begin_pos, len);
511 case element_type_int8:
512 int8_element_block::assign_values_from_block(dest, src, begin_pos, len);
514 case element_type_uint8:
515 uint8_element_block::assign_values_from_block(dest, src, begin_pos, len);
518 throw general_error(
"assign_values_from_block: failed to assign values to a block of unknown type.");
522 void element_block_func_base::prepend_values_from_block(
523 base_element_block& dest,
const base_element_block& src,
size_t begin_pos,
size_t len)
525 switch (get_block_type(dest))
527 case element_type_float:
528 float_element_block::prepend_values_from_block(dest, src, begin_pos, len);
530 case element_type_double:
531 double_element_block::prepend_values_from_block(dest, src, begin_pos, len);
533 case element_type_string:
534 string_element_block::prepend_values_from_block(dest, src, begin_pos, len);
536 case element_type_int16:
537 int16_element_block::prepend_values_from_block(dest, src, begin_pos, len);
539 case element_type_uint16:
540 uint16_element_block::prepend_values_from_block(dest, src, begin_pos, len);
542 case element_type_int32:
543 int32_element_block::prepend_values_from_block(dest, src, begin_pos, len);
545 case element_type_uint32:
546 uint32_element_block::prepend_values_from_block(dest, src, begin_pos, len);
548 case element_type_int64:
549 int64_element_block::prepend_values_from_block(dest, src, begin_pos, len);
551 case element_type_uint64:
552 uint64_element_block::prepend_values_from_block(dest, src, begin_pos, len);
554 case element_type_boolean:
555 boolean_element_block::prepend_values_from_block(dest, src, begin_pos, len);
557 case element_type_int8:
558 int8_element_block::prepend_values_from_block(dest, src, begin_pos, len);
560 case element_type_uint8:
561 uint8_element_block::prepend_values_from_block(dest, src, begin_pos, len);
564 throw general_error(
"prepend_values_from_block: failed to prepend values to a block of unknown type.");
568 void element_block_func_base::swap_values(
569 base_element_block& blk1, base_element_block& blk2,
size_t pos1,
size_t pos2,
size_t len)
571 element_t blk1_type = get_block_type(blk1);
572 assert(blk1_type == get_block_type(blk2));
576 case element_type_float:
577 float_element_block::swap_values(blk1, blk2, pos1, pos2, len);
579 case element_type_double:
580 double_element_block::swap_values(blk1, blk2, pos1, pos2, len);
582 case element_type_string:
583 string_element_block::swap_values(blk1, blk2, pos1, pos2, len);
585 case element_type_int16:
586 int16_element_block::swap_values(blk1, blk2, pos1, pos2, len);
588 case element_type_uint16:
589 uint16_element_block::swap_values(blk1, blk2, pos1, pos2, len);
591 case element_type_int32:
592 int32_element_block::swap_values(blk1, blk2, pos1, pos2, len);
594 case element_type_uint32:
595 uint32_element_block::swap_values(blk1, blk2, pos1, pos2, len);
597 case element_type_int64:
598 int64_element_block::swap_values(blk1, blk2, pos1, pos2, len);
600 case element_type_uint64:
601 uint64_element_block::swap_values(blk1, blk2, pos1, pos2, len);
603 case element_type_boolean:
604 boolean_element_block::swap_values(blk1, blk2, pos1, pos2, len);
606 case element_type_int8:
607 int8_element_block::swap_values(blk1, blk2, pos1, pos2, len);
609 case element_type_uint8:
610 uint8_element_block::swap_values(blk1, blk2, pos1, pos2, len);
613 throw general_error(
"swap_values: block of unknown type.");
617 bool element_block_func_base::equal_block(
const base_element_block& left,
const base_element_block& right)
619 element_t block_type = get_block_type(left);
620 if (block_type != get_block_type(right))
625 case element_type_float:
626 return float_element_block::get(left) == float_element_block::get(right);
627 case element_type_double:
628 return double_element_block::get(left) == double_element_block::get(right);
629 case element_type_string:
630 return string_element_block::get(left) == string_element_block::get(right);
631 case element_type_int16:
632 return int16_element_block::get(left) == int16_element_block::get(right);
633 case element_type_uint16:
634 return uint16_element_block::get(left) == uint16_element_block::get(right);
635 case element_type_int32:
636 return int32_element_block::get(left) == int32_element_block::get(right);
637 case element_type_uint32:
638 return uint32_element_block::get(left) == uint32_element_block::get(right);
639 case element_type_int64:
640 return int64_element_block::get(left) == int64_element_block::get(right);
641 case element_type_uint64:
642 return uint64_element_block::get(left) == uint64_element_block::get(right);
643 case element_type_boolean:
644 return boolean_element_block::get(left) == boolean_element_block::get(right);
645 case element_type_int8:
646 return int8_element_block::get(left) == int8_element_block::get(right);
647 case element_type_uint8:
648 return uint8_element_block::get(left) == uint8_element_block::get(right);
660 void element_block_func_base::shrink_to_fit(base_element_block& block)
662 switch (get_block_type(block))
664 case element_type_float:
665 float_element_block::shrink_to_fit(block);
667 case element_type_double:
668 double_element_block::shrink_to_fit(block);
670 case element_type_string:
671 string_element_block::shrink_to_fit(block);
673 case element_type_int16:
674 int16_element_block::shrink_to_fit(block);
676 case element_type_uint16:
677 uint16_element_block::shrink_to_fit(block);
679 case element_type_int32:
680 int32_element_block::shrink_to_fit(block);
682 case element_type_uint32:
683 uint32_element_block::shrink_to_fit(block);
685 case element_type_int64:
686 int64_element_block::shrink_to_fit(block);
688 case element_type_uint64:
689 uint64_element_block::shrink_to_fit(block);
691 case element_type_boolean:
692 boolean_element_block::shrink_to_fit(block);
694 case element_type_int8:
695 int8_element_block::shrink_to_fit(block);
697 case element_type_uint8:
698 uint8_element_block::shrink_to_fit(block);
701 throw general_error(
"shrink_to_fit: failed to print a block of unknown type.");
707 switch (get_block_type(block))
709 case element_type_float:
710 return float_element_block::size(block);
711 case element_type_double:
712 return double_element_block::size(block);
713 case element_type_string:
714 return string_element_block::size(block);
715 case element_type_int16:
716 return int16_element_block::size(block);
717 case element_type_uint16:
718 return uint16_element_block::size(block);
719 case element_type_int32:
720 return int32_element_block::size(block);
721 case element_type_uint32:
722 return uint32_element_block::size(block);
723 case element_type_int64:
724 return int64_element_block::size(block);
725 case element_type_uint64:
726 return uint64_element_block::size(block);
727 case element_type_boolean:
728 return boolean_element_block::size(block);
729 case element_type_int8:
730 return int8_element_block::size(block);
731 case element_type_uint8:
732 return uint8_element_block::size(block);
734 throw general_error(
"size: failed to print a block of unknown type.");