29 #ifndef INCLUDED_MDDS_MULTI_TYPE_VECTOR_TRAIT_2_HPP
30 #define INCLUDED_MDDS_MULTI_TYPE_VECTOR_TRAIT_2_HPP
36 namespace 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(
84 base_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.");
117 base_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.");
150 void 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) <<
")"
202 throw general_error(os.str());
204 throw general_error(
"delete_block: failed to delete a block of unknown type.");
210 void element_block_func_base::resize_block(base_element_block& block,
size_t new_size)
212 switch (get_block_type(block))
214 case element_type_float:
215 float_element_block::resize_block(block, new_size);
217 case element_type_double:
218 double_element_block::resize_block(block, new_size);
220 case element_type_string:
221 string_element_block::resize_block(block, new_size);
223 case element_type_int16:
224 int16_element_block::resize_block(block, new_size);
226 case element_type_uint16:
227 uint16_element_block::resize_block(block, new_size);
229 case element_type_int32:
230 int32_element_block::resize_block(block, new_size);
232 case element_type_uint32:
233 uint32_element_block::resize_block(block, new_size);
235 case element_type_int64:
236 int64_element_block::resize_block(block, new_size);
238 case element_type_uint64:
239 uint64_element_block::resize_block(block, new_size);
241 case element_type_boolean:
242 boolean_element_block::resize_block(block, new_size);
244 case element_type_int8:
245 int8_element_block::resize_block(block, new_size);
247 case element_type_uint8:
248 uint8_element_block::resize_block(block, new_size);
251 throw general_error(
"resize_block: failed to resize a block of unknown type.");
255 void element_block_func_base::print_block(
const base_element_block& block)
257 switch (get_block_type(block))
259 case element_type_float:
260 float_element_block::print_block(block);
262 case element_type_double:
263 double_element_block::print_block(block);
265 case element_type_string:
266 string_element_block::print_block(block);
268 case element_type_int16:
269 int16_element_block::print_block(block);
271 case element_type_uint16:
272 uint16_element_block::print_block(block);
274 case element_type_int32:
275 int32_element_block::print_block(block);
277 case element_type_uint32:
278 uint32_element_block::print_block(block);
280 case element_type_int64:
281 int64_element_block::print_block(block);
283 case element_type_uint64:
284 uint64_element_block::print_block(block);
286 case element_type_boolean:
287 boolean_element_block::print_block(block);
289 case element_type_int8:
290 int8_element_block::print_block(block);
292 case element_type_uint8:
293 uint8_element_block::print_block(block);
296 throw general_error(
"print_block: failed to print a block of unknown type.");
300 void element_block_func_base::erase(base_element_block& block,
size_t pos)
302 switch (get_block_type(block))
304 case element_type_float:
305 float_element_block::erase_block(block, pos);
307 case element_type_double:
308 double_element_block::erase_block(block, pos);
310 case element_type_string:
311 string_element_block::erase_block(block, pos);
313 case element_type_int16:
314 int16_element_block::erase_block(block, pos);
316 case element_type_uint16:
317 uint16_element_block::erase_block(block, pos);
319 case element_type_int32:
320 int32_element_block::erase_block(block, pos);
322 case element_type_uint32:
323 uint32_element_block::erase_block(block, pos);
325 case element_type_int64:
326 int64_element_block::erase_block(block, pos);
328 case element_type_uint64:
329 uint64_element_block::erase_block(block, pos);
331 case element_type_boolean:
332 boolean_element_block::erase_block(block, pos);
334 case element_type_int8:
335 int8_element_block::erase_block(block, pos);
337 case element_type_uint8:
338 uint8_element_block::erase_block(block, pos);
341 throw general_error(
"erase: failed to erase an element from a block of unknown type.");
345 void element_block_func_base::erase(base_element_block& block,
size_t pos,
size_t size)
347 switch (get_block_type(block))
349 case element_type_float:
350 float_element_block::erase_block(block, pos, size);
352 case element_type_double:
353 double_element_block::erase_block(block, pos, size);
355 case element_type_string:
356 string_element_block::erase_block(block, pos, size);
358 case element_type_int16:
359 int16_element_block::erase_block(block, pos, size);
361 case element_type_uint16:
362 uint16_element_block::erase_block(block, pos, size);
364 case element_type_int32:
365 int32_element_block::erase_block(block, pos, size);
367 case element_type_uint32:
368 uint32_element_block::erase_block(block, pos, size);
370 case element_type_int64:
371 int64_element_block::erase_block(block, pos, size);
373 case element_type_uint64:
374 uint64_element_block::erase_block(block, pos, size);
376 case element_type_boolean:
377 boolean_element_block::erase_block(block, pos, size);
379 case element_type_int8:
380 int8_element_block::erase_block(block, pos, size);
382 case element_type_uint8:
383 uint8_element_block::erase_block(block, pos, size);
386 throw general_error(
"erase: failed to erase elements from a block of unknown type.");
390 void element_block_func_base::append_values_from_block(base_element_block& dest,
const base_element_block& src)
392 switch (get_block_type(dest))
394 case element_type_float:
395 float_element_block::append_values_from_block(dest, src);
397 case element_type_double:
398 double_element_block::append_values_from_block(dest, src);
400 case element_type_string:
401 string_element_block::append_values_from_block(dest, src);
403 case element_type_int16:
404 int16_element_block::append_values_from_block(dest, src);
406 case element_type_uint16:
407 uint16_element_block::append_values_from_block(dest, src);
409 case element_type_int32:
410 int32_element_block::append_values_from_block(dest, src);
412 case element_type_uint32:
413 uint32_element_block::append_values_from_block(dest, src);
415 case element_type_int64:
416 int64_element_block::append_values_from_block(dest, src);
418 case element_type_uint64:
419 uint64_element_block::append_values_from_block(dest, src);
421 case element_type_boolean:
422 boolean_element_block::append_values_from_block(dest, src);
424 case element_type_int8:
425 int8_element_block::append_values_from_block(dest, src);
427 case element_type_uint8:
428 uint8_element_block::append_values_from_block(dest, src);
431 throw general_error(
"append_values: failed to append values to a block of unknown type.");
435 void element_block_func_base::append_values_from_block(
436 base_element_block& dest,
const base_element_block& src,
size_t begin_pos,
size_t len)
438 switch (get_block_type(dest))
440 case element_type_float:
441 float_element_block::append_values_from_block(dest, src, begin_pos, len);
443 case element_type_double:
444 double_element_block::append_values_from_block(dest, src, begin_pos, len);
446 case element_type_string:
447 string_element_block::append_values_from_block(dest, src, begin_pos, len);
449 case element_type_int16:
450 int16_element_block::append_values_from_block(dest, src, begin_pos, len);
452 case element_type_uint16:
453 uint16_element_block::append_values_from_block(dest, src, begin_pos, len);
455 case element_type_int32:
456 int32_element_block::append_values_from_block(dest, src, begin_pos, len);
458 case element_type_uint32:
459 uint32_element_block::append_values_from_block(dest, src, begin_pos, len);
461 case element_type_int64:
462 int64_element_block::append_values_from_block(dest, src, begin_pos, len);
464 case element_type_uint64:
465 uint64_element_block::append_values_from_block(dest, src, begin_pos, len);
467 case element_type_boolean:
468 boolean_element_block::append_values_from_block(dest, src, begin_pos, len);
470 case element_type_int8:
471 int8_element_block::append_values_from_block(dest, src, begin_pos, len);
473 case element_type_uint8:
474 uint8_element_block::append_values_from_block(dest, src, begin_pos, len);
477 throw general_error(
"append_values: failed to append values to a block of unknown type.");
481 void element_block_func_base::assign_values_from_block(
482 base_element_block& dest,
const base_element_block& src,
size_t begin_pos,
size_t len)
484 switch (get_block_type(dest))
486 case element_type_float:
487 float_element_block::assign_values_from_block(dest, src, begin_pos, len);
489 case element_type_double:
490 double_element_block::assign_values_from_block(dest, src, begin_pos, len);
492 case element_type_string:
493 string_element_block::assign_values_from_block(dest, src, begin_pos, len);
495 case element_type_int16:
496 int16_element_block::assign_values_from_block(dest, src, begin_pos, len);
498 case element_type_uint16:
499 uint16_element_block::assign_values_from_block(dest, src, begin_pos, len);
501 case element_type_int32:
502 int32_element_block::assign_values_from_block(dest, src, begin_pos, len);
504 case element_type_uint32:
505 uint32_element_block::assign_values_from_block(dest, src, begin_pos, len);
507 case element_type_int64:
508 int64_element_block::assign_values_from_block(dest, src, begin_pos, len);
510 case element_type_uint64:
511 uint64_element_block::assign_values_from_block(dest, src, begin_pos, len);
513 case element_type_boolean:
514 boolean_element_block::assign_values_from_block(dest, src, begin_pos, len);
516 case element_type_int8:
517 int8_element_block::assign_values_from_block(dest, src, begin_pos, len);
519 case element_type_uint8:
520 uint8_element_block::assign_values_from_block(dest, src, begin_pos, len);
523 throw general_error(
"assign_values_from_block: failed to assign values to a block of unknown type.");
527 void element_block_func_base::prepend_values_from_block(
528 base_element_block& dest,
const base_element_block& src,
size_t begin_pos,
size_t len)
530 switch (get_block_type(dest))
532 case element_type_float:
533 float_element_block::prepend_values_from_block(dest, src, begin_pos, len);
535 case element_type_double:
536 double_element_block::prepend_values_from_block(dest, src, begin_pos, len);
538 case element_type_string:
539 string_element_block::prepend_values_from_block(dest, src, begin_pos, len);
541 case element_type_int16:
542 int16_element_block::prepend_values_from_block(dest, src, begin_pos, len);
544 case element_type_uint16:
545 uint16_element_block::prepend_values_from_block(dest, src, begin_pos, len);
547 case element_type_int32:
548 int32_element_block::prepend_values_from_block(dest, src, begin_pos, len);
550 case element_type_uint32:
551 uint32_element_block::prepend_values_from_block(dest, src, begin_pos, len);
553 case element_type_int64:
554 int64_element_block::prepend_values_from_block(dest, src, begin_pos, len);
556 case element_type_uint64:
557 uint64_element_block::prepend_values_from_block(dest, src, begin_pos, len);
559 case element_type_boolean:
560 boolean_element_block::prepend_values_from_block(dest, src, begin_pos, len);
562 case element_type_int8:
563 int8_element_block::prepend_values_from_block(dest, src, begin_pos, len);
565 case element_type_uint8:
566 uint8_element_block::prepend_values_from_block(dest, src, begin_pos, len);
569 throw general_error(
"prepend_values_from_block: failed to prepend values to a block of unknown type.");
573 void element_block_func_base::swap_values(
574 base_element_block& blk1, base_element_block& blk2,
size_t pos1,
size_t pos2,
size_t len)
576 element_t blk1_type = get_block_type(blk1);
577 assert(blk1_type == get_block_type(blk2));
581 case element_type_float:
582 float_element_block::swap_values(blk1, blk2, pos1, pos2, len);
584 case element_type_double:
585 double_element_block::swap_values(blk1, blk2, pos1, pos2, len);
587 case element_type_string:
588 string_element_block::swap_values(blk1, blk2, pos1, pos2, len);
590 case element_type_int16:
591 int16_element_block::swap_values(blk1, blk2, pos1, pos2, len);
593 case element_type_uint16:
594 uint16_element_block::swap_values(blk1, blk2, pos1, pos2, len);
596 case element_type_int32:
597 int32_element_block::swap_values(blk1, blk2, pos1, pos2, len);
599 case element_type_uint32:
600 uint32_element_block::swap_values(blk1, blk2, pos1, pos2, len);
602 case element_type_int64:
603 int64_element_block::swap_values(blk1, blk2, pos1, pos2, len);
605 case element_type_uint64:
606 uint64_element_block::swap_values(blk1, blk2, pos1, pos2, len);
608 case element_type_boolean:
609 boolean_element_block::swap_values(blk1, blk2, pos1, pos2, len);
611 case element_type_int8:
612 int8_element_block::swap_values(blk1, blk2, pos1, pos2, len);
614 case element_type_uint8:
615 uint8_element_block::swap_values(blk1, blk2, pos1, pos2, len);
618 throw general_error(
"swap_values: block of unknown type.");
622 bool element_block_func_base::equal_block(
const base_element_block& left,
const base_element_block& right)
624 element_t block_type = get_block_type(left);
625 if (block_type != get_block_type(right))
630 case element_type_float:
631 return float_element_block::get(left) == float_element_block::get(right);
632 case element_type_double:
633 return double_element_block::get(left) == double_element_block::get(right);
634 case element_type_string:
635 return string_element_block::get(left) == string_element_block::get(right);
636 case element_type_int16:
637 return int16_element_block::get(left) == int16_element_block::get(right);
638 case element_type_uint16:
639 return uint16_element_block::get(left) == uint16_element_block::get(right);
640 case element_type_int32:
641 return int32_element_block::get(left) == int32_element_block::get(right);
642 case element_type_uint32:
643 return uint32_element_block::get(left) == uint32_element_block::get(right);
644 case element_type_int64:
645 return int64_element_block::get(left) == int64_element_block::get(right);
646 case element_type_uint64:
647 return uint64_element_block::get(left) == uint64_element_block::get(right);
648 case element_type_boolean:
649 return boolean_element_block::get(left) == boolean_element_block::get(right);
650 case element_type_int8:
651 return int8_element_block::get(left) == int8_element_block::get(right);
652 case element_type_uint8:
653 return uint8_element_block::get(left) == uint8_element_block::get(right);
667 switch (get_block_type(block))
669 case element_type_float:
670 float_element_block::shrink_to_fit(block);
672 case element_type_double:
673 double_element_block::shrink_to_fit(block);
675 case element_type_string:
676 string_element_block::shrink_to_fit(block);
678 case element_type_int16:
679 int16_element_block::shrink_to_fit(block);
681 case element_type_uint16:
682 uint16_element_block::shrink_to_fit(block);
684 case element_type_int32:
685 int32_element_block::shrink_to_fit(block);
687 case element_type_uint32:
688 uint32_element_block::shrink_to_fit(block);
690 case element_type_int64:
691 int64_element_block::shrink_to_fit(block);
693 case element_type_uint64:
694 uint64_element_block::shrink_to_fit(block);
696 case element_type_boolean:
697 boolean_element_block::shrink_to_fit(block);
699 case element_type_int8:
700 int8_element_block::shrink_to_fit(block);
702 case element_type_uint8:
703 uint8_element_block::shrink_to_fit(block);
706 throw general_error(
"shrink_to_fit: failed to print a block of unknown type.");
710 size_t element_block_func_base::size(
const base_element_block& block)
712 switch (get_block_type(block))
714 case element_type_float:
715 return float_element_block::size(block);
716 case element_type_double:
717 return double_element_block::size(block);
718 case element_type_string:
719 return string_element_block::size(block);
720 case element_type_int16:
721 return int16_element_block::size(block);
722 case element_type_uint16:
723 return uint16_element_block::size(block);
724 case element_type_int32:
725 return int32_element_block::size(block);
726 case element_type_uint32:
727 return uint32_element_block::size(block);
728 case element_type_int64:
729 return int64_element_block::size(block);
730 case element_type_uint64:
731 return uint64_element_block::size(block);
732 case element_type_boolean:
733 return boolean_element_block::size(block);
734 case element_type_int8:
735 return int8_element_block::size(block);
736 case element_type_uint8:
737 return uint8_element_block::size(block);
739 throw general_error(
"size: failed to print a block of unknown type.");
Definition: global.hpp:82
Definition: types.hpp:173
static void overwrite_values(base_element_block &block, size_t pos, size_t len)
Definition: trait.hpp:660
Definition: trait.hpp:747