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);
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;
376 virtual
int host_accessible() const noexcept = 0;
379 virtual
int cuda_accessible() const noexcept = 0;
382 virtual
void synchronize() const = 0;
386 void get_dispatch(
unsigned long i, T &val,
387 typename std::enable_if<
object_dispatch<T>::value, T>::type* = 0) const;
390 void get_dispatch(
unsigned long i, T &val,
391 typename std::enable_if<
pod_dispatch<T>::value, T>::type* = 0) const;
394 void get_dispatch(std::vector<T> &vals,
395 typename std::enable_if<
object_dispatch<T>::value, T>::type* = 0) const;
398 void get_dispatch(std::vector<T> &vals,
399 typename std::enable_if<
pod_dispatch<T>::value, T>::type* = 0) const;
402 void get_dispatch(
size_t src_start, T *dest,
size_t dest_start,
size_t n_elem,
403 typename std::enable_if<
object_dispatch<T>::value, T>::type* = 0) const;
406 void get_dispatch(
size_t src_start, T *dest,
size_t dest_start,
size_t n_elem,
407 typename std::enable_if<
pod_dispatch<T>::value, T>::type* = 0) const;
410 void set_dispatch(
unsigned long i, const T &val,
414 void set_dispatch(
unsigned long i, const T &val,
415 typename std::enable_if<
pod_dispatch<T>::value, T>::type* = 0);
418 void set_dispatch(const std::vector<T> &src,
422 void set_dispatch(const std::vector<T> &src,
423 typename std::enable_if<
pod_dispatch<T>::value, T>::type* = 0);
426 void set_dispatch(
size_t dest_start, const T *src,
size_t src_start,
size_t n_elem,
430 void set_dispatch(
size_t dest_start, const T *src,
size_t src_start,
size_t n_elem,
431 typename std::enable_if<
pod_dispatch<T>::value, T>::type* = 0);
434 void assign_dispatch(const std::vector<T> &src,
438 void assign_dispatch(const std::vector<T> &src,
439 typename std::enable_if<
pod_dispatch<T>::value, T>::type* = 0);
442 void assign_dispatch(const T *src,
size_t src_start,
size_t n_elem,
446 void assign_dispatch(const T *src,
size_t src_start,
size_t n_elem,
447 typename std::enable_if<
pod_dispatch<T>::value, T>::type* = 0);
450 void append_dispatch(const T &val,
454 void append_dispatch(const T &val,
455 typename std::enable_if<
pod_dispatch<T>::value, T>::type* = 0);
458 void append_dispatch(const std::vector<T> &src,
462 void append_dispatch(const std::vector<T> &src,
463 typename std::enable_if<
pod_dispatch<T>::value, T>::type* = 0);
466 void append_dispatch(const T *src,
size_t src_start,
size_t n_elem,
470 void append_dispatch(const T *src,
size_t src_start,
size_t n_elem,
471 typename std::enable_if<
pod_dispatch<T>::value, T>::type* = 0);
Serialize objects into a binary stream.
Definition: teca_binary_stream.h:17
A type erasure for array based data.
Definition: teca_variant_array.h:43
virtual p_teca_variant_array new_instance(allocator alloc) const =0
virtual void get(size_t src_start, const p_teca_variant_array &dest, size_t dest_start, size_t n_elem) const =0
p_teca_variant_array new_copy(size_t src_start, size_t n_elem) const
Definition: teca_variant_array.h:122
virtual int set_allocator(allocator alloc)=0
virtual void append(const p_teca_variant_array &src, size_t src_start, size_t n_elem)
append a subset of the passed array
Definition: teca_variant_array.h:314
virtual void set(const const_p_teca_variant_array &src)=0
virtual void set(const p_teca_variant_array &src)
Set from the other array.
Definition: teca_variant_array.h:191
virtual void assign(const p_teca_variant_array &src)
assign the contents from the other array.
Definition: teca_variant_array.h:246
p_teca_variant_array new_instance(size_t n) const
Definition: teca_variant_array.h:72
virtual void set(size_t dest_start, const const_p_teca_variant_array &src, size_t src_start, size_t n_elem)=0
virtual void copy(const const_p_teca_variant_array &src)
copy the contents from the other array.
Definition: teca_variant_array.h:273
void copy(const const_p_teca_variant_array &src, size_t src_start, size_t n_elem)
copy a subset of the other array
Definition: teca_variant_array.h:286
virtual void append(const const_p_teca_variant_array &src, size_t src_start, size_t n_elem)=0
append a subset of the passed array
virtual p_teca_variant_array new_instance(size_t n, allocator alloc) const =0
virtual p_teca_variant_array new_copy(size_t src_start, size_t n_elem, allocator alloc) const =0
virtual void assign(const const_p_teca_variant_array &src, size_t src_start, size_t n_elem)=0
assign a subset of the other array
virtual unsigned long size() const noexcept=0
get the number of elements in the array
virtual void assign(const p_teca_variant_array &src, size_t src_start, size_t n_elem)
assign a subset of the other array
Definition: teca_variant_array.h:257
virtual void initialize()=0
initialize the elements using the default constructor
virtual void assign(const const_p_teca_variant_array &src)=0
virtual void set(size_t dest_start, const p_teca_variant_array &src, size_t src_start, size_t n_elem)
Definition: teca_variant_array.h:216
virtual void append(const const_p_teca_variant_array &src)=0
virtual void append(const p_teca_variant_array &src)
append the passed array.
Definition: teca_variant_array.h:303
virtual void get(const p_teca_variant_array &dest) const =0
hamr::buffer_allocator allocator
allocator types
Definition: teca_variant_array.h:46
virtual void copy(const p_teca_variant_array &src)
copy the contents from the other array.
Definition: teca_variant_array.h:279
virtual std::string get_class_name() const =0
return the name of the class in a human readable form
virtual p_teca_variant_array new_copy(allocator alloc) const =0
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 copy(teca_variant_array *varr, PyObject *obj)
Copy values from the object into variant array.
Definition: teca_py_array.h:290
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
Definition: teca_variant_array.h:25
Definition: teca_variant_array.h:24
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