28 #ifndef __RTTR_ARRAY_CONTAINER_H__
29 #define __RTTR_ARRAY_CONTAINER_H__
37 #include <type_traits>
46 template<
typename T,
typename Enable =
void>
47 class array_container :
public array_container_base
49 using ArrayType =
typename detail::raw_type<T>::type;
51 array_container(
const T& arg)
57 array_container(T&& arg)
58 : _value(std::move(arg))
65 bool is_dynamic()
const {
return array_mapper<ArrayType>::is_dynamic(); }
66 std::size_t get_rank()
const {
return rank<ArrayType>::value; }
67 type get_rank_type(std::size_t index)
const {
return array_accessor<ArrayType>::get_ranke_type(index); }
68 type get_type()
const {
return type::get<T>(); }
69 bool is_raw_array()
const {
return std::is_array<ArrayType>::value; }
73 std::size_t get_size()
const
75 return array_accessor<ArrayType>::get_size(_value);
77 std::size_t get_size(std::size_t index_1)
const
79 return array_accessor<ArrayType>::get_size(_value, index_1);
81 std::size_t get_size(std::size_t index_1, std::size_t index_2)
const
83 return array_accessor<ArrayType>::get_size(_value, index_1, index_2);
85 std::size_t get_size_variadic(
const std::vector<std::size_t>& index_list)
const
87 return array_accessor<ArrayType>::get_size(_value, index_list);
92 bool set_size(std::size_t new_size)
94 return array_accessor<ArrayType>::set_size(_value, new_size);
96 bool set_size(std::size_t new_size, std::size_t index_1)
98 return array_accessor<ArrayType>::set_size(_value, new_size, index_1);
100 bool set_size(std::size_t new_size, std::size_t index_1, std::size_t index_2)
102 return array_accessor<ArrayType>::set_size(_value, new_size, index_1, index_2);
104 bool set_size_variadic(std::size_t new_size,
const std::vector<std::size_t>& index_list)
106 return array_accessor<ArrayType>::set_size(_value, new_size, index_list);
111 bool set_value(argument& arg)
113 return array_accessor<ArrayType>::set_value(_value, arg);
116 bool set_value(argument& arg, std::size_t index_1)
118 return array_accessor<ArrayType>::set_value(_value, arg, index_1);
120 bool set_value(argument& arg, std::size_t index_1, std::size_t index_2)
122 return array_accessor<ArrayType>::set_value(_value, arg, index_1, index_2);
125 bool set_value(argument& arg, std::size_t index_1, std::size_t index_2, std::size_t index_3)
127 return array_accessor<ArrayType>::set_value(_value, arg, index_1, index_2, index_3);
130 bool set_value_variadic(argument& arg,
const std::vector<std::size_t>& index_list)
132 return array_accessor<ArrayType>::set_value(_value, arg, index_list);
137 variant get_value(std::size_t index_1)
const
139 return array_accessor<ArrayType>::get_value(_value, index_1);
142 variant get_value(std::size_t index_1, std::size_t index_2)
const
144 return array_accessor<ArrayType>::get_value(_value, index_1, index_2);
147 variant get_value(std::size_t index_1, std::size_t index_2, std::size_t index_3)
const
149 return array_accessor<ArrayType>::get_value(_value, index_1, index_2, index_3);
152 variant get_value_variadic(
const std::vector<std::size_t>& index_list)
const
154 return array_accessor<ArrayType>::get_value(_value, index_list);
159 bool insert_value(detail::argument& arg, std::size_t index_1)
161 return array_accessor<ArrayType>::insert_value(_value, arg, index_1);
164 bool insert_value(detail::argument& arg, std::size_t index_1, std::size_t index_2)
166 return array_accessor<ArrayType>::insert_value(_value, arg, index_1, index_2);
169 bool insert_value(detail::argument& arg, std::size_t index_1, std::size_t index_2, std::size_t index_3)
171 return array_accessor<ArrayType>::insert_value(_value, arg, index_1, index_2, index_3);
174 bool insert_value_variadic(detail::argument& arg,
const std::vector<std::size_t>& index_list)
176 return array_accessor<ArrayType>::insert_value(_value, arg, index_list);
181 bool remove_value(std::size_t index_1)
183 return array_accessor<ArrayType>::remove_value(_value, index_1);
186 bool remove_value(std::size_t index_1, std::size_t index_2)
188 return array_accessor<ArrayType>::remove_value(_value, index_1, index_2);
191 bool remove_value(std::size_t index_1, std::size_t index_2, std::size_t index_3)
193 return array_accessor<ArrayType>::remove_value(_value, index_1, index_2, index_3);
195 bool remove_value_variadic(
const std::vector<std::size_t>& index_list)
197 return array_accessor<ArrayType>::remove_value(_value, index_list);
200 array_container_base* clone()
const {
return new array_container<T>(_value); }
202 void* get_ptr()
const {
return const_cast<void*
>(
reinterpret_cast<const void*
>(std::addressof(_value))); }
214 class array_container<T*> :
public array_container_base
216 using ArrayType =
typename detail::raw_type<T>::type;
218 array_container(T* arg)
219 : _value(static_cast<ArrayType*>(get_void_ptr(arg)))
225 bool is_dynamic()
const {
return array_mapper<ArrayType>::is_dynamic(); }
226 std::size_t get_rank()
const {
return rank<ArrayType>::value; }
227 type get_rank_type(std::size_t index)
const {
return array_accessor<ArrayType>::get_ranke_type(index); }
228 type get_type()
const {
return type::get<T*>(); }
229 bool is_raw_array()
const {
return std::is_array<ArrayType>::value; }
233 std::size_t get_size()
const
235 return array_accessor<ArrayType>::get_size(*_value);
237 std::size_t get_size(std::size_t index_1)
const
239 return array_accessor<ArrayType>::get_size(*_value, index_1);
241 std::size_t get_size(std::size_t index_1, std::size_t index_2)
const
243 return array_accessor<ArrayType>::get_size(*_value, index_1, index_2);
245 std::size_t get_size_variadic(
const std::vector<std::size_t>& index_list)
const
247 return array_accessor<ArrayType>::get_size(*_value, index_list);
252 bool set_size(std::size_t new_size)
254 return array_accessor<ArrayType>::set_size(*_value, new_size);
256 bool set_size(std::size_t new_size, std::size_t index_1)
258 return array_accessor<ArrayType>::set_size(*_value, new_size, index_1);
260 bool set_size(std::size_t new_size, std::size_t index_1, std::size_t index_2)
262 return array_accessor<ArrayType>::set_size(*_value, new_size, index_1, index_2);
264 bool set_size_variadic(std::size_t new_size,
const std::vector<std::size_t>& index_list)
266 return array_accessor<ArrayType>::set_size(*_value, new_size, index_list);
271 bool set_value(argument& arg)
273 return array_accessor<ArrayType>::set_value(*_value, arg);
276 bool set_value(argument& arg, std::size_t index_1)
278 return array_accessor<ArrayType>::set_value(*_value, arg, index_1);
280 bool set_value(argument& arg, std::size_t index_1, std::size_t index_2)
282 return array_accessor<ArrayType>::set_value(*_value, arg, index_1, index_2);
285 bool set_value(argument& arg, std::size_t index_1, std::size_t index_2, std::size_t index_3)
287 return array_accessor<ArrayType>::set_value(*_value, arg, index_1, index_2, index_3);
290 bool set_value_variadic(argument& arg,
const std::vector<std::size_t>& index_list)
292 return array_accessor<ArrayType>::set_value(*_value, arg, index_list);
297 variant get_value(std::size_t index_1)
const
299 return array_accessor<ArrayType>::get_value(*_value, index_1);
302 variant get_value(std::size_t index_1, std::size_t index_2)
const
304 return array_accessor<ArrayType>::get_value(*_value, index_1, index_2);
307 variant get_value(std::size_t index_1, std::size_t index_2, std::size_t index_3)
const
309 return array_accessor<ArrayType>::get_value(*_value, index_1, index_2, index_3);
312 variant get_value_variadic(
const std::vector<std::size_t>& index_list)
const
314 return array_accessor<ArrayType>::get_value(*_value, index_list);
319 bool insert_value(detail::argument& arg, std::size_t index_1)
321 return array_accessor<ArrayType>::insert_value(*_value, arg, index_1);
324 bool insert_value(detail::argument& arg, std::size_t index_1, std::size_t index_2)
326 return array_accessor<ArrayType>::insert_value(*_value, arg, index_1, index_2);
329 bool insert_value(detail::argument& arg, std::size_t index_1, std::size_t index_2, std::size_t index_3)
331 return array_accessor<ArrayType>::insert_value(*_value, arg, index_1, index_2, index_3);
334 bool insert_value_variadic(detail::argument& arg,
const std::vector<std::size_t>& index_list)
336 return array_accessor<ArrayType>::insert_value(*_value, arg, index_list);
341 bool remove_value(std::size_t index_1)
343 return array_accessor<ArrayType>::remove_value(*_value, index_1);
346 bool remove_value(std::size_t index_1, std::size_t index_2)
348 return array_accessor<ArrayType>::remove_value(*_value, index_1, index_2);
351 bool remove_value(std::size_t index_1, std::size_t index_2, std::size_t index_3)
353 return array_accessor<ArrayType>::remove_value(*_value, index_1, index_2, index_3);
355 bool remove_value_variadic(
const std::vector<std::size_t>& index_list)
357 return array_accessor<ArrayType>::remove_value(*_value, index_list);
360 array_container_base* clone()
const {
return new array_container<ArrayType*>(_value); }
362 void* get_ptr()
const {
return const_cast<void*
>(
reinterpret_cast<const void*
>(std::addressof(_value))); }
374 class array_container<const T*> :
public array_container_base
376 using ArrayType =
typename detail::raw_type<T>::type;
378 array_container(
const T* arg)
379 : _value(static_cast<const T*>(get_void_ptr(arg)))
385 bool is_dynamic()
const {
return array_mapper<ArrayType>::is_dynamic(); }
386 std::size_t get_rank()
const {
return rank<ArrayType>::value; }
387 type get_rank_type(std::size_t index)
const {
return array_accessor<ArrayType>::get_ranke_type(index); }
388 type get_type()
const {
return type::get<const T*>(); }
389 bool is_raw_array()
const {
return std::is_array<ArrayType>::value; }
393 std::size_t get_size()
const
395 return array_accessor<ArrayType>::get_size(*_value);
397 std::size_t get_size(std::size_t index_1)
const
399 return array_accessor<ArrayType>::get_size(*_value, index_1);
401 std::size_t get_size(std::size_t index_1, std::size_t index_2)
const
403 return array_accessor<ArrayType>::get_size(*_value, index_1, index_2);
405 std::size_t get_size_variadic(
const std::vector<std::size_t>& index_list)
const
407 return array_accessor<ArrayType>::get_size(*_value, index_list);
412 bool set_size(std::size_t new_size)
416 bool set_size(std::size_t new_size, std::size_t index_1)
420 bool set_size(std::size_t new_size, std::size_t index_1, std::size_t index_2)
424 bool set_size_variadic(std::size_t new_size,
const std::vector<std::size_t>& index_list)
431 bool set_value(argument& arg)
436 bool set_value(argument& arg, std::size_t index_1)
440 bool set_value(argument& arg, std::size_t index_1, std::size_t index_2)
445 bool set_value(argument& arg, std::size_t index_1, std::size_t index_2, std::size_t index_3)
450 bool set_value_variadic(argument& arg,
const std::vector<std::size_t>& index_list)
457 variant get_value(std::size_t index_1)
const
459 return array_accessor<ArrayType>::get_value(*_value, index_1);
462 variant get_value(std::size_t index_1, std::size_t index_2)
const
464 return array_accessor<ArrayType>::get_value(*_value, index_1, index_2);
467 variant get_value(std::size_t index_1, std::size_t index_2, std::size_t index_3)
const
469 return array_accessor<ArrayType>::get_value(*_value, index_1, index_2, index_3);
472 variant get_value_variadic(
const std::vector<std::size_t>& index_list)
const
474 return array_accessor<ArrayType>::get_value(*_value, index_list);
479 bool insert_value(detail::argument& arg, std::size_t index_1)
484 bool insert_value(detail::argument& arg, std::size_t index_1, std::size_t index_2)
489 bool insert_value(detail::argument& arg, std::size_t index_1, std::size_t index_2, std::size_t index_3)
494 bool insert_value_variadic(detail::argument& arg,
const std::vector<std::size_t>& index_list)
501 bool remove_value(std::size_t index_1)
506 bool remove_value(std::size_t index_1, std::size_t index_2)
511 bool remove_value(std::size_t index_1, std::size_t index_2, std::size_t index_3)
515 bool remove_value_variadic(
const std::vector<std::size_t>& index_list)
520 array_container_base* clone()
const {
return new array_container<const T*>(_value); }
521 void* get_ptr()
const {
return const_cast<void*
>(
reinterpret_cast<const void*
>(std::addressof(_value))); }
532 class array_container<T, typename std::enable_if<std::is_array<T>::value>::type> :
public array_container_base
534 using ArrayType =
typename detail::raw_type<T>::type;
536 array_container(
const T& arg)
538 #if RTTR_COMPILER == RTTR_COMPILER_MSVC
539 detail::copy_array(
const_cast<std::remove_const<T>::type&
>(arg), _value);
541 detail::copy_array(arg, _value);
547 bool is_dynamic()
const {
return array_mapper<T>::is_dynamic(); }
548 std::size_t get_rank()
const {
return rank<T>::value; }
549 type get_rank_type(std::size_t index)
const {
return array_accessor<T>::get_ranke_type(index); }
550 type get_type()
const {
return type::get<T>(); }
551 bool is_raw_array()
const {
return std::is_array<T>::value; }
555 std::size_t get_size()
const
557 return array_accessor<T>::get_size(_value);
559 std::size_t get_size(std::size_t index_1)
const
561 return array_accessor<T>::get_size(_value, index_1);
563 std::size_t get_size(std::size_t index_1, std::size_t index_2)
const
565 return array_accessor<T>::get_size(_value, index_1, index_2);
567 std::size_t get_size_variadic(
const std::vector<std::size_t>& index_list)
const
569 return array_accessor<T>::get_size(_value, index_list);
574 bool set_size(std::size_t new_size)
576 return array_accessor<T>::set_size(_value, new_size);
578 bool set_size(std::size_t new_size, std::size_t index_1)
580 return array_accessor<T>::set_size(_value, new_size, index_1);
582 bool set_size(std::size_t new_size, std::size_t index_1, std::size_t index_2)
584 return array_accessor<T>::set_size(_value, new_size, index_1, index_2);
586 bool set_size_variadic(std::size_t new_size,
const std::vector<std::size_t>& index_list)
588 return array_accessor<T>::set_size(_value, new_size, index_list);
593 bool set_value(argument& arg)
595 return array_accessor<T>::set_value(_value, arg);
598 bool set_value(argument& arg, std::size_t index_1)
600 return array_accessor<T>::set_value(_value, arg, index_1);
602 bool set_value(argument& arg, std::size_t index_1, std::size_t index_2)
604 return array_accessor<T>::set_value(_value, arg, index_1, index_2);
607 bool set_value(argument& arg, std::size_t index_1, std::size_t index_2, std::size_t index_3)
609 return array_accessor<T>::set_value(_value, arg, index_1, index_2, index_3);
612 bool set_value_variadic(argument& arg,
const std::vector<std::size_t>& index_list)
614 return array_accessor<T>::set_value(_value, arg, index_list);
619 variant get_value(std::size_t index_1)
const
621 return array_accessor<T>::get_value(_value, index_1);
624 variant get_value(std::size_t index_1, std::size_t index_2)
const
626 return array_accessor<T>::get_value(_value, index_1, index_2);
629 variant get_value(std::size_t index_1, std::size_t index_2, std::size_t index_3)
const
631 return array_accessor<T>::get_value(_value, index_1, index_2, index_3);
634 variant get_value_variadic(
const std::vector<std::size_t>& index_list)
const
636 return array_accessor<T>::get_value(_value, index_list);
641 bool insert_value(detail::argument& arg, std::size_t index_1)
643 return array_accessor<T>::insert_value(_value, arg, index_1);
646 bool insert_value(detail::argument& arg, std::size_t index_1, std::size_t index_2)
648 return array_accessor<T>::insert_value(_value, arg, index_1, index_2);
651 bool insert_value(detail::argument& arg, std::size_t index_1, std::size_t index_2, std::size_t index_3)
653 return array_accessor<T>::insert_value(_value, arg, index_1, index_2, index_3);
656 bool insert_value_variadic(detail::argument& arg,
const std::vector<std::size_t>& index_list)
658 return array_accessor<T>::insert_value(_value, arg, index_list);
663 bool remove_value(std::size_t index_1)
665 return array_accessor<T>::remove_value(_value, index_1);
668 bool remove_value(std::size_t index_1, std::size_t index_2)
670 return array_accessor<T>::remove_value(_value, index_1, index_2);
673 bool remove_value(std::size_t index_1, std::size_t index_2, std::size_t index_3)
675 return array_accessor<T>::remove_value(_value, index_1, index_2, index_3);
677 bool remove_value_variadic(
const std::vector<std::size_t>& index_list)
679 return array_accessor<T>::remove_value(_value, index_list);
682 array_container_base* clone()
const {
return new array_container<T>(_value); }
683 void* get_ptr()
const {
return const_cast<void*
>(
reinterpret_cast<const void*
>(std::addressof(_value))); }
690 template<
typename T,
typename F>
691 array_container_base* create_array_container_impl(
const F& value,
typename std::enable_if<is_array<T>::value>::type* = 0)
693 using ArrayType =
typename std::remove_cv<typename std::remove_reference<F>::type>::type;
694 return new array_container<ArrayType>(value);
697 template<
typename T,
typename F>
698 array_container_base* create_array_container_impl(
const F& value,
typename std::enable_if<!is_array<T>::value>::type* = 0)
703 template<
typename T,
typename F>
704 array_container_base* create_array_container_moved_impl(F&& value,
typename std::enable_if<is_array<T>::value>::type* = 0)
706 using ArrayType =
typename std::remove_cv<typename std::remove_reference<F>::type>::type;
707 return new array_container<ArrayType>(std::move(value));
710 template<
typename T,
typename F>
711 array_container_base* create_array_container_moved_impl(F&& value,
typename std::enable_if<!is_array<T>::value>::type* = 0)
717 array_container_base* create_array_container(
const T& value)
719 return create_array_container_impl<typename detail::raw_type<T>::type, T>(value);
723 array_container_base* create_array_container_moved(T&& value)
725 return create_array_container_moved_impl<typename detail::raw_type<T>::type, T>(std::move(value));
731 #endif // __RTTR_ARRAY_CONTAINER_H__