AXOM
Axom provides a robust, flexible software infrastructure for the development of multi-physics applications and computational tools.
axom::Array< T, DIM, SPACE > Class Template Reference

Provides a generic multidimensional array container. More...

#include </home/docs/checkouts/readthedocs.org/user_builds/axom/checkouts/v0.7.0/src/axom/core/Array.hpp>

Inheritance diagram for axom::Array< T, DIM, SPACE >:

Public Types

using value_type = T
 
using ArrayIterator = ArrayIteratorBase< Array< T, DIM, SPACE >, T >
 
using ConstArrayIterator = ArrayIteratorBase< const Array< T, DIM, SPACE >, const T >
 
using ArrayViewType = ArrayView< T, DIM, SPACE >
 
using ConstArrayViewType = ArrayView< const T, DIM, SPACE >
 
using RealConstT = typename std::conditional< is_array_view, T, const T >::type
 
using SliceType = typename std::conditional< DIM==IdxDim, T &, typename detail::SubsliceProxy< T, DIM - IdxDim, Array< T, DIM, SPACE > >::type >::type
 
using ConstSliceType = typename std::conditional< DIM==IdxDim, RealConstT &, typename detail::SubsliceProxy< T, DIM - IdxDim, const Array< T, DIM, SPACE > >::type >::type
 

Public Member Functions

virtual ~Array ()
 
template<typename... Args>
Array< T, DIM, SPACE >::ArrayIterator emplace (Array< T, DIM, SPACE >::ArrayIterator pos, Args &&... args)
 
template<typename T , int DIM>
 Array (Array< T, DIM > &&other)
 
template<typename T , int DIM>
Array< T, DIM > & operator= (Array< T, DIM > &&other)
 
AXOM_HOST_DEVICE SliceType< sizeof...(Args)> operator() (Args... args)
 Dimension-aware accessor; with N=DIM indices, returns a reference to the given value at that index. Otherwise, returns a sub-array pointed to by the given sub-index. More...
 
AXOM_HOST_DEVICE ConstSliceType< sizeof...(Args)> operator() (Args... args) const
 
AXOM_HOST_DEVICE SliceType< 1 > operator[] (const IndexType idx)
 Scalar accessor; returns a sub-array referenced by the given sub- index, beginning at array(idx, 0...) More...
 
AXOM_HOST_DEVICE ConstSliceType< 1 > operator[] (const IndexType idx) const
 
AXOM_HOST_DEVICE SliceType< UDim > operator[] (const StackArray< IndexType, UDim > &idx)
 Dimension-aware accessor; with UDim=DIM indices, returns a reference to the given value at that index. Otherwise, returns a sub-array pointed to by the given sub-index. More...
 
AXOM_HOST_DEVICE ConstSliceType< UDim > operator[] (const StackArray< IndexType, UDim > &idx) const
 
void swap (ArrayBase &other)
 Swaps two ArrayBases. More...
 
AXOM_HOST_DEVICE const StackArray< IndexType, DIM > & shape () const
 Returns the dimensions of the Array. More...
 
AXOM_HOST_DEVICE const StackArray< IndexType, DIM > & strides () const
 Returns the strides of the Array. More...
 
Native Storage Array Constructors
 Array ()
 Default constructor. Constructs an Array instance with no elements and default allocator ID. More...
 
template<IndexType SFINAE_DIM = DIM, MemorySpace SFINAE_SPACE = SPACE, typename std::enable_if< SFINAE_DIM==1 >::type * = nullptr>
 Array (IndexType num_elements, IndexType capacity=0, int allocator_id=axom::detail::getAllocatorID< SPACE >())
 Constructs a 1D Array instance with the given number of elements. More...
 
template<IndexType SFINAE_DIM = DIM, MemorySpace SFINAE_SPACE = SPACE, typename std::enable_if< SFINAE_DIM==1 >::type * = nullptr>
 Array (ArrayOptions::Uninitialized, IndexType num_elements, IndexType capacity=0, int allocator_id=axom::detail::getAllocatorID< SPACE >())
 
template<typename... Args, typename Enable = typename std::enable_if< sizeof...(Args) == DIM && detail::all_types_are_integral<Args...>::value>::type>
 Array (Args... args)
 Generic constructor for an Array of arbitrary dimension. More...
 
template<typename... Args, typename Enable = typename std::enable_if< sizeof...(Args) == DIM && detail::all_types_are_integral<Args...>::value>::type>
 Array (ArrayOptions::Uninitialized, Args... args)
 
template<int UDIM = DIM, typename Enable = typename std::enable_if<UDIM == 1>::type>
 Array (std::initializer_list< T > elems, int allocator_id=axom::detail::getAllocatorID< SPACE >())
 Initializer list constructor for a one-dimensional Array. More...
 
 Array (const Array &other)
 Copy constructor for an Array instance. More...
 
 Array (Array &&other)
 Move constructor for an Array instance. More...
 
template<typename OtherArrayType >
 Array (const ArrayBase< T, DIM, OtherArrayType > &other)
 Constructor for transferring between memory spaces. More...
 
template<typename OtherArrayType >
 Array (const ArrayBase< const T, DIM, OtherArrayType > &other)
 
template<typename OtherArrayType >
 Array (const ArrayBase< T, DIM, OtherArrayType > &other, int allocator_id)
 Constructor for transferring between memory spaces, with a user- specified allocator. More...
 
template<typename OtherArrayType >
 Array (const ArrayBase< const T, DIM, OtherArrayType > &other, int allocator_id)
 
Array copy and move operators
Arrayoperator= (const Array &other)
 Copy assignment operator for Array. More...
 
