31#include <boost/serialization/access.hpp>
44template <
typename T, std::
size_t N>
struct Storage {
48 friend boost::serialization::access;
49 template <
typename Archive>
55template <
typename T>
struct Storage<T, 0> {};
57struct ArrayFormatterStream {
59 char const *separator;
60 ArrayFormatterStream(std::ostream &s,
char const *sep)
64struct ArrayFormatter {
65 char const *separator;
66 friend ArrayFormatterStream operator<<(std::ostream &
os,
67 ArrayFormatter
const &
fmt) {
68 return {
os,
fmt.separator};
80template <
typename T, std::
size_t N>
using carray_alias = T
const[
N];
84template <
typename T, std::
size_t N>
struct Array {
99 DEVICE_THROW(std::out_of_range(
"Array access out of bounds."));
106 DEVICE_THROW(std::out_of_range(
"Array access out of bounds."));
129 return *(
cend() - 1);
176 static constexpr detail::ArrayFormatter
formatter(
char const *
sep =
" ") {
181 friend boost::serialization::access;
182 template <
typename Archive>
183 void serialize(
Archive &
ar,
const unsigned int ) {
187 static std::ostream &format(std::ostream &
out, Array
const &a,
188 char const *
const sep) {
192 for (
auto it = std::next(a.begin());
it != a.end(); ++
it)
199 return format(
out, a,
", ");
204 return format(
fmt.stream, a,
fmt.separator);
208template <std::
size_t I,
class T, std::
size_t N>
213template <std::
size_t I,
class T, std::
size_t N>
220template <std::
size_t I,
class T, std::
size_t N>
221struct std::tuple_element<
I,
Utils::Array<T, N>> {
222 static_assert(
I <
N,
"Utils::Array index must be in range");
226template <
class T, std::
size_t N>
227struct std::tuple_size<
Utils::Array<T, N>>
228 : 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