31#include <boost/serialization/access.hpp>
45template <
typename T, std::
size_t N>
struct Storage {
49 friend boost::serialization::access;
50 template <
typename Archive>
56template <
typename T>
struct Storage<T, 0> {};
58struct ArrayFormatterStream {
60 char const *separator;
61 ArrayFormatterStream(std::ostream &s,
char const *sep)
65struct ArrayFormatter {
66 char const *separator;
67 friend ArrayFormatterStream operator<<(std::ostream &
os,
68 ArrayFormatter
const &
fmt) {
81template <
typename T, std::
size_t N>
using carray_alias = T
const[
N];
85template <
typename T, std::
size_t N>
struct Array {
100 DEVICE_THROW(std::out_of_range(
"Array access out of bounds."));
107 DEVICE_THROW(std::out_of_range(
"Array access out of bounds."));
130 return *(
cend() - 1);
177 static constexpr detail::ArrayFormatter
formatter(
char const *
sep =
" ") {
182 friend boost::serialization::access;
183 template <
typename Archive>
184 void serialize(
Archive &
ar,
const unsigned int ) {
188 static std::ostream &format(std::ostream &
out, Array
const &a,
189 char const *
const sep) {
193 for (
auto it = std::next(a.begin());
it != a.end(); ++
it)
200 return format(
out, a,
", ");
205 return format(
fmt.stream, a,
fmt.separator);
209template <std::
size_t I,
class T, std::
size_t N>
214template <std::
size_t I,
class T, std::
size_t N>
221template <std::
size_t I,
class T, std::
size_t N>
222struct std::tuple_element<
I,
Utils::Array<T, N>> {
223 static_assert(
I <
N,
"Utils::Array index must be in range");
227template <
class T, std::
size_t N>
228struct std::tuple_size<
Utils::Array<T, N>>
229 : std::integral_constant<std::size_t, N> {};
#define UTILS_ARRAY_BOOST_MPI_T(Container, N)
Mark array types as MPI data types.
#define UTILS_ARRAY_BOOST_BIT_S(Container, N)
Mark array types as MPI bitwise serializable.
#define UTILS_ARRAY_BOOST_CLASS(Container, N, ImplementationLevel)
Redefinition of BOOST_CLASS_IMPLEMENTATION for array types.
#define UTILS_ARRAY_BOOST_TRACK(Container, N, TrackingLevel)
Redefinition of BOOST_CLASS_TRACKING for array types.
cudaStream_t stream[1]
CUDA streams for parallel computing on CPU and GPU.
T & get(Array< T, N > &a) noexcept
void serialize(Archive &ar, std::tuple< T... > &pack, unsigned int const)
Serialize std::tuple.
DEVICE_QUALIFIER constexpr const_reference operator[](size_type i) const noexcept
DEVICE_QUALIFIER constexpr reference at(size_type i)
static constexpr detail::ArrayFormatter formatter(char const *sep=" ")
DEVICE_QUALIFIER constexpr bool empty() const noexcept
DEVICE_QUALIFIER constexpr reference back()
DEVICE_QUALIFIER constexpr pointer data() noexcept
DEVICE_QUALIFIER constexpr const_reference front() const
DEVICE_QUALIFIER constexpr const_reference at(size_type i) const
DEVICE_QUALIFIER constexpr size_type max_size() const noexcept
DEVICE_QUALIFIER constexpr iterator begin() noexcept
DEVICE_QUALIFIER constexpr const_pointer data() const noexcept
DEVICE_QUALIFIER constexpr const_iterator cbegin() const noexcept
const value_type & const_reference
detail::Storage< T, N > m_storage
DEVICE_QUALIFIER constexpr reference operator[](size_type i) noexcept
friend std::ostream & operator<<(std::ostream &out, Array const &a)
DEVICE_QUALIFIER constexpr const_iterator cend() const noexcept
DEVICE_QUALIFIER constexpr size_type size() const noexcept
DEVICE_QUALIFIER constexpr reference front()
const value_type * const_pointer
DEVICE_QUALIFIER constexpr const_reference back() const
friend std::ostream & operator<<(detail::ArrayFormatterStream const &fmt, Array const &a)
DEVICE_QUALIFIER constexpr iterator end() noexcept
DEVICE_QUALIFIER void fill(const value_type &value)
const value_type * const_iterator
DEVICE_QUALIFIER constexpr const_iterator begin() const noexcept
DEVICE_QUALIFIER constexpr const_iterator end() const noexcept
std::ptrdiff_t difference_type