Arrayoperator= (Array &&other)
 Move assignment operator for Array. More...
 
template<int UDIM = DIM, typename Enable = typename std::enable_if<UDIM == 1>::type>
Arrayoperator= (std::initializer_list< T > elems)
 Initializer list assignment operator for Array. More...
 
Array element access operators
T * data ()
 Return a pointer to the array of data. More...
 
const T * data () const
 
Array methods to modify the data.
void fill (const T &value)
 Set all the values of the array. More...
 
void set (const T *elements, IndexType n, IndexType pos)
 Modify the values of existing elements. More...
 
void clear ()
 Clears the contents of the array. More...
 
void insert (IndexType pos, const T &value)
 Insert an element into the array at the given position. More...
 
ArrayIterator insert (ArrayIterator pos, const T &value)
 Insert an element into the array at the value before pos. More...
 
void insert (IndexType pos, IndexType n, const T *values)
 Insert elements into the array at the given position. More...
 
ArrayIterator insert (ArrayIterator pos, IndexType n, const T *values)
 Insert elements into the array at the value before pos. More...
 
void insert (IndexType pos, IndexType n, const T &value)
 Insert n copies of element into the array at the given position. More...
 
ArrayIterator insert (ArrayIterator pos, IndexType n, const T &value)
 Insert n copies of element into the array at the value before pos. More...
 
template<MemorySpace OtherSpace>
void insert (IndexType pos, ArrayView< const T, DIM, OtherSpace > other)
 Inserts an Array to the end of the calling object. More...
 
template<MemorySpace OtherSpace>
void insert (IndexType pos, ArrayView< T, DIM, OtherSpace > other)
 
template<MemorySpace OtherSpace>
void append (ArrayView< const T, DIM, OtherSpace > other)
 Appends an Array to the end of the calling object. More...
 
template<MemorySpace OtherSpace>
void append (ArrayView< T, DIM, OtherSpace > other)
 
ArrayIterator erase (ArrayIterator pos)
 Erases an element from the Array. More...
 
ArrayIterator erase (ArrayIterator first, ArrayIterator last)
 Erases elements in the range [first, last) from the Array. More...
 
template<typename... Args>
void emplace (IndexType pos, Args &&... args)
 Inserts new element into Array at the given position. More...
 
template<typename... Args>
ArrayIterator emplace (ArrayIterator pos, Args &&... args)
 Inserts new element into Array before pos. More...
 
void push_back (const T &value)
 Push a value to the back of the array. More...
 
void push_back (T &&value)
 Push a value to the back of the array. More...
 
template<typename... Args>
void emplace_back (Args &&... args)
 Inserts new element at the end of the Array. More...
 
Array methods to query and set attributes
IndexType capacity () const
 Return the number of elements allocated for the data array. More...
 
void reserve (IndexType capacity)
 Increase the capacity. Does nothing if the new capacity is less than the current capacity. More...
 
ArrayIterator begin ()
 Returns an ArrayIterator to the first element of the Array. More...
 
ConstArrayIterator begin () const
 
ArrayIterator end ()
 Returns an ArrayIterator to the element following the last element of the Array. More...
 
ConstArrayIterator end () const
 
void shrink ()
 Shrink the capacity to be equal to the size. More...
 
bool empty () const
 Returns true iff the Array stores no elements. More...
 
IndexType size () const
 Return the number of elements stored in the data array. More...
 
template<typename... Args>
void resize (Args... args)
 Update the number of elements stored in the data array. More...
 
template<typename... Args>
void resize (ArrayOptions::Uninitialized, Args... args)
 
void swap (Array< T, DIM, SPACE > &other)
 Exchanges the contents of this Array with the other. More...
 
double getResizeRatio () const
 Get the ratio by which the capacity increases upon dynamic resize. More...
 
void setResizeRatio (double ratio)
 Set the ratio by which the capacity increases upon dynamic resize. More...
 
int getAllocatorID () const
 Get the ID for the umpire allocator. More...
 
ArrayViewType view ()
 Returns a view of the array. More...
 
ConstArrayViewType view () const
 
AXOM_HOST_DEVICE T & flatIndex (const IndexType idx)
 Accessor, returns a reference to the given value. For multidimensional arrays, indexes into the (flat) raw data. More...
 
AXOM_HOST_DEVICE RealConstTflatIndex (const IndexType idx) const
 

Static Public Attributes

static constexpr double DEFAULT_RESIZE_RATIO = 2.0
 
static constexpr IndexType MIN_DEFAULT_CAPACITY = 32
 
static constexpr MemorySpace space = SPACE
 
static constexpr int Dims
 

Protected Member Functions

void initialize (IndexType num_elements, IndexType capacity, bool should_default_construct=true)
 Initialize an Array instance with the given number of elements. More...
 
void initialize_from_other (const T *data, IndexType num_elements, MemorySpace data_space, bool user_provided_allocator)
 Helper function for initializing an Array instance with an existing range of elements. More...
 
void resize (const StackArray< IndexType, DIM > &dims, bool default_construct)
 Updates the number of elements stored in the data array. More...
 
T * reserveForInsert (IndexType n, IndexType pos)
 Make space for a subsequent insertion into the array. More...
 
virtual void updateNumElements (IndexType new_num_elements)
 Update the number of elements. More...
 
virtual void setCapacity (IndexType new_capacity)
 Set the number of elements allocated for the data array. More...
 
virtual void dynamicRealloc (IndexType new_num_elements)
 Reallocates the data array when the size exceeds the capacity. More...
 
