28 #ifndef INCLUDED_MDDS_MULTI_TYPE_VECTOR_CUSTOM_FUNC1_HPP
29 #define INCLUDED_MDDS_MULTI_TYPE_VECTOR_CUSTOM_FUNC1_HPP
31 #include "multi_type_vector_types.hpp"
32 #include "multi_type_vector_trait.hpp"
34 namespace mdds {
namespace mtv {
39 template<
typename _Block>
40 struct custom_block_func1
42 static base_element_block* create_new_block(element_t type,
size_t init_size)
46 case _Block::block_type:
47 return _Block::create_block(init_size);
52 return element_block_func::create_new_block(type, init_size);
55 static base_element_block* clone_block(
const base_element_block& block)
57 switch (get_block_type(block))
59 case _Block::block_type:
60 return _Block::clone_block(block);
65 return element_block_func::clone_block(block);
68 static void delete_block(
const base_element_block* p)
73 switch (get_block_type(*p))
75 case _Block::block_type:
76 _Block::delete_block(p);
79 element_block_func::delete_block(p);
83 static void resize_block(base_element_block& block,
size_t new_size)
85 switch (get_block_type(block))
87 case _Block::block_type:
88 _Block::resize_block(block, new_size);
91 element_block_func::resize_block(block, new_size);
95 static void print_block(
const base_element_block& block)
97 switch (get_block_type(block))
99 case _Block::block_type:
100 _Block::print_block(block);
103 element_block_func::print_block(block);
107 static void erase(base_element_block& block,
size_t pos)
109 switch (get_block_type(block))
111 case _Block::block_type:
112 _Block::erase_block(block, pos);
115 element_block_func::erase(block, pos);
119 static void erase(base_element_block& block,
size_t pos,
size_t size)
121 switch (get_block_type(block))
123 case _Block::block_type:
124 _Block::erase_block(block, pos, size);
127 element_block_func_base::erase(block, pos, size);
131 static void append_values_from_block(base_element_block& dest,
const base_element_block& src)
133 switch (get_block_type(dest))
135 case _Block::block_type:
136 _Block::append_values_from_block(dest, src);
139 element_block_func_base::append_values_from_block(dest, src);
143 static void append_values_from_block(
144 base_element_block& dest,
const base_element_block& src,
size_t begin_pos,
size_t len)
146 switch (get_block_type(dest))
148 case _Block::block_type:
149 _Block::append_values_from_block(dest, src, begin_pos, len);
152 element_block_func_base::append_values_from_block(dest, src, begin_pos, len);
156 static void assign_values_from_block(
157 base_element_block& dest,
const base_element_block& src,
size_t begin_pos,
size_t len)
159 switch (get_block_type(dest))
161 case _Block::block_type:
162 _Block::assign_values_from_block(dest, src, begin_pos, len);
165 element_block_func_base::assign_values_from_block(dest, src, begin_pos, len);
169 static void prepend_values_from_block(
170 base_element_block& dest,
const base_element_block& src,
size_t begin_pos,
size_t len)
172 switch (get_block_type(dest))
174 case _Block::block_type:
175 _Block::prepend_values_from_block(dest, src, begin_pos, len);
178 element_block_func_base::prepend_values_from_block(dest, src, begin_pos, len);
182 static void swap_values(
183 base_element_block& blk1, base_element_block& blk2,
size_t pos1,
size_t pos2,
size_t len)
185 switch (get_block_type(blk1))
187 case _Block::block_type:
188 _Block::swap_values(blk1, blk2, pos1, pos2, len);
191 element_block_func_base::swap_values(blk1, blk2, pos1, pos2, len);
195 static bool equal_block(
196 const base_element_block& left,
const base_element_block& right)
198 if (get_block_type(left) == _Block::block_type)
200 if (get_block_type(right) != _Block::block_type)
203 return _Block::get(left) == _Block::get(right);
205 else if (mtv::get_block_type(right) == _Block::block_type)
208 return element_block_func::equal_block(left, right);
211 static void overwrite_values(base_element_block& block,
size_t pos,
size_t len)
213 switch (get_block_type(block))
215 case _Block::block_type:
216 _Block::overwrite_values(block, pos, len);
223 static void shrink_to_fit(base_element_block& block)
225 switch (get_block_type(block))
227 case _Block::block_type:
228 _Block::shrink_to_fit(block);
231 element_block_func::shrink_to_fit(block);
235 static size_t size(
const base_element_block& block)
237 switch (get_block_type(block))
239 case _Block::block_type:
240 return _Block::size(block);
242 return element_block_func::size(block);