32#include <boost/serialization/access.hpp>
44template <
typename T, std::
size_t N>
struct Storage {
48 friend boost::serialization::access;
49 template <
typename Archive>
50 void serialize(Archive &ar,
const unsigned int ) {
55template <
typename T>
struct Storage<T, 0> {};
57struct ArrayFormatterStream {
59 char const *separator;
60 ArrayFormatterStream(std::ostream &s,
char const *sep)
61 :
stream(s), separator(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);
185 static constexpr detail::ArrayFormatter
formatter(
char const *sep =
" ") {
190 friend boost::serialization::access;
191 template <
typename Archive>
192 void serialize(Archive &ar,
const unsigned int ) {
196 static std::ostream &format(std::ostream &out, Array
const &a,
197 char const *
const sep) {
201 for (
auto it = std::next(a.begin()); it != a.end(); ++it)
208 return format(out, a,
", ");
211 friend std::ostream &
operator<<(detail::ArrayFormatterStream
const &fmt,
213 return format(fmt.stream, a, fmt.separator);
217template <std::
size_t I,
class T, std::
size_t N>
218typename std::tuple_element<I, Array<T, N>>::type &
223template <std::
size_t I,
class T, std::
size_t N>
224const typename std::tuple_element<I, Array<T, N>>::type &
231template <std::
size_t I,
class T, std::
size_t N>
232struct std::tuple_element<I,
Utils::Array<T, N>> {
233 static_assert(I < N,
"Utils::Array index must be in range");
234 using type =
typename std::enable_if_t<(I < N), T>;
237template <
class T, std::
size_t N>
238struct std::tuple_size<
Utils::Array<T, N>>
239 : 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.
std::tuple_element< I, Array< T, N > >::type & 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
static DEVICE_QUALIFIER constexpr Array< T, N > broadcast(const value_type &value)
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
typename std::enable_if_t<(I< N), T > type