IndexType blockSize () const
 Returns the minimum "chunk size" that should be allocated For example, 2 would be the chunk size of a 2D array whose second dimension is of size 2. This is used when resizing/reallocating; it wouldn't make sense to have a capacity of 3 in the array described above. More...
 
AXOM_HOST_DEVICE void updateStrides ()
 Updates the internal striding information to a row-major format Intended to be called after m_dims is updated. In the future, this class will support different striding schemes (e.g., column-major) and/or user-provided striding. More...
 
void updateShapeOnInsert (const StackArray< IndexType, DIM > &range_shape)
 Updates the internal dimensions and striding based on the insertion of a range of elements. Intended to be called after the insertion of a multidimensional subslice. More...
 

Protected Attributes

T * m_data = nullptr
 
IndexType m_num_elements = 0
 The full number of elements in the array i.e., 3 for a 1D Array of size 3, 9 for a 3x3 2D array, etc. More...
 
IndexType m_capacity = 0
 
double m_resize_ratio = DEFAULT_RESIZE_RATIO
 
int m_allocator_id
 
StackArray< IndexType, DIM > m_dims
 The sizes (extents?) in each dimension. More...
 
StackArray< IndexType, DIM > m_strides
 The strides in each dimension. More...
 

Detailed Description

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
class axom::Array< T, DIM, SPACE >

Provides a generic multidimensional array container.

The Array class provides a generic multidimensional array container with dynamic reallocation and insertion. The dimensionality of the array must be known at compile time but the extents in each dimension are dynamic and can be changed at runtime. Array elements are stored contiguously.

Note
For a multi-component array container, where each element is a tuple of 1 or more components, Axom provides the MCArray alias, which corresponds to Array<T, 2>.

The Array class mirrors std::vector, with future support for GPUs in-development. The class's multidimensional array functionality roughly mirrors the multidimensional array support provided by numpy's ndarray.

See also
https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html

This class is meant to be a drop-in replacement for std::vector. However, it differs in its memory management and construction semantics. Specifically, we do not require axom::Array to initialize/construct its memory at allocation time and we use axom's memory_management and allocator ID abstractions rather than std::allocator.

Array always retains exclusive ownership of its data and is responsible for freeing its memory.

See also
ArrayView for non-owning views of one- or multi-dimensional data Depending on which constructor is used, the Array object can have two different underlying storage types:
Template Parameters
Tthe type of the values to hold.
DIMThe dimension of the array.
Precondition
T must be CopyAssignable and Erasable
See also
https://en.cppreference.com/w/cpp/named_req
Precondition
When Array is allocated on the device, T must be relocatable, i.e. moving the object to a new index and destroying the original should be equivalent to a memcpy.
See also
https://github.com/facebook/folly/blob/main/folly/docs/FBVector.md#object-relocation

Member Typedef Documentation

◆ value_type

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
using axom::Array< T, DIM, SPACE >::value_type = T

◆ ArrayIterator

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
using axom::Array< T, DIM, SPACE >::ArrayIterator = ArrayIteratorBase<Array<T, DIM, SPACE>, T>

◆ ConstArrayIterator

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
using axom::Array< T, DIM, SPACE >::ConstArrayIterator = ArrayIteratorBase<const Array<T, DIM, SPACE>, const T>

◆ ArrayViewType

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
using axom::Array< T, DIM, SPACE >::ArrayViewType = ArrayView<T, DIM, SPACE>

◆ ConstArrayViewType

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
using axom::Array< T, DIM, SPACE >::ConstArrayViewType = ArrayView<const T, DIM, SPACE>

◆ RealConstT

using axom::ArrayBase< T, DIM, Array< T, DIM, SPACE > >::RealConstT = typename std::conditional<is_array_view, T, const T>::type
inherited

◆ SliceType

using axom::ArrayBase< T, DIM, Array< T, DIM, SPACE > >::SliceType = typename std::conditional< DIM == IdxDim, T&, typename detail::SubsliceProxy<T, DIM - IdxDim, Array< T, DIM, SPACE > >::type>::type
inherited

◆ ConstSliceType

using axom::ArrayBase< T, DIM, Array< T, DIM, SPACE > >::ConstSliceType = typename std::conditional< DIM == IdxDim, RealConstT&, typename detail::SubsliceProxy<T, DIM - IdxDim, const Array< T, DIM, SPACE > >::type>::type
inherited

Constructor & Destructor Documentation

◆ Array() [1/13]

template<typename T , int DIM, MemorySpace SPACE>
axom::Array< T, DIM, SPACE >::Array ( )

Default constructor. Constructs an Array instance with no elements and default allocator ID.

◆ Array() [2/13]

template<typename T , int DIM, MemorySpace SPACE>
template<IndexType SFINAE_DIM, MemorySpace SFINAE_SPACE, typename std::enable_if< SFINAE_DIM==1 >::type * >
axom::Array< T, DIM, SPACE >::Array ( IndexType  num_elements,
IndexType  capacity = 0,
int  allocator_id = axom::detail::getAllocatorID<SPACE>() 
)

Constructs a 1D Array instance with the given number of elements.

Parameters
[in]num_elementsthe number of elements the Array holds.
[in]capacitythe number of elements to allocate space for.
[in]allocator_idthe ID of the allocator to use (optional)
Note
If no capacity or capacity less than num_elements is specified then it will default to at least num_elements * DEFAULT_RESIZE_RATIO.
a capacity is specified for the number of elements to store in the array and does not correspond to the actual bytesize.
The option to select a capacity is only available for 1-dimensional Arrays
Some overloads have an ArrayOptions::Uninitialized first parameter. These are intended for cases where the array data should not be initialized when memory is allocated, e.g. if the code is known to initialize the data
Precondition
num_elements >= 0
Postcondition
capacity() >= size()
size() == num_elements
getResizeRatio() == DEFAULT_RESIZE_RATIO

