1 #ifndef teca_variant_array_h
2 #define teca_variant_array_h
13 #include <type_traits>
16 #include <hamr_buffer_allocator.h>
18 #include "teca_config.h"
20 #include "teca_binary_stream.h"
21 #include "teca_bad_cast.h"
64 return new_instance(allocator::malloc);
74 return new_instance(n, allocator::malloc);
103 return new_copy(allocator::malloc);
114 size_t n_elem, allocator alloc)
const = 0;
124 return new_copy(src_start, n_elem, allocator::malloc);
135 virtual int set_allocator(allocator alloc) = 0;
138 virtual std::string get_class_name()
const = 0;
141 virtual void initialize() = 0;
161 size_t dest_start,
size_t n_elem)
const = 0;
165 void get(
unsigned long i, T &val)
const;
169 T get(
unsigned long i)
const;
173 void get(std::vector<T> &vals)
const;
177 void get(
size_t src_start, T *dest,
size_t dest_start,
size_t n_elem)
const;
206 size_t src_start,
size_t n_elem) = 0;
217 size_t src_start,
size_t n_elem)
225 void set(
unsigned long i,
const T &val);
229 void set(
const std::vector<T> &src);
233 void set(
size_t dest_start,
const T *src,
size_t src_start,
size_t n_elem);
254 size_t src_start,
size_t n_elem) = 0;
258 size_t src_start,
size_t n_elem)
266 void assign(
const std::vector<T> &src);
270 void assign(
const T *src,
size_t src_start,
size_t n_elem);
287 size_t src_start,
size_t n_elem)
289 this->assign(src, src_start, n_elem);
311 size_t src_start,
size_t n_elem) = 0;
315 size_t src_start,
size_t n_elem)
323 void append(
const T &val);
329 void append(
const std::vector<T> &src);
335 void append(
const T *src,
size_t src_start,
size_t n_elem);
339 virtual unsigned long size() const noexcept = 0;
342 virtual
void resize(
unsigned long i) = 0;
347 virtual
void reserve(
unsigned long i) = 0;
350 virtual
void clear() noexcept = 0;
367 virtual
int to_stream(std::ostream &s) const = 0;
370 virtual
int from_stream(std::ostream &s) = 0;
373 virtual
unsigned int type_code() const noexcept = 0;
377 void get_dispatch(
unsigned long i, T &val,
378 typename std::enable_if<
object_dispatch<T>::value, T>::type* = 0) const;
381 void get_dispatch(
unsigned long i, T &val,
382 typename std::enable_if<
pod_dispatch<T>::value, T>::type* = 0) const;
385 void get_dispatch(std::vector<T> &vals,
386 typename std::enable_if<
object_dispatch<T>::value, T>::type* = 0) const;
389 void get_dispatch(std::vector<T> &vals,
390 typename std::enable_if<
pod_dispatch<T>::value, T>::type* = 0) const;
393 void get_dispatch(
size_t src_start, T *dest,
size_t dest_start,
size_t n_elem,
394 typename std::enable_if<
object_dispatch<T>::value, T>::type* = 0) const;
397 void get_dispatch(
size_t src_start, T *dest,
size_t dest_start,
size_t n_elem,
398 typename std::enable_if<
pod_dispatch<T>::value, T>::type* = 0) const;
401 void set_dispatch(
unsigned long i, const T &val,
405 void set_dispatch(
unsigned long i, const T &val,
406 typename std::enable_if<
pod_dispatch<T>::value, T>::type* = 0);
409 void set_dispatch(const std::vector<T> &src,
413 void set_dispatch(const std::vector<T> &src,
414 typename std::enable_if<
pod_dispatch<T>::value, T>::type* = 0);
417 void set_dispatch(
size_t dest_start, const T *src,
size_t src_start,
size_t n_elem,
421 void set_dispatch(
size_t dest_start, const T *src,
size_t src_start,
size_t n_elem,
422 typename std::enable_if<
pod_dispatch<T>::value, T>::type* = 0);
425 void assign_dispatch(const std::vector<T> &src,
429 void assign_dispatch(const std::vector<T> &src,
430 typename std::enable_if<
pod_dispatch<T>::value, T>::type* = 0);
433 void assign_dispatch(const T *src,
size_t src_start,
size_t n_elem,
437 void assign_dispatch(const T *src,
size_t src_start,
size_t n_elem,
438 typename std::enable_if<
pod_dispatch<T>::value, T>::type* = 0);
441 void append_dispatch(const T &val,
445 void append_dispatch(const T &val,
446 typename std::enable_if<
pod_dispatch<T>::value, T>::type* = 0);
449 void append_dispatch(const std::vector<T> &src,
453 void append_dispatch(const std::vector<T> &src,
454 typename std::enable_if<
pod_dispatch<T>::value, T>::type* = 0);
457 void append_dispatch(const T *src,
size_t src_start,
size_t n_elem,
461 void append_dispatch(const T *src,
size_t src_start,
size_t n_elem,
462 typename std::enable_if<
pod_dispatch<T>::value, T>::type* = 0);