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);
187 #ifdef MDDS_MULTI_TYPE_VECTOR_DEBUG 190 cerr << __FILE__ <<
"#" << __LINE__ <<
" (element_block_func_base:delete_block): " 191 <<
"failed to delete a block of unknown type (" << get_block_type(*p) <<
")" 198 void element_block_func_base::resize_block(
base_element_block& block,
size_t new_size)
200 switch (get_block_type(block))
202 case element_type_numeric:
203 numeric_element_block::resize_block(block, new_size);
205 case element_type_string:
206 string_element_block::resize_block(block, new_size);
208 case element_type_short:
209 short_element_block::resize_block(block, new_size);
211 case element_type_ushort:
212 ushort_element_block::resize_block(block, new_size);
214 case element_type_int:
215 int_element_block::resize_block(block, new_size);
217 case element_type_uint:
218 uint_element_block::resize_block(block, new_size);
220 case element_type_long:
221 long_element_block::resize_block(block, new_size);
223 case element_type_ulong:
224 ulong_element_block::resize_block(block, new_size);
226 case element_type_boolean:
227 boolean_element_block::resize_block(block, new_size);
229 case element_type_char:
230 char_element_block::resize_block(block, new_size);
232 case element_type_uchar:
233 uchar_element_block::resize_block(block, new_size);
236 throw general_error(
"resize_block: failed to resize a block of unknown type.");
242 switch (get_block_type(block))
244 case element_type_numeric:
245 numeric_element_block::print_block(block);
247 case element_type_string:
248 string_element_block::print_block(block);
250 case element_type_short:
251 short_element_block::print_block(block);
253 case element_type_ushort:
254 ushort_element_block::print_block(block);
256 case element_type_int:
257 int_element_block::print_block(block);
259 case element_type_uint:
260 uint_element_block::print_block(block);
262 case element_type_long:
263 long_element_block::print_block(block);
265 case element_type_ulong:
266 ulong_element_block::print_block(block);
268 case element_type_boolean:
269 boolean_element_block::print_block(block);
271 case element_type_char:
272 char_element_block::print_block(block);
274 case element_type_uchar:
275 uchar_element_block::print_block(block);
278 throw general_error(
"print_block: failed to print a block of unknown type.");
284 switch (get_block_type(block))
286 case element_type_numeric:
287 numeric_element_block::erase_block(block, pos);
289 case element_type_string:
290 string_element_block::erase_block(block, pos);
292 case element_type_short:
293 short_element_block::erase_block(block, pos);
295 case element_type_ushort:
296 ushort_element_block::erase_block(block, pos);
298 case element_type_int:
299 int_element_block::erase_block(block, pos);
301 case element_type_uint:
302 uint_element_block::erase_block(block, pos);
304 case element_type_long:
305 long_element_block::erase_block(block, pos);
307 case element_type_ulong:
308 ulong_element_block::erase_block(block, pos);
310 case element_type_boolean:
311 boolean_element_block::erase_block(block, pos);
313 case element_type_char:
314 char_element_block::erase_block(block, pos);
316 case element_type_uchar:
317 uchar_element_block::erase_block(block, pos);
320 throw general_error(
"erase: failed to erase an element from a block of unknown type.");
324 void element_block_func_base::erase(
base_element_block& block,
size_t pos,
size_t size)
326 switch (get_block_type(block))
328 case element_type_numeric:
329 numeric_element_block::erase_block(block, pos, size);
331 case element_type_string:
332 string_element_block::erase_block(block, pos, size);
334 case element_type_short:
335 short_element_block::erase_block(block, pos, size);
337 case element_type_ushort:
338 ushort_element_block::erase_block(block, pos, size);
340 case element_type_int:
341 int_element_block::erase_block(block, pos, size);
343 case element_type_uint:
344 uint_element_block::erase_block(block, pos, size);
346 case element_type_long:
347 long_element_block::erase_block(block, pos, size);
349 case element_type_ulong:
350 ulong_element_block::erase_block(block, pos, size);
352 case element_type_boolean:
353 boolean_element_block::erase_block(block, pos, size);
355 case element_type_char:
356 char_element_block::erase_block(block, pos, size);
358 case element_type_uchar:
359 uchar_element_block::erase_block(block, pos, size);
362 throw general_error(
"erase: failed to erase elements from a block of unknown type.");
368 switch (get_block_type(dest))
370 case element_type_numeric:
371 numeric_element_block::append_values_from_block(dest, src);
373 case element_type_string:
374 string_element_block::append_values_from_block(dest, src);
376 case element_type_short:
377 short_element_block::append_values_from_block(dest, src);
379 case element_type_ushort:
380 ushort_element_block::append_values_from_block(dest, src);
382 case element_type_int:
383 int_element_block::append_values_from_block(dest, src);
385 case element_type_uint:
386 uint_element_block::append_values_from_block(dest, src);
388 case element_type_long:
389 long_element_block::append_values_from_block(dest, src);
391 case element_type_ulong:
392 ulong_element_block::append_values_from_block(dest, src);
394 case element_type_boolean:
395 boolean_element_block::append_values_from_block(dest, src);
397 case element_type_char:
398 char_element_block::append_values_from_block(dest, src);
400 case element_type_uchar:
401 uchar_element_block::append_values_from_block(dest, src);
404 throw general_error(
"append_values: failed to append values to a block of unknown type.");
408 void element_block_func_base::append_values_from_block(
411 switch (get_block_type(dest))
413 case element_type_numeric:
414 numeric_element_block::append_values_from_block(dest, src, begin_pos, len);
416 case element_type_string:
417 string_element_block::append_values_from_block(dest, src, begin_pos, len);
419 case element_type_short:
420 short_element_block::append_values_from_block(dest, src, begin_pos, len);
422 case element_type_ushort:
423 ushort_element_block::append_values_from_block(dest, src, begin_pos, len);
425 case element_type_int:
426 int_element_block::append_values_from_block(dest, src, begin_pos, len);
428 case element_type_uint:
429 uint_element_block::append_values_from_block(dest, src, begin_pos, len);
431 case element_type_long:
432 long_element_block::append_values_from_block(dest, src, begin_pos, len);
434 case element_type_ulong:
435 ulong_element_block::append_values_from_block(dest, src, begin_pos, len);
437 case element_type_boolean:
438 boolean_element_block::append_values_from_block(dest, src, begin_pos, len);
440 case element_type_char:
441 char_element_block::append_values_from_block(dest, src, begin_pos, len);
443 case element_type_uchar:
444 uchar_element_block::append_values_from_block(dest, src, begin_pos, len);
447 throw general_error(
"append_values: failed to append values to a block of unknown type.");
451 void element_block_func_base::assign_values_from_block(
454 switch (get_block_type(dest))
456 case element_type_numeric:
457 numeric_element_block::assign_values_from_block(dest, src, begin_pos, len);
459 case element_type_string:
460 string_element_block::assign_values_from_block(dest, src, begin_pos, len);
462 case element_type_short:
463 short_element_block::assign_values_from_block(dest, src, begin_pos, len);
465 case element_type_ushort:
466 ushort_element_block::assign_values_from_block(dest, src, begin_pos, len);
468 case element_type_int:
469 int_element_block::assign_values_from_block(dest, src, begin_pos, len);
471 case element_type_uint:
472 uint_element_block::assign_values_from_block(dest, src, begin_pos, len);
474 case element_type_long:
475 long_element_block::assign_values_from_block(dest, src, begin_pos, len);
477 case element_type_ulong:
478 ulong_element_block::assign_values_from_block(dest, src, begin_pos, len);
480 case element_type_boolean:
481 boolean_element_block::assign_values_from_block(dest, src, begin_pos, len);
483 case element_type_char:
484 char_element_block::assign_values_from_block(dest, src, begin_pos, len);
486 case element_type_uchar:
487 uchar_element_block::assign_values_from_block(dest, src, begin_pos, len);
490 throw general_error(
"assign_values_from_block: failed to assign values to a block of unknown type.");
494 void element_block_func_base::prepend_values_from_block(
497 switch (get_block_type(dest))
499 case element_type_numeric:
500 numeric_element_block::prepend_values_from_block(dest, src, begin_pos, len);
502 case element_type_string:
503 string_element_block::prepend_values_from_block(dest, src, begin_pos, len);
505 case element_type_short:
506 short_element_block::prepend_values_from_block(dest, src, begin_pos, len);
508 case element_type_ushort:
509 ushort_element_block::prepend_values_from_block(dest, src, begin_pos, len);
511 case element_type_int:
512 int_element_block::prepend_values_from_block(dest, src, begin_pos, len);
514 case element_type_uint:
515 uint_element_block::prepend_values_from_block(dest, src, begin_pos, len);
517 case element_type_long:
518 long_element_block::prepend_values_from_block(dest, src, begin_pos, len);
520 case element_type_ulong:
521 ulong_element_block::prepend_values_from_block(dest, src, begin_pos, len);
523 case element_type_boolean:
524 boolean_element_block::prepend_values_from_block(dest, src, begin_pos, len);
526 case element_type_char:
527 char_element_block::prepend_values_from_block(dest, src, begin_pos, len);
529 case element_type_uchar:
530 uchar_element_block::prepend_values_from_block(dest, src, begin_pos, len);
533 throw general_error(
"prepend_values_from_block: failed to prepend values to a block of unknown type.");
537 void element_block_func_base::swap_values(
540 element_t blk1_type = get_block_type(blk1);
541 assert(blk1_type == get_block_type(blk2));
544 case element_type_numeric:
545 numeric_element_block::swap_values(blk1, blk2, pos1, pos2, len);
547 case element_type_string:
548 string_element_block::swap_values(blk1, blk2, pos1, pos2, len);
550 case element_type_short:
551 short_element_block::swap_values(blk1, blk2, pos1, pos2, len);
553 case element_type_ushort:
554 ushort_element_block::swap_values(blk1, blk2, pos1, pos2, len);
556 case element_type_int:
557 int_element_block::swap_values(blk1, blk2, pos1, pos2, len);
559 case element_type_uint:
560 uint_element_block::swap_values(blk1, blk2, pos1, pos2, len);
562 case element_type_long:
563 long_element_block::swap_values(blk1, blk2, pos1, pos2, len);
565 case element_type_ulong:
566 ulong_element_block::swap_values(blk1, blk2, pos1, pos2, len);
568 case element_type_boolean:
569 boolean_element_block::swap_values(blk1, blk2, pos1, pos2, len);
571 case element_type_char:
572 char_element_block::swap_values(blk1, blk2, pos1, pos2, len);
574 case element_type_uchar:
575 uchar_element_block::swap_values(blk1, blk2, pos1, pos2, len);
584 element_t block_type = get_block_type(left);
585 if (block_type != get_block_type(right))
590 case element_type_numeric:
591 return numeric_element_block::get(left) == numeric_element_block::get(right);
592 case element_type_string:
593 return string_element_block::get(left) == string_element_block::get(right);
594 case element_type_short:
595 return short_element_block::get(left) == short_element_block::get(right);
596 case element_type_ushort:
597 return ushort_element_block::get(left) == ushort_element_block::get(right);
598 case element_type_int:
599 return int_element_block::get(left) == int_element_block::get(right);
600 case element_type_uint:
601 return uint_element_block::get(left) == uint_element_block::get(right);
602 case element_type_long:
603 return long_element_block::get(left) == long_element_block::get(right);
604 case element_type_ulong:
605 return ulong_element_block::get(left) == ulong_element_block::get(right);
606 case element_type_boolean:
607 return boolean_element_block::get(left) == boolean_element_block::get(right);
608 case element_type_char:
609 return char_element_block::get(left) == char_element_block::get(right);
610 case element_type_uchar:
611 return uchar_element_block::get(left) == uchar_element_block::get(right);
625 switch (get_block_type(block))
627 case element_type_numeric:
628 numeric_element_block::shrink_to_fit(block);
630 case element_type_string:
631 string_element_block::shrink_to_fit(block);
633 case element_type_short:
634 short_element_block::shrink_to_fit(block);
636 case element_type_ushort:
637 ushort_element_block::shrink_to_fit(block);
639 case element_type_int:
640 int_element_block::shrink_to_fit(block);
642 case element_type_uint:
643 uint_element_block::shrink_to_fit(block);
645 case element_type_long:
646 long_element_block::shrink_to_fit(block);
648 case element_type_ulong:
649 ulong_element_block::shrink_to_fit(block);
651 case element_type_boolean:
652 boolean_element_block::shrink_to_fit(block);
654 case element_type_char:
655 char_element_block::shrink_to_fit(block);
657 case element_type_uchar:
658 uchar_element_block::shrink_to_fit(block);
661 throw general_error(
"shrink_to_fit: failed to print a block of unknown type.");
667 switch (get_block_type(block))
669 case element_type_numeric:
670 return numeric_element_block::size(block);
671 case element_type_string:
672 return string_element_block::size(block);
673 case element_type_short:
674 return short_element_block::size(block);
675 case element_type_ushort:
676 return ushort_element_block::size(block);
677 case element_type_int:
678 return int_element_block::size(block);
679 case element_type_uint:
680 return uint_element_block::size(block);
681 case element_type_long:
682 return long_element_block::size(block);
683 case element_type_ulong:
684 return ulong_element_block::size(block);
685 case element_type_boolean:
686 return boolean_element_block::size(block);
687 case element_type_char:
688 return char_element_block::size(block);
689 case element_type_uchar:
690 return uchar_element_block::size(block);
692 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:700
Definition: multi_type_vector_types.hpp:87
Definition: global.hpp:58
Definition: flat_segment_tree.hpp:46
static void overwrite_values(base_element_block &block, size_t pos, size_t len)
Definition: multi_type_vector_trait.hpp:618