◆ Array() [3/13]

template<typename T , int DIM, MemorySpace SPACE>
template<IndexType SFINAE_DIM, MemorySpace SFINAE_SPACE, typename std::enable_if< SFINAE_DIM==1 >::type * >
axom::Array< T, DIM, SPACE >::Array ( ArrayOptions::Uninitialized  ,
IndexType  num_elements,
IndexType  capacity = 0,
int  allocator_id = axom::detail::getAllocatorID<SPACE>() 
)

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

◆ Array() [4/13]

template<typename T , int DIM, MemorySpace SPACE>
template<typename... Args, typename Enable >
axom::Array< T, DIM, SPACE >::Array ( Args...  args)

Generic constructor for an Array of arbitrary dimension.

Parameters
[in]argsThe parameter pack containing the "shape" of the Array
See also
https://numpy.org/doc/stable/reference/generated/numpy.empty.html#numpy.empty
Precondition
sizeof...(Args) == DIM
Postcondition
capacity() >= size()
size() == num_elements
getResizeRatio() == DEFAULT_RESIZE_RATIO

◆ Array() [5/13]

template<typename T , int DIM, MemorySpace SPACE>
template<typename... Args, typename Enable >
axom::Array< T, DIM, SPACE >::Array ( ArrayOptions::Uninitialized  ,
Args...  args 
)

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

◆ Array() [6/13]

template<typename T, int DIM, MemorySpace SPACE>
template<int UDIM, typename Enable >
axom::Array< T, DIM, SPACE >::Array ( std::initializer_list< T >  elems,
int  allocator_id = axom::detail::getAllocatorID<SPACE>() 
)

Initializer list constructor for a one-dimensional Array.

Parameters
[in]elemsThe elements to initialize the array with
[in]allocator_idthe ID of the allocator to use (optional)

◆ Array() [7/13]

template<typename T , int DIM, MemorySpace SPACE>
axom::Array< T, DIM, SPACE >::Array ( const Array< T, DIM, SPACE > &  other)

Copy constructor for an Array instance.

◆ Array() [8/13]

template<typename T , int DIM, MemorySpace SPACE>
axom::Array< T, DIM, SPACE >::Array ( Array< T, DIM, SPACE > &&  other)

Move constructor for an Array instance.

◆ Array() [9/13]

template<typename T, int DIM, MemorySpace SPACE>
template<typename OtherArrayType>
axom::Array< T, DIM, SPACE >::Array ( const ArrayBase< T, DIM, OtherArrayType > &  other)

Constructor for transferring between memory spaces.

Parameters
[in]otherThe array in a different memory space to copy from
Note
The new Array will be constructed with the allocator ID of the copied-from array, if compatible with the memory space of the target array. Otherwise, the new Array will be constructed with the default allocator for the memory space.

An Array specified with the default Dynamic memory space will always propagate the allocator ID from the source array.

◆ Array() [10/13]

template<typename T, int DIM, MemorySpace SPACE>
template<typename OtherArrayType>
axom::Array< T, DIM, SPACE >::Array ( const ArrayBase< const T, DIM, OtherArrayType > &  other)

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

◆ Array() [11/13]

template<typename T, int DIM, MemorySpace SPACE>
template<typename OtherArrayType>
axom::Array< T, DIM, SPACE >::Array ( const ArrayBase< T, DIM, OtherArrayType > &  other,
int  allocator_id 
)

Constructor for transferring between memory spaces, with a user- specified allocator.

Parameters
[in]otherThe array in a different memory space to copy from
[in]allocator_idthe ID of the allocator to use
Note
The specified allocator ID must be compatible with the memory space of the new Array.

◆ Array() [12/13]

template<typename T, int DIM, MemorySpace SPACE>
template<typename OtherArrayType>
axom::Array< T, DIM, SPACE >::Array ( const ArrayBase< const T, DIM, OtherArrayType > &  other,
int  allocator_id 
)

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

◆ ~Array()

template<typename T , int DIM, MemorySpace SPACE>
axom::Array< T, DIM, SPACE >::~Array ( )
virtual

Destructor. Frees the associated buffer.

Reimplemented in axom::sidre::Array< T, DIM >.

◆ Array() [13/13]

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
template<typename T , int DIM>
axom::Array< T, DIM, SPACE >::Array ( Array< T, DIM > &&  other)

Member Function Documentation

◆ operator=() [1/4]

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
Array& axom::Array< T, DIM, SPACE >::operator= ( const Array< T, DIM, SPACE > &  other)
inline

Copy assignment operator for Array.

Precondition
T must be TriviallyCopyable

◆ operator=() [2/4]

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
Array& axom::Array< T, DIM, SPACE >::operator= ( Array< T, DIM, SPACE > &&  other)
inline

Move assignment operator for Array.

◆ operator=() [3/4]

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
template<int UDIM = DIM, typename Enable = typename std::enable_if<UDIM == 1>::type>
Array& axom::Array< T, DIM, SPACE >::operator= ( std::initializer_list< T >  elems)
inline

Initializer list assignment operator for Array.

Parameters
[in]elemsthe elements to set the array to.

◆ data() [1/2]

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
T* axom::Array< T, DIM, SPACE >::data ( )
inline

Return a pointer to the array of data.

