1 #ifndef teca_variant_array_impl_h
2 #define teca_variant_array_impl_h
6 #if defined(__CUDACC__)
7 #pragma nv_diag_suppress = partial_override
10 #include "teca_config.h"
13 #include "teca_binary_stream.h"
14 #include "teca_bad_cast.h"
18 #include <hamr_buffer.h>
27 #include <type_traits>
32 #if defined(TECA_HAS_CUDA)
33 #include <thrust/device_ptr.h>
34 #include <thrust/functional.h>
35 #include <thrust/reduce.h>
54 using p_teca_string_array = std::shared_ptr<teca_variant_array_impl<std::string>>;
55 using const_p_teca_string_array = std::shared_ptr<const teca_variant_array_impl<std::string>>;
58 using p_teca_float_array = std::shared_ptr<teca_variant_array_impl<float>>;
59 using const_p_teca_float_array = std::shared_ptr<const teca_variant_array_impl<float>>;
62 using p_teca_double_array = std::shared_ptr<teca_variant_array_impl<double>>;
63 using const_p_teca_double_array = std::shared_ptr<const teca_variant_array_impl<double>>;
66 using p_teca_char_array = std::shared_ptr<teca_variant_array_impl<char>>;
67 using const_p_teca_char_array = std::shared_ptr<const teca_variant_array_impl<char>>;
70 using p_teca_unsigned_char_array = std::shared_ptr<teca_variant_array_impl<unsigned char>>;
71 using const_p_teca_unsigned_char_array = std::shared_ptr<const teca_variant_array_impl<unsigned char>>;
74 using p_teca_short_array = std::shared_ptr<teca_variant_array_impl<short>>;
75 using const_p_teca_short_array = std::shared_ptr<const teca_variant_array_impl<short>>;
78 using p_teca_unsigned_short_array = std::shared_ptr<teca_variant_array_impl<unsigned short>>;
79 using const_p_teca_unsigned_short_array = std::shared_ptr<const teca_variant_array_impl<unsigned short>>;
82 using p_teca_int_array = std::shared_ptr<teca_variant_array_impl<int>>;
83 using const_p_teca_int_array = std::shared_ptr<const teca_variant_array_impl<int>>;
86 using p_teca_unsigned_int_array = std::shared_ptr<teca_variant_array_impl<unsigned int>>;
87 using const_p_teca_unsigned_int_array = std::shared_ptr<const teca_variant_array_impl<unsigned int>>;
90 using p_teca_long_array = std::shared_ptr<teca_variant_array_impl<long>>;
91 using const_p_teca_long_array = std::shared_ptr<const teca_variant_array_impl<long>>;
94 using p_teca_unsigned_long_array = std::shared_ptr<teca_variant_array_impl<unsigned long>>;
95 using const_p_teca_unsigned_long_array = std::shared_ptr<const teca_variant_array_impl<unsigned long>>;
98 using p_teca_long_long_array = std::shared_ptr<teca_variant_array_impl<long long>>;
99 using const_p_teca_long_long_array = std::shared_ptr<const teca_variant_array_impl<long long>>;
102 using p_teca_unsigned_long_long_array = std::shared_ptr<teca_variant_array_impl<unsigned long long>>;
103 using const_p_teca_unsigned_long_long_array = std::shared_ptr<const teca_variant_array_impl<unsigned long long>>;
106 using p_teca_size_t_array = std::shared_ptr<teca_variant_array_impl<size_t>>;
107 using const_p_teca_size_t_array = std::shared_ptr<const teca_variant_array_impl<size_t>>;
115 template <
typename T>
124 template <
typename T>
126 std::integral_constant<bool,
127 std::is_arithmetic<T>::value>
131 template <
typename T>
133 std::integral_constant<bool,
134 !std::is_arithmetic<T>::value>
156 #define TEMPLATE_DISPATCH_CASE(tt, nt, p, ...) \
157 if (dynamic_cast<const tt<nt>*>(p)) \
160 using CNT = const nt; \
162 using CTT = const tt<nt>; \
163 using PT = std::shared_ptr<tt<nt>>; \
164 using CPT = std::shared_ptr<const tt<nt>>; \
165 using SP = std::shared_ptr<nt>; \
166 using CSP = std::shared_ptr<const nt>; \
191 #define NESTED_TEMPLATE_DISPATCH_CASE(tt, nt, p, i, ...) \
192 if (dynamic_cast<const tt<nt>*>(p)) \
195 using CNT##i = const nt; \
196 using TT##i = tt<nt>; \
197 using CTT##i = const tt<nt>; \
198 using PT##i = std::shared_ptr<tt<nt>>; \
199 using CPT##i = std::shared_ptr<const tt<nt>>; \
200 using SP##i = std::shared_ptr<nt>; \
201 using CSP##i = std::shared_ptr<const nt>; \
206 #define TEMPLATE_DISPATCH_FP(t, p, ...) \
207 TEMPLATE_DISPATCH_CASE(t, float, p, __VA_ARGS__) \
208 else TEMPLATE_DISPATCH_CASE(t, double, p, __VA_ARGS__)
211 #define TEMPLATE_DISPATCH_SI(t, p, ...) \
212 TEMPLATE_DISPATCH_CASE(t, long long, p, __VA_ARGS__) \
213 else TEMPLATE_DISPATCH_CASE(t, long, p, __VA_ARGS__) \
214 else TEMPLATE_DISPATCH_CASE(t, int, p, __VA_ARGS__) \
215 else TEMPLATE_DISPATCH_CASE(t, short int, p, __VA_ARGS__) \
216 else TEMPLATE_DISPATCH_CASE(t, char, p, __VA_ARGS__)
219 #define TEMPLATE_DISPATCH_FP_SI(t, p, ...) \
220 TEMPLATE_DISPATCH_CASE(t, float, p, __VA_ARGS__) \
221 else TEMPLATE_DISPATCH_CASE(t, double, p, __VA_ARGS__) \
222 else TEMPLATE_DISPATCH_SI(t, p, __VA_ARGS__)
225 #define TEMPLATE_DISPATCH_I(t, p, ...) \
226 TEMPLATE_DISPATCH_CASE(t, long long, p, __VA_ARGS__) \
227 else TEMPLATE_DISPATCH_CASE(t, unsigned long long, p, __VA_ARGS__) \
228 else TEMPLATE_DISPATCH_CASE(t, long, p, __VA_ARGS__) \
229 else TEMPLATE_DISPATCH_CASE(t, int, p, __VA_ARGS__) \
230 else TEMPLATE_DISPATCH_CASE(t, unsigned int, p, __VA_ARGS__) \
231 else TEMPLATE_DISPATCH_CASE(t, unsigned long, p, __VA_ARGS__) \
232 else TEMPLATE_DISPATCH_CASE(t, short int, p, __VA_ARGS__) \
233 else TEMPLATE_DISPATCH_CASE(t, short unsigned int, p, __VA_ARGS__) \
234 else TEMPLATE_DISPATCH_CASE(t, char, p, __VA_ARGS__) \
235 else TEMPLATE_DISPATCH_CASE(t, unsigned char, p, __VA_ARGS__)
244 #define TEMPLATE_DISPATCH(t, p, ...) \
245 TEMPLATE_DISPATCH_FP(t, p, __VA_ARGS__) \
246 else TEMPLATE_DISPATCH_I(t, p, __VA_ARGS__)
255 #define TEMPLATE_DISPATCH_OBJ(t, p, ...) \
256 TEMPLATE_DISPATCH_CASE(t, std::string, p, __VA_ARGS__) \
257 else TEMPLATE_DISPATCH_CASE(t, teca_metadata, p, __VA_ARGS__)
266 #define TEMPLATE_DISPATCH_PTR(t, p, ...) \
267 TEMPLATE_DISPATCH_CASE(t, const_p_teca_variant_array, p, __VA_ARGS__) \
268 else TEMPLATE_DISPATCH_CASE(t, p_teca_variant_array, p, __VA_ARGS__)
278 #define NESTED_TEMPLATE_DISPATCH_FP(t, p, i, ...) \
279 NESTED_TEMPLATE_DISPATCH_CASE(t, float, p, i, __VA_ARGS__) \
280 else NESTED_TEMPLATE_DISPATCH_CASE(t, double, p, i, __VA_ARGS__)
290 #define NESTED_TEMPLATE_DISPATCH_I(t, p, i, ...) \
291 NESTED_TEMPLATE_DISPATCH_CASE(t, long long, p, i, __VA_ARGS__) \
292 else NESTED_TEMPLATE_DISPATCH_CASE(t, unsigned long long, p, i, __VA_ARGS__) \
293 else NESTED_TEMPLATE_DISPATCH_CASE(t, long, p, i, __VA_ARGS__) \
294 else NESTED_TEMPLATE_DISPATCH_CASE(t, int, p, i, __VA_ARGS__) \
295 else NESTED_TEMPLATE_DISPATCH_CASE(t, unsigned int, p, i, __VA_ARGS__) \
296 else NESTED_TEMPLATE_DISPATCH_CASE(t, unsigned long, p, i, __VA_ARGS__) \
297 else NESTED_TEMPLATE_DISPATCH_CASE(t, short int, p, i, __VA_ARGS__) \
298 else NESTED_TEMPLATE_DISPATCH_CASE(t, short unsigned int, p, i, __VA_ARGS__) \
299 else NESTED_TEMPLATE_DISPATCH_CASE(t, char, p, i, __VA_ARGS__) \
300 else NESTED_TEMPLATE_DISPATCH_CASE(t, unsigned char, p, i, __VA_ARGS__)
311 #define NESTED_TEMPLATE_DISPATCH(t, p, i, ...) \
312 NESTED_TEMPLATE_DISPATCH_FP(t, p, i, __VA_ARGS__) \
313 else NESTED_TEMPLATE_DISPATCH_I(t, p, i, __VA_ARGS__)
316 #define NESTED_VARIANT_ARRAY_DISPATCH(p, i, ...) \
317 NESTED_TEMPLATE_DISPATCH(teca_variant_array_impl, p, i, __VA_ARGS__)
319 #define NESTED_VARIANT_ARRAY_DISPATCH_FP(p, i, ...) \
320 NESTED_TEMPLATE_DISPATCH_FP(teca_variant_array_impl, p, i, __VA_ARGS__)
322 #define NESTED_VARIANT_ARRAY_DISPATCH_I(p, i, ...) \
323 NESTED_TEMPLATE_DISPATCH_I(teca_variant_array_impl, p, i, __VA_ARGS__)
325 #define NESTED_VARIANT_ARRAY_DISPATCH_CASE(nt, p, i, ...) \
326 TEMPLATE_DISPATCH_CASE(teca_variant_array_impl, nt, p, i, __VA_ARGS__)
329 #define VARIANT_ARRAY_DISPATCH(p, ...) \
330 TEMPLATE_DISPATCH(teca_variant_array_impl, p, __VA_ARGS__)
332 #define VARIANT_ARRAY_DISPATCH_FP(p, ...) \
333 TEMPLATE_DISPATCH_FP(teca_variant_array_impl, p, __VA_ARGS__)
335 #define VARIANT_ARRAY_DISPATCH_I(p, ...) \
336 TEMPLATE_DISPATCH_I(teca_variant_array_impl, p, __VA_ARGS__)
338 #define VARIANT_ARRAY_DISPATCH_FP_SI(p, ...) \
339 TEMPLATE_DISPATCH_FP_SI(teca_variant_array_impl, p, __VA_ARGS__)
341 #define VARIANT_ARRAY_DISPATCH_CASE(nt, p, ...) \
342 TEMPLATE_DISPATCH_CASE(teca_variant_array_impl, nt, p, __VA_ARGS__)
349 : std::integral_constant<bool,
350 std::is_arithmetic<T>::value ||
351 std::is_same<T, std::string>::value>
356 struct pack_object_ptr
357 : std::integral_constant<bool,
358 (std::is_pointer<T>::value ||
359 std::is_same<T, p_teca_variant_array>::value) &&
360 !pack_array<T>::value>
366 : std::integral_constant<bool,
367 !pack_array<T>::value &&
368 !std::is_pointer<T>::value &&
369 !pack_object_ptr<T>::value>
382 using element_type = T;
383 using pointer_type = std::shared_ptr<T>;
392 static std::shared_ptr<teca_variant_array_impl<T>>
398 static std::shared_ptr<teca_variant_array_impl<T>>
399 New(allocator alloc);
405 static std::shared_ptr<teca_variant_array_impl<T>>
406 New(
size_t n) {
return New(n, allocator::malloc); }
412 static std::shared_ptr<teca_variant_array_impl<T>>
413 New(
size_t n, allocator alloc);
419 template <
typename U>
420 static std::shared_ptr<teca_variant_array_impl<T>>
421 New(
size_t n,
const U &v) {
return New(n, v, allocator::malloc); }
427 template <
typename U>
428 static std::shared_ptr<teca_variant_array_impl<T>>
435 template <
typename U>
436 static std::shared_ptr<teca_variant_array_impl<T>>
437 New(
size_t n,
const U *v) {
return New(n, v, allocator::malloc); }
443 template <
typename U>
444 static std::shared_ptr<teca_variant_array_impl<T>>
464 template <
typename delete_func_t>
465 static std::shared_ptr<teca_variant_array_impl<T>>
486 int set_allocator(
allocator alloc) override;
489 std::
string get_class_name() const override;
492 void initialize()
override
512 void get(
size_t i, U &val)
const
514 this->get(i, &val, 0, 1);
521 this->get(i, &val, 0, 1);
527 void get(std::vector<U> &dest)
const
529 size_t n_elem = this->size();
531 this->get(0, dest.data(), 0, n_elem);
536 void get(
size_t src_start, U *dest,
size_t dest_start,
size_t n_elem)
const
538 assert(this->size() >= (src_start + n_elem));
539 this->get_dispatch(src_start, dest, dest_start, n_elem);
545 this->get(0, dest, 0, this->size());
556 size_t dest_start,
size_t n_elem)
const override
558 assert(this->size() >= (src_start + n_elem));
559 this->get_dispatch<T>(src_start, dest, dest_start, n_elem);
563 template <
typename U>
566 this->get(0, dest, 0, this->size());
576 template <
typename U>
578 size_t dest_start,
size_t n_elem)
const
580 assert(this->size() >= (src_start + n_elem));
581 this->get_dispatch<T>(src_start, dest, dest_start, n_elem);
594 void set(
size_t i,
const U &val)
596 this->
set(i, &val, 0, 1);
601 void set(
const std::vector<U> &src)
603 this->
set(0, src.data(), 0, src.size());
614 void set(
size_t dest_start,
const U *src,
size_t src_start,
size_t n_elem)
616 assert(this->size() >= (dest_start + n_elem));
617 this->set_dispatch(dest_start, src, src_start, n_elem);
623 this->
set(0, src, 0, src->size());
634 size_t src_start,
size_t n_elem)
override
636 assert(this->size() >= (dest_start + n_elem));
637 this->set_dispatch(dest_start, src, src_start, n_elem);
641 template <
typename U>
644 this->
set(0, src, 0, src->size());
654 template <
typename U>
656 size_t src_start,
size_t n_elem)
658 assert(this->size() >= (dest_start + n_elem));
659 this->set_dispatch(dest_start, src, src_start, n_elem);
673 this->assign(src.data(), 0, src.size());
678 void assign(
const U *src,
size_t src_start,
size_t n_elem)
680 this->assign_dispatch(src, src_start, n_elem);
686 this->assign(src, 0, src->size());
691 size_t src_start,
size_t n_elem)
override
693 this->assign_dispatch(src, src_start, n_elem);
697 template <
typename U>
700 this->assign(src, 0, src->size());
704 template <
typename U>
712 template <
typename U>
714 size_t src_start,
size_t n_elem)
716 this->assign_dispatch(src, src_start, n_elem);
720 template <
typename U>
723 this->assign(src, 0, src->size());
727 template <
typename U>
729 size_t src_start,
size_t n_elem)
731 this->assign_dispatch(src, src_start, n_elem);
752 this->
append(vals.data(), 0, vals.size());
757 void append(
const U *src,
size_t src_start,
size_t n_elem)
759 this->append_dispatch(src, src_start, n_elem);
765 this->
append(src, 0, src->size());
770 size_t src_start,
size_t n_elem)
override
772 this->append_dispatch(src, src_start, n_elem);
776 template <
typename U>
779 this->
append(src, 0, src->size());
783 template <
typename U>
791 template <
typename U>
793 size_t src_start,
size_t n_elem)
795 this->append_dispatch(src, src_start, n_elem);
807 {
return m_data.get_host_accessible(); }
811 {
return m_data.get_cuda_accessible(); }
822 const T *
data()
const {
return m_data.data(); }
828 T *
data() {
return m_data.data(); }
834 const std::shared_ptr<T> &
pointer()
const {
return m_data.pointer(); }
840 std::shared_ptr<T> &
pointer() {
return m_data.pointer(); }
849 unsigned long size() const noexcept override;
852 void resize(
unsigned long n) override;
853 void resize(
unsigned long n, const T &val);
856 void reserve(
unsigned long n) override;
859 void clear() noexcept override;
870 this->to_binary<T>(s);
877 this->from_binary<T>(s);
884 this->to_ascii<T>(s);
891 this->from_ascii<T>(s);
896 template <
typename U = T>
897 void debug_print(
typename std::enable_if< std::is_arithmetic<U>::value >::type* = 0)
const
901 template <
typename U = T>
902 void debug_print(
typename std::enable_if<!std::is_arithmetic<U>::value>::type* = 0)
const
904 TECA_WARNING(
"Failed to print the buffer for T=" <<
typeid(T).name() <<
sizeof(T))
928 m_data(alloc, n_elem) {}
932 m_data(alloc, n_elem, val) {}
935 template <
typename U>
937 m_data(alloc, n_elem, vals) {}
943 m_data(alloc, other->m_data) {}
946 template <
typename delete_func_t>
948 T *ptr, delete_func_t df) : m_data(alloc, size, owner, ptr, df) {}
952 template <
typename U = T>
953 void get_dispatch(
size_t src_start,
958 template <
typename U = T>
959 void get_dispatch(
size_t src_start,
964 template <
typename U = T>
965 void set_dispatch(
size_t dest_start,
970 template <
typename U = T>
971 void set_dispatch(
size_t dest_start,
976 template <
typename U = T>
978 size_t src_start,
size_t n_elem,
982 template <
typename U = T>
984 size_t src_start,
size_t n_elem,
988 template <
typename U = T>
990 size_t src_start,
size_t n_elem,
994 template <
typename U = T>
996 size_t src_start,
size_t n_elem,
1000 template <
typename U = T>
1001 void get_dispatch(
size_t src_start,
1006 template <
typename U = T>
1007 void get_dispatch(
size_t src_start,
1012 template <
typename U = T>
1013 void set_dispatch(
size_t dest_start,
1018 template <
typename U = T>
1019 void set_dispatch(
size_t dest_start,
1024 template <
typename U = T>
1026 size_t src_start,
size_t n_elem,
1030 template <
typename U = T>
1032 size_t src_start,
size_t n_elem,
1036 template <
typename U = T>
1038 size_t src_start,
size_t n_elem,
1042 template <
typename U = T>
1044 size_t src_start,
size_t n_elem,
1048 template <
typename U = T>
1049 void get_dispatch(
size_t src_start,
1050 U *dest,
size_t dest_start,
size_t n_elem,
1054 template <
typename U = T>
1055 void get_dispatch(
size_t src_start,
1056 U *dest,
size_t dest_start,
size_t n_elem,
1060 template <
typename U = T>
1061 void set_dispatch(
size_t dest_start,
1062 const U *src,
size_t src_start,
size_t n_elem,
1066 template <
typename U = T>
1067 void set_dispatch(
size_t dest_start,
1068 const U *src,
size_t src_start,
size_t n_elem,
1072 template <
typename U = T>
1073 void assign_dispatch(
const U *src,
1074 size_t src_start,
size_t n_elem,
1078 template <
typename U = T>
1079 void assign_dispatch(
const U *src,
1080 size_t src_start,
size_t n_elem,
1084 template <
typename U = T>
1085 void append_dispatch(
const U *src,
1086 size_t src_start,
size_t n_elem,
1090 template <
typename U = T>
1091 void append_dispatch(
const U *src,
1092 size_t src_start,
size_t n_elem,
1098 template <
typename U = T>
1100 typename std::enable_if<pack_array<U>::value, U>::type* = 0)
1103 template <
typename U = T>
1105 typename std::enable_if<pack_array<U>::value, U>::type* = 0);
1108 template <
typename U = T>
1110 typename std::enable_if<pack_object<U>::value, U>::type* = 0)
1113 template <
typename U = T>
1115 typename std::enable_if<pack_object<U>::value, U>::type* = 0);
1118 template <
typename U = T>
1120 typename std::enable_if<pack_object_ptr<U>::value, U>::type* = 0)
1123 template <
typename U = T>
1125 typename std::enable_if<pack_object_ptr<U>::value, U>::type* = 0);
1128 template <
typename U = T>
1129 void to_ascii(std::ostream &s,
1130 typename std::enable_if<pack_array<U>::value, U>::type* = 0)
1133 template <
typename U = T>
1134 void from_ascii(std::ostream &s,
1135 typename std::enable_if<pack_array<U>::value, U>::type* = 0);
1138 template <
typename U = T>
1139 void to_ascii(std::ostream &s,
1140 typename std::enable_if<pack_object<U>::value, U>::type* = 0)
1143 template <
typename U = T>
1144 void from_ascii(std::ostream &s,
1145 typename std::enable_if<pack_object<U>::value, U>::type* = 0);
1148 template <
typename U = T>
1149 void to_ascii(std::ostream &s,
1150 typename std::enable_if<pack_object_ptr<U>::value, U>::type* = 0)
1153 template <
typename U = T>
1154 void from_ascii(std::ostream &s,
1155 typename std::enable_if<pack_object_ptr<U>::value, U>::type* = 0);
1158 unsigned int type_code() const noexcept override;
1163 return std::static_pointer_cast
1165 (teca_variant_array::shared_from_this());
1171 return std::static_pointer_cast
1173 (teca_variant_array::shared_from_this());
1177 hamr::buffer<T> m_data;
1186 #pragma GCC diagnostic ignored "-Wunknown-pragmas"
1187 #pragma GCC diagnostic ignored "-Wunused-local-typedefs"
1190 template<
typename T>
1193 this->get_dispatch(i, val);
1197 template<
typename T>
1201 this->get_dispatch(i, val);
1206 template<
typename T>
1209 this->get_dispatch(vals);
1213 template<
typename T>
1216 this->get_dispatch(src_start, dest, dest_start, n_elem);
1220 template<
typename T>
1223 this->set_dispatch(i, val);
1227 template<
typename T>
1230 this->set_dispatch(src);
1234 template<
typename T>
1237 this->set_dispatch(dest_start, src, src_start, n_elem);
1241 template<
typename T>
1244 this->assign_dispatch(src);
1248 template<
typename T>
1251 this->
assign(src, src_start, n_elem);
1255 template<
typename T>
1258 this->append_dispatch(val);
1262 template<
typename T>
1265 this->append_dispatch(src);
1269 template<
typename T>
1272 this->append_dispatch(src, src_start, n_elem);
1276 template<
typename T>
1277 void teca_variant_array::get_dispatch(
unsigned long i, T &val,
1287 ptthis->
get(i, val);
1293 <<
typeid(T).name() <<
sizeof(T) <<
" to " << this->
get_class_name()
1298 template<
typename T>
1299 void teca_variant_array::get_dispatch(
unsigned long i, T &val,
1305 const TT *ptthis =
dynamic_cast<const TT*
>(
this);
1306 ptthis->
get(i, val);
1312 <<
typeid(T).name() <<
sizeof(T) <<
" to " << this->
get_class_name()
1317 template<
typename T>
1318 void teca_variant_array::get_dispatch(std::vector<T> &vals,
1334 <<
typeid(T).name() <<
sizeof(T) <<
" to " << this->
get_class_name()
1339 template<
typename T>
1340 void teca_variant_array::get_dispatch(std::vector<T> &vals,
1346 const TT *ptthis =
dynamic_cast<const TT*
>(
this);
1353 <<
typeid(T).name() <<
sizeof(T) <<
" to " << this->
get_class_name()
1358 template<
typename T>
1359 void teca_variant_array::get_dispatch(
size_t src_start, T *dest,
size_t dest_start,
size_t n_elem,
1369 ptthis->
get(src_start, dest, dest_start, n_elem);
1375 <<
typeid(T).name() <<
sizeof(T) <<
" to " << this->
get_class_name()
1380 template<
typename T>
1381 void teca_variant_array::get_dispatch(
size_t src_start, T *dest,
size_t dest_start,
size_t n_elem,
1387 const TT *ptthis =
dynamic_cast<const TT*
>(
this);
1388 ptthis->
get(src_start, dest, dest_start, n_elem);
1394 <<
typeid(T).name() <<
sizeof(T) <<
" to " << this->
get_class_name()
1399 template<
typename T>
1400 void teca_variant_array::set_dispatch(
unsigned long i,
const T &val,
1410 ptthis->
set(i, val);
1416 <<
typeid(T).name() <<
sizeof(T) <<
" to " << this->
get_class_name()
1421 template<
typename T>
1422 void teca_variant_array::set_dispatch(
unsigned long i,
const T &val,
1428 TT *ptthis =
dynamic_cast<TT*
>(
this);
1429 ptthis->
set(i, val);
1435 <<
typeid(T).name() <<
sizeof(T) <<
" to " << this->
get_class_name()
1440 template<
typename T>
1441 void teca_variant_array::set_dispatch(
const std::vector<T> &src,
1457 <<
typeid(T).name() <<
sizeof(T) <<
" to " << this->
get_class_name()
1462 template<
typename T>
1463 void teca_variant_array::set_dispatch(
const std::vector<T> &src,
1469 TT *ptthis =
dynamic_cast<TT*
>(
this);
1476 <<
typeid(T).name() <<
sizeof(T) <<
" to " << this->
get_class_name()
1481 template<
typename T>
1482 void teca_variant_array::set_dispatch(
size_t dest_start,
1483 const T *src,
size_t src_start,
size_t n_elem,
1493 ptthis->
set(dest_start, src, src_start, n_elem);
1499 <<
typeid(T).name() <<
sizeof(T) <<
" to " << this->
get_class_name()
1504 template<
typename T>
1505 void teca_variant_array::set_dispatch(
size_t dest_start,
1506 const T *src,
size_t src_start,
size_t n_elem,
1512 TT *ptthis =
dynamic_cast<TT*
>(
this);
1513 ptthis->
set(dest_start, src, src_start, n_elem);
1519 <<
typeid(T).name() <<
sizeof(T) <<
" to " << this->
get_class_name()
1524 template<
typename T>
1525 void teca_variant_array::assign_dispatch(
const std::vector<T> &src,
1541 <<
typeid(T).name() <<
sizeof(T) <<
" to " << this->
get_class_name()
1546 template<
typename T>
1547 void teca_variant_array::assign_dispatch(
const std::vector<T> &src,
1553 TT *ptthis =
dynamic_cast<TT*
>(
this);
1560 <<
typeid(T).name() <<
sizeof(T) <<
" to " << this->
get_class_name()
1565 template<
typename T>
1566 void teca_variant_array::assign_dispatch(
const T *src,
size_t src_start,
1576 ptthis->
assign(src, src_start, n_elem);
1582 <<
typeid(T).name() <<
sizeof(T) <<
" to " << this->
get_class_name()
1587 template<
typename T>
1588 void teca_variant_array::assign_dispatch(
const T *src,
size_t src_start,
size_t n_elem,
1594 TT *ptthis =
dynamic_cast<TT*
>(
this);
1595 ptthis->
assign(src, src_start, n_elem);
1601 <<
typeid(T).name() <<
sizeof(T) <<
" to " << this->
get_class_name()
1606 template<
typename T>
1607 void teca_variant_array::append_dispatch(
const T &val,
1623 <<
typeid(T).name() <<
sizeof(T) <<
" to " << this->
get_class_name()
1628 template<
typename T>
1629 void teca_variant_array::append_dispatch(
const T &val,
1635 TT *ptthis =
dynamic_cast<TT*
>(
this);
1642 <<
typeid(T).name() <<
sizeof(T) <<
" to " << this->
get_class_name()
1647 template<
typename T>
1648 void teca_variant_array::append_dispatch(
const std::vector<T> &src,
1664 <<
typeid(T).name() <<
sizeof(T) <<
" to " << this->
get_class_name()
1669 template<
typename T>
1670 void teca_variant_array::append_dispatch(
const std::vector<T> &src,
1676 TT *ptthis =
dynamic_cast<TT*
>(
this);
1683 <<
typeid(T).name() <<
sizeof(T) <<
" to " << this->
get_class_name()
1688 template<
typename T>
1689 void teca_variant_array::append_dispatch(
const T *src,
size_t src_start,
size_t n_elem,
1699 ptthis->
append(src, src_start, n_elem);
1705 <<
typeid(T).name() <<
sizeof(T) <<
" to " << this->
get_class_name()
1710 template<
typename T>
1711 void teca_variant_array::append_dispatch(
const T *src,
size_t src_start,
size_t n_elem,
1717 TT *ptthis =
dynamic_cast<TT*
>(
this);
1718 ptthis->
append(src, src_start, n_elem);
1724 <<
typeid(T).name() <<
sizeof(T) <<
" to " << this->
get_class_name()
1732 template<
typename T>
1739 template<
typename T>
1742 return std::make_shared<teca_variant_array_impl<T>>(alloc);
1746 template<
typename T>
1749 return std::make_shared<teca_variant_array_impl<T>>(alloc, n);
1753 template<
typename T>
1754 template<
typename U>
1756 const U &v, allocator alloc)
1758 return std::make_shared<teca_variant_array_impl<T>>(alloc, n, v);
1762 template<
typename T>
1763 template<
typename U>
1765 const U *v, allocator alloc)
1767 return std::make_shared<teca_variant_array_impl<T>>(alloc, n, v);
1771 template<
typename T>
1772 template <
typename delete_func_t>
1774 T *ptr, allocator alloc,
int owner, delete_func_t df)
1776 return std::make_shared<teca_variant_array_impl<T>>
1777 (alloc, n, owner, ptr, df);
1781 template<
typename T>
1784 if (alloc == allocator::same)
1785 alloc =
static_cast<allocator>(m_data.get_allocator());
1787 return std::make_shared<teca_variant_array_impl<T>>
1788 (alloc, this->shared_from_this());
1792 template<
typename T>
1796 if (alloc == allocator::same)
1797 alloc =
static_cast<allocator>(m_data.get_allocator());
1800 std::make_shared<teca_variant_array_impl<T>>
1803 this->
get(src_start, dest, 0, n_elem);
1809 template<
typename T>
1812 if (alloc == allocator::same)
1813 alloc =
static_cast<allocator>(m_data.get_allocator());
1815 return std::make_shared<teca_variant_array_impl<T>>(alloc);
1819 template<
typename T>
1823 if (alloc == allocator::same)
1824 alloc =
static_cast<allocator>(m_data.get_allocator());
1826 return std::make_shared<teca_variant_array_impl<T>>(alloc, n);
1830 template<
typename T>
1834 if (this->m_data.get_allocator() == alloc)
1838 hamr::buffer<T> tmp(alloc, m_data);
1839 m_data = std::move(tmp);
1845 template<
typename T>
1849 std::dynamic_pointer_cast<teca_variant_array_impl<T>>(other);
1853 m_data.swap(pt_other->m_data);
1857 << other->get_class_name() <<
sizeof(T) <<
" to " << this->get_class_name()
1862 template<
typename T>
1865 const char *element_name =
typeid(T).name();
1866 size_t element_size =
sizeof(T);
1867 std::ostringstream oss;
1868 oss <<
"teca_variant_array_impl<" << element_name
1869 << element_size <<
">";
1874 template<
typename T>
1877 return m_data.size();
1881 template<
typename T>
1888 template<
typename T>
1891 m_data.resize(n, val);
1895 template<
typename T>
1902 template<
typename T>
1909 template <
typename T>
1910 template <
typename U>
1917 std::dynamic_pointer_cast<teca_variant_array_impl<T>>(dest);
1921 m_data.
get(src_start, tp_dest->m_data, dest_start, n_elem);
1926 << dest->get_class_name() <<
" to " << this->get_class_name()
1931 template <
typename T>
1932 template <
typename U>
1937 assert(dest->size() >= dest_start + n_elem);
1938 assert(this->
size() >= src_start + n_elem);
1939 m_data.get(src_start, dest->m_data, dest_start, n_elem);
1943 template <
typename T>
1944 template <
typename U>
1951 std::dynamic_pointer_cast<const teca_variant_array_impl<T>>(src);
1955 m_data.
set(dest_start, tp_src->m_data, src_start, n_elem);
1961 << src->get_class_name() <<
" to " << this->get_class_name()
1966 template <
typename T>
1967 template <
typename U>
1972 m_data.
set(dest_start, src->m_data, src_start, n_elem);
1976 template <
typename T>
1977 template <
typename U>
1984 std::dynamic_pointer_cast<const teca_variant_array_impl<T>>(src);
1988 m_data.
assign(tp_src->m_data, src_start, n_elem);
1993 << src->get_class_name() <<
" to " << this->get_class_name()
1998 template <
typename T>
1999 template <
typename U>
2004 m_data.
assign(src->m_data, src_start, n_elem);
2008 template <
typename T>
2009 template <
typename U>
2016 std::dynamic_pointer_cast<const teca_variant_array_impl<T>>(src);
2020 m_data.
append(tp_src->m_data, src_start, n_elem);
2025 << src->get_class_name() <<
" to " << this->get_class_name()
2030 template <
typename T>
2031 template <
typename U>
2036 m_data.
append(src->m_data, src_start, n_elem);
2040 template <
typename T>
2041 template <
typename U>
2048 std::dynamic_pointer_cast<teca_variant_array_impl<T>>(dest);
2052 this->get_dispatch(src_start, tp_dest, dest_start, n_elem);
2057 << dest->get_class_name() <<
" to " << this->get_class_name()
2062 template <
typename T>
2063 template <
typename U>
2070 std::shared_ptr<TT> tp_dest = std::static_pointer_cast<TT>(dest);
2071 this->get_dispatch(src_start, tp_dest, dest_start, n_elem);
2076 << dest->get_class_name() <<
" to " << this->get_class_name()
2081 template <
typename T>
2082 template <
typename U>
2089 std::dynamic_pointer_cast<const teca_variant_array_impl<T>>(src);
2093 this->set_dispatch(dest_start, tp_src, src_start, n_elem);
2098 << src->get_class_name() <<
" to " << this->get_class_name()
2103 template <
typename T>
2104 template <
typename U>
2114 this->set_dispatch(dest_start, tp_src, src_start, n_elem);
2119 << src->get_class_name() <<
" to " << this->get_class_name()
2124 template <
typename T>
2125 template <
typename U>
2132 std::dynamic_pointer_cast<const teca_variant_array_impl<T>>(src);
2136 this->assign_dispatch(tp_src, src_start, n_elem);
2141 << src->get_class_name() <<
" to " << this->get_class_name()
2146 template <
typename T>
2147 template <
typename U>
2154 std::shared_ptr<const TT> tp_src = std::static_pointer_cast<const TT>(src);
2155 this->assign_dispatch(tp_src, src_start, n_elem);
2160 << src->get_class_name() <<
" to " << this->get_class_name()
2165 template <
typename T>
2166 template <
typename U>
2173 std::dynamic_pointer_cast<const teca_variant_array_impl<T>>(src);
2177 this->append_dispatch(tp_src, src_start, n_elem);
2182 << src->get_class_name() <<
" to " << this->get_class_name()
2187 template <
typename T>
2188 template <
typename U>
2195 std::shared_ptr<const TT> tp_src = std::static_pointer_cast<const TT>(src);
2196 this->append_dispatch(tp_src, src_start, n_elem);
2201 << src->get_class_name() <<
" to " << this->get_class_name()
2206 template <
typename T>
2207 template <
typename U>
2209 U *dest,
size_t dest_start,
size_t n_elem,
2218 thisu->m_data.get(src_start, dest, dest_start, n_elem);
2223 << safe_class_name(
this) <<
" to " << safe_pointer_name(dest)
2228 template <
typename T>
2229 template <
typename U>
2231 U *dest,
size_t dest_start,
size_t n_elem,
2234 m_data.
get(src_start, dest, dest_start, n_elem);
2238 template <
typename T>
2239 template <
typename U>
2241 const U *src,
size_t src_start,
size_t n_elem,
2250 thisu->m_data.set(dest_start, src, src_start, n_elem);
2255 << safe_class_name(
this) <<
" to " << safe_pointer_name(src)
2260 template <
typename T>
2261 template <
typename U>
2263 const U *src,
size_t src_start,
size_t n_elem,
2266 m_data.
set(dest_start, src, src_start, n_elem);
2270 template <
typename T>
2271 template <
typename U>
2273 const U *src,
size_t src_start,
size_t n_elem,
2282 thisu->m_data.assign(src, src_start, n_elem);
2287 << safe_class_name(
this) <<
" to " << safe_pointer_name(src)
2292 template <
typename T>
2293 template <
typename U>
2295 const U *src,
size_t src_start,
size_t n_elem,
2298 m_data.
assign(src, src_start, n_elem);
2302 template <
typename T>
2303 template <
typename U>
2305 const U *src,
size_t src_start,
size_t n_elem,
2314 thisu->m_data.append(src, src_start, n_elem);
2319 << safe_class_name(
this) <<
" to " << safe_pointer_name(src)
2324 template <
typename T>
2325 template <
typename U>
2327 const U *src,
size_t src_start,
size_t n_elem,
2330 m_data.
append(src, src_start, n_elem);
2337 template<
typename T>
2342 const TT *other_t =
dynamic_cast<const TT*
>(other.get());
2345 size_t n_elem = this->
size();
2347 if (n_elem != other_t->size())
2351 const NT *pthis = spthis.get();
2353 auto spother = other_t->get_host_accessible();
2354 const NT *pother = spother.get();
2358 for (
size_t i = 0; i < n_elem; ++i)
2360 if (pthis[i] != pother[i])
2367 << safe_class_name(other.get()) <<
" to " << safe_class_name(
this)
2373 template<
typename T>
2374 template <
typename U>
2376 typename std::enable_if<pack_array<U>::value, U>::type*)
const
2383 unsigned long long n_elem = this->
size();
2387 s.pack(pdata.get(), n_elem);
2391 template<
typename T>
2392 template <
typename U>
2394 typename std::enable_if<pack_array<U>::value, U>::type*)
2397 unsigned long long n_elem = 0;
2401 hamr::buffer<T> tmp(allocator::malloc, n_elem);
2402 std::shared_ptr<T> sptmp = tmp.pointer();
2405 s.unpack(sptmp.get(), n_elem);
2408 m_data = std::move(tmp);
2412 template<
typename T>
2413 template <
typename U>
2415 typename std::enable_if<pack_object<U>::value, U>::type*)
const
2418 unsigned long long n_elem = this->
size();
2423 const T *pdata =
data.get();
2427 for (
unsigned long long i = 0; i < n_elem; ++i)
2429 pdata[i].to_stream(s);
2434 template<
typename T>
2435 template <
typename U>
2438 typename std::enable_if<pack_object<U>::value, U>::type*)
2441 unsigned long long n_elem = 0;
2445 std::vector<T> tmp(n_elem);
2446 for (
unsigned long long i = 0; i < n_elem; ++i)
2448 tmp[i].from_stream(s);
2452 m_data.assign(tmp.data(), 0, n_elem);
2456 template<
typename T>
2457 template <
typename U>
2460 typename std::enable_if<pack_object_ptr<U>::value, U>::type*)
const
2463 unsigned long long n_elem = this->
size();
2468 const T *pdata =
data.get();
2472 for (
unsigned long long i = 0; i < n_elem; ++i)
2474 pdata[i]->to_stream(s);
2479 template<
typename T>
2480 template <
typename U>
2483 typename std::enable_if<pack_object_ptr<U>::value, U>::type*)
2486 unsigned long long n_elem = 0;
2490 std::vector<T> tmp(n_elem);
2491 for (
unsigned long long i=0; i < n_elem; ++i)
2493 tmp[i]->from_stream(s);
2497 m_data.assign(tmp.data(), 0, n_elem);
2500 #define STR_DELIM(_a, _b) \
2501 (std::is_same<T, std::string>::value ? _a : _b)
2504 template<
typename T>
2505 template <
typename U>
2508 typename std::enable_if<pack_array<U>::value, U>::type*)
const
2510 size_t n_elem = this->
size();
2515 const T *pdata =
data.get();
2519 s << STR_DELIM(
"\"",
"") << pdata[0] << STR_DELIM(
"\"",
"");
2521 for (
size_t i = 1; i < n_elem; ++i)
2523 s << STR_DELIM(
", \"",
", ") << pdata[i] << STR_DELIM(
"\"",
"");
2529 template<
typename T>
2530 template <
typename U>
2533 typename std::enable_if<pack_array<U>::value, U>::type*)
2539 template<
typename T>
2540 template <
typename U>
2543 typename std::enable_if<pack_object<U>::value, U>::type*)
const
2545 size_t n_elem = this->m_data.
size();
2550 const T *pdata =
data.get();
2555 pdata[0].to_stream(s);
2557 for (
size_t i = 1; i < n_elem; ++i)
2560 pdata[i].to_stream(s);
2567 template<
typename T>
2568 template <
typename U>
2571 typename std::enable_if<pack_object<U>::value, U>::type*)
2577 template<
typename T>
2578 template <
typename U>
2581 typename std::enable_if<pack_object_ptr<U>::value, U>::type*)
const
2583 size_t n_elem = this->m_data.
size();
2588 const T *pdata =
data.get();
2593 pdata[0]->to_stream(s);
2595 for (
size_t i = 1; i < n_elem; ++i)
2598 pdata[i]->to_stream(s);
2605 template<
typename T>
2606 template <
typename U>
2609 typename std::enable_if<pack_object_ptr<U>::value, U>::type*)
2615 template <
typename T>
2618 template <
unsigned int I>
2621 template <
unsigned int I>
2624 #define TECA_VARIANT_ARRAY_TT_SPEC(T, v) \
2626 struct teca_variant_array_code<T> \
2628 static constexpr unsigned int get() \
2632 struct teca_variant_array_new<v> \
2634 using allocator = teca_variant_array::allocator; \
2636 static p_teca_variant_array_impl<T> New(allocator alloc) \
2637 { return teca_variant_array_impl<T>::New(alloc); } \
2640 struct teca_variant_array_type<v> \
2644 static constexpr const char *name() \
2648 #define TECA_VARIANT_ARRAY_FACTORY_NEW(_v) \
2650 return teca_variant_array_new<_v>::New(alloc);
2652 #include "teca_metadata.h"
2655 TECA_VARIANT_ARRAY_TT_SPEC(
char, 1)
2656 TECA_VARIANT_ARRAY_TT_SPEC(
unsigned char, 2)
2657 TECA_VARIANT_ARRAY_TT_SPEC(
int, 3)
2658 TECA_VARIANT_ARRAY_TT_SPEC(
unsigned int, 4)
2659 TECA_VARIANT_ARRAY_TT_SPEC(
short int, 5)
2660 TECA_VARIANT_ARRAY_TT_SPEC(
short unsigned int, 6)
2661 TECA_VARIANT_ARRAY_TT_SPEC(
long, 7)
2662 TECA_VARIANT_ARRAY_TT_SPEC(
unsigned long, 8)
2663 TECA_VARIANT_ARRAY_TT_SPEC(
long long, 9)
2664 TECA_VARIANT_ARRAY_TT_SPEC(
unsigned long long, 10)
2665 TECA_VARIANT_ARRAY_TT_SPEC(
float, 11)
2666 TECA_VARIANT_ARRAY_TT_SPEC(
double, 12)
2667 TECA_VARIANT_ARRAY_TT_SPEC(std::
string, 13)
2685 allocator alloc = allocator::malloc)
2689 TECA_VARIANT_ARRAY_FACTORY_NEW(1)
2690 TECA_VARIANT_ARRAY_FACTORY_NEW(2)
2691 TECA_VARIANT_ARRAY_FACTORY_NEW(3)
2692 TECA_VARIANT_ARRAY_FACTORY_NEW(4)
2693 TECA_VARIANT_ARRAY_FACTORY_NEW(5)
2694 TECA_VARIANT_ARRAY_FACTORY_NEW(6)
2695 TECA_VARIANT_ARRAY_FACTORY_NEW(7)
2696 TECA_VARIANT_ARRAY_FACTORY_NEW(8)
2697 TECA_VARIANT_ARRAY_FACTORY_NEW(9)
2698 TECA_VARIANT_ARRAY_FACTORY_NEW(10)
2699 TECA_VARIANT_ARRAY_FACTORY_NEW(11)
2700 TECA_VARIANT_ARRAY_FACTORY_NEW(12)
2701 TECA_VARIANT_ARRAY_FACTORY_NEW(13)
2702 TECA_VARIANT_ARRAY_FACTORY_NEW(14)
2703 TECA_VARIANT_ARRAY_FACTORY_NEW(15)
2705 TECA_ERROR(
"Failed to create a teca_variant_array,"
2706 " unknown code " << type_code)
2713 #define CODE_DISPATCH_CASE(_v, _c, _code) \
2716 using NT = teca_variant_array_type<_c>::type; \
2717 using TT = teca_variant_array_impl<NT>; \
2721 #define CODE_DISPATCH_I(_v, _code) \
2722 CODE_DISPATCH_CASE(_v, 1, _code) \
2723 else CODE_DISPATCH_CASE(_v, 2, _code) \
2724 else CODE_DISPATCH_CASE(_v, 3, _code) \
2725 else CODE_DISPATCH_CASE(_v, 4, _code) \
2726 else CODE_DISPATCH_CASE(_v, 5, _code) \
2727 else CODE_DISPATCH_CASE(_v, 6, _code) \
2728 else CODE_DISPATCH_CASE(_v, 7, _code) \
2729 else CODE_DISPATCH_CASE(_v, 8, _code) \
2730 else CODE_DISPATCH_CASE(_v, 9, _code) \
2731 else CODE_DISPATCH_CASE(_v, 10, _code)
2733 #define CODE_DISPATCH_FP(_v, _code) \
2734 CODE_DISPATCH_CASE(_v, 11, _code) \
2735 else CODE_DISPATCH_CASE(_v, 12, _code)
2737 #define CODE_DISPATCH_CLASS(_v, _code) \
2738 CODE_DISPATCH_CASE(_v, 13, _code) \
2739 else CODE_DISPATCH_CASE(_v, 14, _code) \
2740 else CODE_DISPATCH_CASE(_v, 15, _code)
2742 #define CODE_DISPATCH(_v, _code) \
2743 CODE_DISPATCH_I(_v, _code) \
2744 else CODE_DISPATCH_FP(_v, _code)
2749 template <
typename T>
2752 return teca_variant_array_code<T>::get();
2756 template <
typename T>
2760 size_t n_elem = a->size();
2761 T mn = std::numeric_limits<T>::max();
2762 #if defined(TECA_HAS_CUDA)
2763 if (a->cuda_accessible())
2765 std::shared_ptr<const T>
data = a->get_cuda_accessible();
2766 thrust::device_ptr<const T> pdata(
data.get());
2767 mn = thrust::reduce(pdata, pdata + n_elem, mn, thrust::minimum<T>());
2772 std::shared_ptr<const T>
data = a->get_cuda_accessible();
2773 const T *pdata =
data.get();
2774 for (
size_t i = 0; i < n_elem; ++i)
2775 mn = mn > pdata[i] ? pdata[i] : mn;
2776 #if defined(TECA_HAS_CUDA)
2783 template <
typename T>
2791 template <
typename T>
2795 size_t n_elem = a->size();
2796 T mx = std::numeric_limits<T>::lowest();
2797 #if defined(TECA_HAS_CUDA)
2798 if (a->cuda_accessible())
2800 std::shared_ptr<const T>
data = a->get_cuda_accessible();
2801 thrust::device_ptr<const T> pdata(
data.get());
2802 mx = thrust::reduce(pdata, pdata + n_elem, mx, thrust::maximum<T>());
2807 std::shared_ptr<const T>
data = a->get_cuda_accessible();
2808 const T *pdata =
data.get();
2809 for (
size_t i = 0; i < n_elem; ++i)
2810 mx = mx < pdata[i] ? pdata[i] : mx;
2811 #if defined(TECA_HAS_CUDA)
2818 template <
typename T>
2825 #if defined(__CUDACC__)
2826 #pragma nv_diag_default = partial_override
Serialize objects into a binary stream.
Definition: teca_binary_stream.h:17
The concrete implementation of our type agnostic container for contiguous arrays.
Definition: teca_variant_array_impl.h:380
std::shared_ptr< T > & pointer()
Definition: teca_variant_array_impl.h:840
void get(size_t src_start, U *dest, size_t dest_start, size_t n_elem) const
get a range of values
Definition: teca_variant_array_impl.h:536
void set(const const_p_teca_variant_array_impl< U > &src)
Set from the other array.
Definition: teca_variant_array_impl.h:642
void append(const const_p_teca_variant_array &src) override
Definition: teca_variant_array_impl.h:763
int cuda_accessible() const noexcept override
returns true if the data is accessible from CUDA codes
Definition: teca_variant_array_impl.h:843
int host_accessible() const noexcept override
returns true if the data is accessible from codes running on the CPU
Definition: teca_variant_array_impl.h:846
void debug_print(typename std::enable_if<!std::is_arithmetic< U >::value >::type *=0) const
Print the contents of the buffer for debugging.
Definition: teca_variant_array_impl.h:902
void set(const std::vector< U > &src)
set from a vector of values
Definition: teca_variant_array_impl.h:601
teca_variant_array_impl(allocator alloc, size_t n_elem)
construct with preallocated size
Definition: teca_variant_array_impl.h:927
teca_variant_array_impl(allocator alloc, const const_p_teca_variant_array_impl< U > &other)
copy construct from an instance of different type
Definition: teca_variant_array_impl.h:941
void copy(const const_p_teca_variant_array_impl< U > &src, size_t src_start, size_t n_elem)
copy a subset of the other array
Definition: teca_variant_array_impl.h:728
teca_variant_array_impl(allocator alloc, size_t n_elem, const U *vals)
construct with preallocated size and initialized to a specific value
Definition: teca_variant_array_impl.h:936
void get(size_t i, U &val) const
Definition: teca_variant_array_impl.h:512
void reserve(unsigned long n) override
Reserve space.
Definition: teca_variant_array_impl.h:1896
void get(const p_teca_variant_array &dest) const override
get the contents into the other array.
Definition: teca_variant_array_impl.h:543
int to_stream(std::ostream &s) const override
Serialize to the stream.
Definition: teca_variant_array_impl.h:882
const std::shared_ptr< const T > get_host_accessible() const
Definition: teca_variant_array_impl.h:806
void append(const std::vector< U > &vals)
append a vector of values
Definition: teca_variant_array_impl.h:750
void synchronize() const override
Sycnhronize the stream used for data movement.
Definition: teca_variant_array_impl.h:816
void set(const const_p_teca_variant_array &src) override
Set from the other array.
Definition: teca_variant_array_impl.h:621
static std::shared_ptr< teca_variant_array_impl< T > > New(size_t n, const U *v)
Definition: teca_variant_array_impl.h:437
void assign(const U *src, size_t src_start, size_t n_elem)
assign a subset from the other array
Definition: teca_variant_array_impl.h:678
void set(size_t dest_start, const U *src, size_t src_start, size_t n_elem)
Definition: teca_variant_array_impl.h:614
const T * data() const
Definition: teca_variant_array_impl.h:822
void copy(const const_p_teca_variant_array_impl< U > &src)
copy the contents from the other array.
Definition: teca_variant_array_impl.h:721
int from_stream(std::ostream &s) override
Deserialize from the stream.
Definition: teca_variant_array_impl.h:889
void debug_print(typename std::enable_if< std::is_arithmetic< U >::value >::type *=0) const
Print the contents of the buffer for debugging.
Definition: teca_variant_array_impl.h:897
const std::shared_ptr< const T > get_cuda_accessible() const
Get a pointer to the data accessible within CUDA.
Definition: teca_variant_array_impl.h:810
void append(const const_p_teca_variant_array &src, size_t src_start, size_t n_elem) override
append a subset of the passed array
Definition: teca_variant_array_impl.h:769
static std::shared_ptr< teca_variant_array_impl< T > > New(size_t n, const U &v, allocator alloc)
teca_variant_array_impl()
default construct (the object is unusable)
Definition: teca_variant_array_impl.h:920
void append(const U *src, size_t src_start, size_t n_elem)
append a range of values
Definition: teca_variant_array_impl.h:757
bool equal(const const_p_teca_variant_array &other) const override
virtual equivalence test
Definition: teca_variant_array_impl.h:2338
void assign(const const_p_teca_variant_array &src, size_t src_start, size_t n_elem) override
assign a subset of the other array
Definition: teca_variant_array_impl.h:690
void assign(const const_p_teca_variant_array_impl< U > &src)
assign the contents from the other array.
Definition: teca_variant_array_impl.h:698
void get(size_t src_start, const p_teca_variant_array_impl< U > &dest, size_t dest_start, size_t n_elem) const
Definition: teca_variant_array_impl.h:577
unsigned long size() const noexcept override
Get the current size of the data.
Definition: teca_variant_array_impl.h:1875
teca_variant_array_impl(allocator alloc)
construct with a specific allocator
Definition: teca_variant_array_impl.h:923
virtual void get(const p_teca_variant_array &dest) const=0
static std::shared_ptr< teca_variant_array_impl< T > > New(size_t n, const U &v)
Definition: teca_variant_array_impl.h:421
virtual void assign(const const_p_teca_variant_array &src)=0
T get(size_t i) const
get a single value
Definition: teca_variant_array_impl.h:518
int set_allocator(allocator alloc) override
Definition: teca_variant_array_impl.h:1831
std::string get_class_name() const override
Returns the name of the class in a human readable form.
Definition: teca_variant_array_impl.h:1863
static std::shared_ptr< teca_variant_array_impl< T > > New(size_t n, const U *v, allocator alloc)
void set(size_t i, const U &val)
Definition: teca_variant_array_impl.h:594
void get(std::vector< U > &dest) const
get a vector of values
Definition: teca_variant_array_impl.h:527
T * data()
Definition: teca_variant_array_impl.h:828
void set(size_t dest_start, const const_p_teca_variant_array_impl< U > &src, size_t src_start, size_t n_elem)
Definition: teca_variant_array_impl.h:655
void assign(const const_p_teca_variant_array_impl< U > &src, size_t src_start, size_t n_elem)
assign a subset of the other array
Definition: teca_variant_array_impl.h:713
void get(const p_teca_variant_array_impl< U > &dest) const
get the contents into the other array.
Definition: teca_variant_array_impl.h:564
void resize(unsigned long n) override
Resize the data.
Definition: teca_variant_array_impl.h:1882
const std::shared_ptr< T > & pointer() const
Definition: teca_variant_array_impl.h:834
void assign(const const_p_teca_variant_array &src) override
assign the contents from the other array.
Definition: teca_variant_array_impl.h:684
static std::shared_ptr< teca_variant_array_impl< T > > New(size_t n)
Definition: teca_variant_array_impl.h:406
void append(const U &val)
Definition: teca_variant_array_impl.h:743
int from_stream(teca_binary_stream &s) override
Deserialize from the stream.
Definition: teca_variant_array_impl.h:875
void set(size_t dest_start, const const_p_teca_variant_array &src, size_t src_start, size_t n_elem) override
Definition: teca_variant_array_impl.h:633
void assign(const p_teca_variant_array_impl< U > &src)
assign the contents from the other array.
Definition: teca_variant_array_impl.h:705
void get(size_t src_start, const p_teca_variant_array &dest, size_t dest_start, size_t n_elem) const override
Definition: teca_variant_array_impl.h:555
void swap(const p_teca_variant_array &other) override
virtual swap
Definition: teca_variant_array_impl.h:1846
void assign(const std::vector< U > &src)
Definition: teca_variant_array_impl.h:671
static std::shared_ptr< teca_variant_array_impl< T > > New(size_t n, T *ptr, allocator alloc, int owner, delete_func_t df)
static std::shared_ptr< teca_variant_array_impl< T > > New()
Definition: teca_variant_array_impl.h:393
teca_variant_array_impl(allocator alloc, size_t n_elem, const T &val)
construct with preallocated size and initialized to a specific value
Definition: teca_variant_array_impl.h:931
void clear() noexcept override
Clear the data.
Definition: teca_variant_array_impl.h:1903
teca_variant_array_impl(allocator alloc, size_t size, int owner, T *ptr, delete_func_t df)
zero-copy construct by setting buffer contents directly
Definition: teca_variant_array_impl.h:947
A type erasure for array based data.
Definition: teca_variant_array.h:43
virtual void set(const const_p_teca_variant_array &src)=0
virtual void copy(const const_p_teca_variant_array &src)
copy the contents from the other array.
Definition: teca_variant_array.h:273
virtual void assign(const const_p_teca_variant_array &src)=0
virtual void append(const const_p_teca_variant_array &src)=0
virtual void get(const p_teca_variant_array &dest) const =0
hamr::buffer_allocator allocator
allocator types
Definition: teca_variant_array.h:46
p_teca_variant_array new_instance() const
Definition: teca_variant_array.h:62
p_teca_variant_array new_copy() const
Definition: teca_variant_array.h:101
bool equal(T a, T b, T relTol=equal_tt< T >::relTol(), T absTol=equal_tt< T >::absTol(), typename std::enable_if< std::is_floating_point< T >::value >::type *=0)
Definition: teca_coordinate_util.h:76
p_teca_error_handler error_handler TECA_EXPORT
The global error handler instance.
TECA_EXPORT bool append(teca_variant_array *varr, PyObject *obj)
Append values from the object to the variant array.
Definition: teca_py_array.h:221
TECA_EXPORT bool set(teca_variant_array *varr, unsigned long i, PyObject *obj)
Set i'th element of the variant array to the value of the object.
Definition: teca_py_array.h:305
some functions helping us manipulate teca_variant_array
Definition: teca_variant_array_util.h:14
auto get_host_accessible()
terminates recursion
Definition: teca_variant_array_util.h:99
auto data(V &&... args)
Definition: teca_variant_array_util.h:255
void sync_host_access_any(const array_t &... arrays)
Definition: teca_variant_array_util.h:29
auto New(size_t n_elem, teca_variant_array::allocator alloc=teca_variant_array::allocator::malloc)
Definition: teca_variant_array_util.h:269
Definition: teca_variant_array.h:25
Definition: teca_variant_array.h:24
Creates an instance of teca_variant_array_impl<T> where T is determined from the type code.
Definition: teca_variant_array_impl.h:2676
static p_teca_variant_array New(unsigned int type_code, allocator alloc=allocator::malloc)
Definition: teca_variant_array_impl.h:2684
#define TECA_ERROR(_msg)
Constructs an error message and sends it to the stderr stream.
Definition: teca_common.h:161
#define TECA_FATAL_ERROR(_msg)
Definition: teca_common.h:153
#define TECA_WARNING(_msg)
Constructs a warning message and sends it to the stderr stream.
Definition: teca_common.h:164
std::shared_ptr< teca_variant_array > p_teca_variant_array
Definition: teca_variant_array.h:27
std::shared_ptr< const teca_variant_array > const_p_teca_variant_array
Definition: teca_variant_array.h:27
#define TEMPLATE_DISPATCH(t, p,...)
Definition: teca_variant_array_impl.h:244
std::shared_ptr< const teca_variant_array_impl< T > > const_p_teca_variant_array_impl
Definition: teca_variant_array_impl.h:44
std::shared_ptr< teca_variant_array_impl< T > > p_teca_variant_array_impl
Definition: teca_variant_array_impl.h:44
const_p_teca_variant_array_impl< T > const_ptr(const p_teca_variant_array_impl< T > &v)
Definition: teca_variant_array_impl.h:116