◆ data() [2/2]

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
const T* axom::Array< T, DIM, SPACE >::data ( ) const
inline

◆ fill()

template<typename T, int DIM, MemorySpace SPACE>
void axom::Array< T, DIM, SPACE >::fill ( const T &  value)
inline

Set all the values of the array.

Parameters
[in]valuethe value to set to.

◆ set()

template<typename T, int DIM, MemorySpace SPACE>
void axom::Array< T, DIM, SPACE >::set ( const T *  elements,
IndexType  n,
IndexType  pos 
)
inline

Modify the values of existing elements.

Parameters
[in]elementsthe new elements to write.
[in]nthe number of elements to write.
[in]posthe position at which to begin writing.
Note
It's assumed that elements is of length n.
The size is unchanged by calls to set.
Precondition
pos + n <= m_num_elements.

◆ clear()

template<typename T , int DIM, MemorySpace SPACE>
void axom::Array< T, DIM, SPACE >::clear ( )
inline

Clears the contents of the array.

Postcondition
size of Array is 0
capacity is unchanged

◆ insert() [1/8]

template<typename T, int DIM, MemorySpace SPACE>
void axom::Array< T, DIM, SPACE >::insert ( IndexType  pos,
const T &  value 
)
inline

Insert an element into the array at the given position.

Parameters
[in]posthe position at which to insert.
[in]valuethe element value to insert.
Note
Reallocation is done if the new size will exceed the capacity.
The size increases by 1.

◆ insert() [2/8]

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
ArrayIterator axom::Array< T, DIM, SPACE >::insert ( ArrayIterator  pos,
const T &  value 
)

Insert an element into the array at the value before pos.

Parameters
[in]posthe ArrayIterator before which value will be inserted.
[in]valuethe element value to insert.
Note
Reallocation is done if the new size will exceed the capacity.
The size increases by 1.
Returns
ArrayIterator to inserted value

◆ insert() [3/8]

template<typename T, int DIM, MemorySpace SPACE>
void axom::Array< T, DIM, SPACE >::insert ( IndexType  pos,
IndexType  n,
const T *  values 
)
inline

Insert elements into the array at the given position.

Parameters
[in]posthe position at which to begin the insertion.
[in]nthe number of elements to insert.
[in]valuesthe element values to insert.
Note
It's assumed that elements is of length n.
Reallocation is done if the new size will exceed the capacity.
The size increases by n.
Precondition
pos <= m_num_elements.

◆ insert() [4/8]

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
ArrayIterator axom::Array< T, DIM, SPACE >::insert ( ArrayIterator  pos,
IndexType  n,
const T *  values 
)

Insert elements into the array at the value before pos.

Parameters
[in]posthe ArrayIterator before which value will be inserted.
[in]nthe number of elements to insert.
[in]valuesthe element values to insert.
Note
It's assumed that elements is of length n.
Reallocation is done if the new size will exceed the capacity.
The size increases by n.
Precondition
pos <= end()
Returns
ArrayIterator to first element inserted (pos if n == 0)

◆ insert() [5/8]

template<typename T, int DIM, MemorySpace SPACE>
void axom::Array< T, DIM, SPACE >::insert ( IndexType  pos,
IndexType  n,
const T &  value 
)
inline

Insert n copies of element into the array at the given position.

Parameters
[in]posthe position at which to begin the insertion.
[in]nthe number of elements to insert.
[in]valuethe element value to insert.
Note
Reallocation is done if the new size will exceed the capacity.
The size increases by n.
This method is used to create space for elements in the middle of the array.
Precondition
pos <= m_num_elements.

◆ insert() [6/8]

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
ArrayIterator axom::Array< T, DIM, SPACE >::insert ( ArrayIterator  pos,
IndexType  n,
const T &  value 
)

Insert n copies of element into the array at the value before pos.

Parameters
[in]posthe ArrayIterator before which value will be inserted.
[in]nthe number of elements to insert.
[in]valuethe element value to insert.
Note
Reallocation is done if the new size will exceed the capacity.
The size increases by n.
This method is used to create space for elements in the middle of the array.
Precondition
pos <= end()
Returns
ArrayIterator to first element inserted (pos if n == 0)

◆ insert() [7/8]

template<typename T, int DIM, MemorySpace SPACE>
template<MemorySpace OtherSpace>
void axom::Array< T, DIM, SPACE >::insert ( IndexType  pos,
ArrayView< const T, DIM, OtherSpace >  other 
)
inline

Inserts an Array to the end of the calling object.

Parameters
[in]otherThe Array to append
Precondition
The shapes of the calling Array and other are the same (excluding the leading dimension), i.e., shape()[1:] == other.shape()[1:]
Note
Reallocation is done if the new size will exceed the capacity.

◆ insert() [8/8]

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
template<MemorySpace OtherSpace>
void axom::Array< T, DIM, SPACE >::insert ( IndexType  pos,
ArrayView< T, DIM, OtherSpace >  other 
)
inline

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

◆ append() [1/2]

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
template<MemorySpace OtherSpace>
void axom::Array< T, DIM, SPACE >::append ( ArrayView< const T, DIM, OtherSpace >  other)
inline

Appends an Array to the end of the calling object.

Parameters
[in]otherThe Array to append
Template Parameters
OtherArrayTypeThe underlying type of the other array
Note
Reallocation is done if the new size will exceed the capacity.

◆ append() [2/2]

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
template<MemorySpace OtherSpace>
void axom::Array< T, DIM, SPACE >::append ( ArrayView< T, DIM, OtherSpace >  other)
inline

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

◆ erase() [1/2]

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
ArrayIterator axom::Array< T, DIM, SPACE >::erase ( ArrayIterator  pos)

Erases an element from the Array.

Parameters
[in]posthe ArrayIterator to the element in the Array
Returns
An ArrayIterator following the last element removed.

◆ erase() [2/2]

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
ArrayIterator axom::Array< T, DIM, SPACE >::erase ( ArrayIterator  first,
ArrayIterator  last 
)

Erases elements in the range [first, last) from the Array.

Parameters
[in]firstthe ArrayIterator to the beginning of the range.
[in]lastthe ArrayIterator to end of range.
Returns
An ArrayIterator following the last element removed.

◆ emplace() [1/3]

template<typename T , int DIM, MemorySpace SPACE>
template<typename... Args>
void axom::Array< T, DIM, SPACE >::emplace ( IndexType  pos,
Args &&...  args 
)
inline

Inserts new element into Array at the given position.

Parameters
[in]posthe position to insert element at.
[in]argsthe arguments to forward to constructor of the element.
Note
Reallocation is done if the new size will exceed the capacity.
The size increases by 1.
Precondition
T must be MoveAssignable

◆ emplace() [2/3]

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
template<typename... Args>
ArrayIterator axom::Array< T, DIM, SPACE >::emplace ( ArrayIterator  pos,
Args &&...  args 
)

Inserts new element into Array before pos.

Parameters
[in]posthe ArrayIterator to insert element before.
[in]argsthe arguments to forward to constructor of the element.
Note
Reallocation is done if the new size will exceed the capacity.
The size increases by 1.
Precondition
T must be MoveAssignable
Returns
An ArrayIterator to the emplaced element.

◆ push_back() [1/2]

template<typename T, int DIM, MemorySpace SPACE>
void axom::Array< T, DIM, SPACE >::push_back ( const T &  value)
inline

Push a value to the back of the array.

Parameters
[in]valuethe value to be added to the back.
Note
Reallocation is done if the new size will exceed the capacity.
Precondition
DIM == 1

◆ push_back() [2/2]

template<typename T, int DIM, MemorySpace SPACE>
void axom::Array< T, DIM, SPACE >::push_back ( T &&  value)
inline

Push a value to the back of the array.

Parameters
[in]valuethe value to move to the back.
Note
Reallocation is done if the new size will exceed the capacity.
Precondition
DIM == 1

◆ emplace_back()

template<typename T , int DIM, MemorySpace SPACE>
template<typename... Args>
void axom::Array< T, DIM, SPACE >::emplace_back ( Args &&...  args)
inline

Inserts new element at the end of the Array.

Parameters
[in]argsthe arguments to forward to constructor of the element.
Note
Reallocation is done if the new size will exceed the capacity.
The size increases by 1.
Precondition
DIM == 1

◆ capacity()

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
IndexType axom::Array< T, DIM, SPACE >::capacity ( ) const
inline

Return the number of elements allocated for the data array.

◆ reserve()

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
void axom::Array< T, DIM, SPACE >::reserve ( IndexType  capacity)
inline

Increase the capacity. Does nothing if the new capacity is less than the current capacity.

Parameters
[in]capacitythe new number of elements to allocate.

◆ begin() [1/2]

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
ArrayIterator axom::Array< T, DIM, SPACE >::begin ( )
inline

Returns an ArrayIterator to the first element of the Array.

◆ begin() [2/2]

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
ConstArrayIterator axom::Array< T, DIM, SPACE >::begin ( ) const
inline

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

◆ end() [1/2]

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
ArrayIterator axom::Array< T, DIM, SPACE >::end ( )
inline

Returns an ArrayIterator to the element following the last element of the Array.

◆ end() [2/2]

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
ConstArrayIterator axom::Array< T, DIM, SPACE >::end ( ) const
inline

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

◆ shrink()

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
void axom::Array< T, DIM, SPACE >::shrink ( )
inline

Shrink the capacity to be equal to the size.

◆ empty()

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
bool axom::Array< T, DIM, SPACE >::empty ( ) const
inline

Returns true iff the Array stores no elements.

Note
If the Array is empty the capacity can still be greater than zero.

◆ size()

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
IndexType axom::Array< T, DIM, SPACE >::size ( ) const
inline

Return the number of elements stored in the data array.

◆ resize() [1/3]

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
template<typename... Args>
void axom::Array< T, DIM, SPACE >::resize ( Args...  args)
inline

Update the number of elements stored in the data array.

Note
Reallocation is done if the new size will exceed the capacity.

◆ resize() [2/3]

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
template<typename... Args>
void axom::Array< T, DIM, SPACE >::resize ( ArrayOptions::Uninitialized  ,
Args...  args 
)
inline

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

◆ swap() [1/2]

template<typename T, int DIM, MemorySpace SPACE>
void axom::Array< T, DIM, SPACE >::swap ( Array< T, DIM, SPACE > &  other)
inline

Exchanges the contents of this Array with the other.

◆ getResizeRatio()

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
double axom::Array< T, DIM, SPACE >::getResizeRatio ( ) const
inline

Get the ratio by which the capacity increases upon dynamic resize.

◆ setResizeRatio()

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
void axom::Array< T, DIM, SPACE >::setResizeRatio ( double  ratio)
inline

Set the ratio by which the capacity increases upon dynamic resize.

Parameters
[in]ratiothe new resize ratio.

◆ getAllocatorID()

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
int axom::Array< T, DIM, SPACE >::getAllocatorID ( ) const
inline

Get the ID for the umpire allocator.

◆ view() [1/2]

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
ArrayViewType axom::Array< T, DIM, SPACE >::view ( )
inline

Returns a view of the array.

See also
ArrayView

◆ view() [2/2]

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
ConstArrayViewType axom::Array< T, DIM, SPACE >::view ( ) const
inline

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

◆ initialize()

template<typename T , int DIM, MemorySpace SPACE>
void axom::Array< T, DIM, SPACE >::initialize ( IndexType  num_elements,
IndexType  capacity,
bool  should_default_construct = true 
)
inlineprotected

Initialize an Array instance with the given number of elements.

Parameters
[in]num_elementsthe number of elements the Array holds.
[in]capacitythe number of elements to allocate space for.
[in]should_default_constructwhether to create default-constructed objects in the region [0, num_elements). Defaults to true.
Note
If no capacity or capacity less than num_elements is specified then it will default to at least num_elements * DEFAULT_RESIZE_RATIO.
a capacity is specified for the number of elements to store in the array and does not correspond to the actual bytesize.
Precondition
num_elements >= 0
Postcondition
capacity() >= size()
size() == num_elements
getResizeRatio() == DEFAULT_RESIZE_RATIO

◆ initialize_from_other()

template<typename T, int DIM, MemorySpace SPACE>
void axom::Array< T, DIM, SPACE >::initialize_from_other ( const T *  data,
IndexType  num_elements,
MemorySpace  data_space,
bool  user_provided_allocator 
)
inlineprotected

Helper function for initializing an Array instance with an existing range of elements.

Parameters
[in]datapointer to the existing array of elements
[in]num_elementsthe number of elements in the existing array
[in]data_spacethe memory space in which data has been allocated
[in]user_provided_allocatortrue if the Array's allocator ID was provided by the user

◆ resize() [3/3]

template<typename T , int DIM, MemorySpace SPACE>
void axom::Array< T, DIM, SPACE >::resize ( const StackArray< IndexType, DIM > &  dims,
bool  default_construct 
)
inlineprotected

Updates the number of elements stored in the data array.

Parameters
[in]dimsthe number of elements to allocate in each dimension
[in]default_constructif true, default-constructs any new elements in the array

◆ reserveForInsert()

template<typename T , int DIM, MemorySpace SPACE>
T * axom::Array< T, DIM, SPACE >::reserveForInsert ( IndexType  n,
IndexType  pos 
)
inlineprotected

Make space for a subsequent insertion into the array.

Parameters
[in]nthe number of elements to insert.
[in]posthe position at which to begin the insertion.
Returns
a pointer to the beginning of the insertion space.
Note
Reallocation is done if the new size will exceed the capacity.

◆ updateNumElements()

template<typename T , int DIM, MemorySpace SPACE>
void axom::Array< T, DIM, SPACE >::updateNumElements ( IndexType  new_num_elements)
inlineprotectedvirtual

Update the number of elements.

Parameters
[in]new_num_elementsthe new number of elements.

Reimplemented in axom::sidre::Array< T, DIM >.

◆ setCapacity()

template<typename T , int DIM, MemorySpace SPACE>
void axom::Array< T, DIM, SPACE >::setCapacity ( IndexType  new_capacity)
inlineprotectedvirtual

Set the number of elements allocated for the data array.

Parameters
[in]capacitythe new number of elements to allocate.

Reimplemented in axom::sidre::Array< T, DIM >, and axom::mint::ExternalArray< T, DIM >.

◆ dynamicRealloc()

template<typename T , int DIM, MemorySpace SPACE>
void axom::Array< T, DIM, SPACE >::dynamicRealloc ( IndexType  new_num_elements)
inlineprotectedvirtual

Reallocates the data array when the size exceeds the capacity.

Parameters
[in]new_num_elementsthe number of elements which exceeds the current capacity.

Reimplemented in axom::sidre::Array< T, DIM >, and axom::mint::ExternalArray< T, DIM >.

◆ emplace() [3/3]

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
template<typename... Args>
Array<T, DIM, SPACE>::ArrayIterator axom::Array< T, DIM, SPACE >::emplace ( Array< T, DIM, SPACE >::ArrayIterator  pos,
Args &&...  args 
)
inline

◆ operator=() [4/4]

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
template<typename T , int DIM>
Array<T, DIM>& axom::Array< T, DIM, SPACE >::operator= ( Array< T, DIM > &&  other)

◆ operator()() [1/2]

AXOM_HOST_DEVICE SliceType<sizeof...(Args)> axom::ArrayBase< T, DIM, Array< T, DIM, SPACE > >::operator() ( Args...  args)
inlineinherited

Dimension-aware accessor; with N=DIM indices, returns a reference to the given value at that index. Otherwise, returns a sub-array pointed to by the given sub-index.

Parameters
[in]argsthe parameter pack of indices in each dimension.
Note
equivalent to *(array.data() + idx).
Precondition
sizeof...(Args) <= DIM
0 <= args[i] < m_dims[i] for i in [0, sizeof...(Args))

◆ operator()() [2/2]

AXOM_HOST_DEVICE ConstSliceType<sizeof...(Args)> axom::ArrayBase< T, DIM, Array< T, DIM, SPACE > >::operator() ( Args...  args) const
inlineinherited

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

◆ operator[]() [1/4]

AXOM_HOST_DEVICE SliceType<1> axom::ArrayBase< T, DIM, Array< T, DIM, SPACE > >::operator[] ( const IndexType  idx)
inlineinherited

Scalar accessor; returns a sub-array referenced by the given sub- index, beginning at array(idx, 0...)

Parameters
[in]idxthe index of the first dimension.
Precondition
0 <= idx < m_dims[0]

◆ operator[]() [2/4]

AXOM_HOST_DEVICE ConstSliceType<1> axom::ArrayBase< T, DIM, Array< T, DIM, SPACE > >::operator[] ( const IndexType  idx) const
inlineinherited

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

◆ operator[]() [3/4]

AXOM_HOST_DEVICE SliceType<UDim> axom::ArrayBase< T, DIM, Array< T, DIM, SPACE > >::operator[] ( const StackArray< IndexType, UDim > &  idx)
inlineinherited

Dimension-aware accessor; with UDim=DIM indices, returns a reference to the given value at that index. Otherwise, returns a sub-array pointed to by the given sub-index.

Parameters
[in]argsa stack array of indices in each dimension.
Note
equivalent to *(array.data() + idx).
Precondition
UDim <= DIM
0 <= args[i] < m_dims[i] for i in [0, UDim)

◆ operator[]() [4/4]

AXOM_HOST_DEVICE ConstSliceType<UDim> axom::ArrayBase< T, DIM, Array< T, DIM, SPACE > >::operator[] ( const StackArray< IndexType, UDim > &  idx) const
inlineinherited

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

◆ flatIndex() [1/2]

AXOM_HOST_DEVICE T& axom::ArrayBase< T, DIM, Array< T, DIM, SPACE > >::flatIndex ( const IndexType  idx)
inlineinherited

Accessor, returns a reference to the given value. For multidimensional arrays, indexes into the (flat) raw data.

Parameters
[in]idxthe position of the value to return.
Note
equivalent to *(array.data() + idx).
Precondition
0 <= idx < m_num_elements

◆ flatIndex() [2/2]

AXOM_HOST_DEVICE RealConstT& axom::ArrayBase< T, DIM, Array< T, DIM, SPACE > >::flatIndex ( const IndexType  idx) const
inlineinherited

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

◆ swap() [2/2]

void axom::ArrayBase< T, DIM, Array< T, DIM, SPACE > >::swap ( ArrayBase< T, DIM, Array< T, DIM, SPACE > > &  other)
inlineinherited

Swaps two ArrayBases.

◆ shape()

AXOM_HOST_DEVICE const StackArray<IndexType, DIM>& axom::ArrayBase< T, DIM, Array< T, DIM, SPACE > >::shape ( ) const
inlineinherited

Returns the dimensions of the Array.

◆ strides()

AXOM_HOST_DEVICE const StackArray<IndexType, DIM>& axom::ArrayBase< T, DIM, Array< T, DIM, SPACE > >::strides ( ) const
inlineinherited

Returns the strides of the Array.

◆ blockSize()

IndexType axom::ArrayBase< T, DIM, Array< T, DIM, SPACE > >::blockSize ( ) const
inlineprotectedinherited

Returns the minimum "chunk size" that should be allocated For example, 2 would be the chunk size of a 2D array whose second dimension is of size 2. This is used when resizing/reallocating; it wouldn't make sense to have a capacity of 3 in the array described above.

◆ updateStrides()

AXOM_HOST_DEVICE void axom::ArrayBase< T, DIM, Array< T, DIM, SPACE > >::updateStrides ( )
inlineprotectedinherited

Updates the internal striding information to a row-major format Intended to be called after m_dims is updated. In the future, this class will support different striding schemes (e.g., column-major) and/or user-provided striding.

◆ updateShapeOnInsert()

void axom::ArrayBase< T, DIM, Array< T, DIM, SPACE > >::updateShapeOnInsert ( const StackArray< IndexType, DIM > &  range_shape)
inlineprotectedinherited

Updates the internal dimensions and striding based on the insertion of a range of elements. Intended to be called after the insertion of a multidimensional subslice.

Member Data Documentation

◆ DEFAULT_RESIZE_RATIO

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
constexpr double axom::Array< T, DIM, SPACE >::DEFAULT_RESIZE_RATIO = 2.0
static

◆ MIN_DEFAULT_CAPACITY

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
constexpr IndexType axom::Array< T, DIM, SPACE >::MIN_DEFAULT_CAPACITY = 32
static

◆ space

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
constexpr MemorySpace axom::Array< T, DIM, SPACE >::space = SPACE
static

◆ m_data

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
T* axom::Array< T, DIM, SPACE >::m_data = nullptr
protected

◆ m_num_elements

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
IndexType axom::Array< T, DIM, SPACE >::m_num_elements = 0
protected

The full number of elements in the array i.e., 3 for a 1D Array of size 3, 9 for a 3x3 2D array, etc.

◆ m_capacity

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
IndexType axom::Array< T, DIM, SPACE >::m_capacity = 0
protected

◆ m_resize_ratio

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
double axom::Array< T, DIM, SPACE >::m_resize_ratio = DEFAULT_RESIZE_RATIO
protected

◆ m_allocator_id

template<typename T, int DIM = 1, MemorySpace SPACE = MemorySpace::Dynamic>
int axom::Array< T, DIM, SPACE >::m_allocator_id
protected

◆ Dims

constexpr int axom::ArrayBase< T, DIM, Array< T, DIM, SPACE > >::Dims
staticinherited

◆ m_dims

StackArray<IndexType, DIM> axom::ArrayBase< T, DIM, Array< T, DIM, SPACE > >::m_dims
protectedinherited

The sizes (extents?) in each dimension.

◆ m_strides

StackArray<IndexType, DIM> axom::ArrayBase< T, DIM, Array< T, DIM, SPACE > >::m_strides
protectedinherited

The strides in each dimension.


The documentation for this class was generated from the following file: