6#include <boost/serialization/array.hpp>
7#include <boost/serialization/vector.hpp>
32template <
typename Type, std::size_t... sizes>
33constexpr auto concatenate(
const std::array<Type, sizes>&... arrays)
35 std::array<Type, (sizes + ...)> result;
38 ((std::copy_n(arrays.begin(), sizes, result.begin() + index), index += sizes), ...);
63 const auto increment=[&](
auto n,
auto inc)
65 using namespace hana::literals;
66 if constexpr (n!=0_c) {
67 if (idx[n]==extents[n]-1) {idx[n]=0; inc(n-1_c,inc);}
73 increment(hana::llong_c<RANK-1>,increment);
104template <
typename T,
size_t RANK>
124 if (
auto eComp=
e++;
static_cast<size_t>(i) >= *
eComp)
125 throw std::range_error(
"Index position: "+std::to_string(
eComp-
extents.begin())+
", index value: "+std::to_string(i)+
", extent: "+std::to_string(*
eComp));
146 T&
operator() (std::convertible_to<size_t>
auto ... i)
const requires (
sizeof...(i)==
RANK)
158 T&
operator() (std::convertible_to<size_t>
auto i, std::convertible_to<size_t>
auto j)
const requires (
RANK==2) {
182template <
typename T,
size_t RANK>
187template <
typename T,
size_t RANK>
requires ( !std::is_const_v<T> )
192template <
typename T,
size_t RANK>
requires ( !std::is_const_v<T> )
195template <
typename T,
size_t RANK>
requires ( !std::is_const_v<T> )
200template <
typename T1,
typename T2,
size_t RANK>
212template <
typename T1,
typename T2,
size_t RANK>
223namespace multiarray {
230template <
size_t RANK>
234 for (
size_t i=1; i<
RANK; ++i) strides[i]=strides[i-1]*extents[i-1];
239template <
size_t RANK>
242 return std::ranges::fold_left(extents,1u
z,std::multiplies{});
249inline constexpr auto noInit = [] (
size_t e) -> std::vector<T> {
return std::vector<T>(
e);};
254inline constexpr auto zeroInit = [] (
size_t e) -> std::vector<T> {
return std::vector<T>(
e,
T(0.));};
264auto copyInit(
const std::ranges::sized_range
auto&
input) {
return [&] (
size_t e) {
265 if (
size(
input) !=
e)
throw std::runtime_error(
"Extent mismatch in MultiArray copyInit: "+std::to_string(
size(
input))+
" "+std::to_string(
e));
276template <
typename T,
size_t RANK>
296template <
typename T,
size_t RANK>
297requires ( !std::is_const_v<T> )
311 this->dataView=std::span<T>(data_);
327 template <
typename TT>
332 throw std::runtime_error(
"Self assignment attempted in MultiArray");
362 {
"extents" , json::value_from(
ma.
extents) },
364 {
"data", json::value_from(
ma.data_) }
372 json::value_to<Extents<RANK>>(
jv.as_object().at(
"extents")),
373 multiarray::copyInit<T>( json::value_to<StorageType>(
jv.as_object().at(
"data") ) ) };
379 friend class boost::serialization::access;
382 template<
class Archive>
void save(
Archive&
ar,
const unsigned int)
const {
ar & this->extents & data_;}
385 template<
class Archive>
void load(
Archive&
ar,
const unsigned int)
388 this->dataView=std::span<T>(data_);
391 BOOST_SERIALIZATION_SPLIT_MEMBER()
396namespace multiarray {
400MultiArray<T,1> fromStorage(std::vector<T> v)
402 const size_t s = v.size();
403 return MultiArray<T,1>{ {s}, [&] (size_t) {
return std::move(v);} };
409template <
typename T,
size_t RANK>
#define FWD(x)
Perfect-forwarding macro. Expands to std::forward<decltype(x)>(x), avoiding the need to repeat the ty...
Definition Traits.h:5
A non-owning, strided view over a contiguous buffer. Should be passed by value.
Definition MultiArray.h:106
Extents< RANK > extents
Definition MultiArray.h:172
void checkBounds(std::convertible_to< size_t > auto ... i) const
Bounds-check all indices against extents. Active only in debug builds (NDEBUG not defined).
Definition MultiArray.h:119
MultiArrayView(Extents< RANK > extents, Extents< RANK > strides, size_t offset, auto &&... dataView)
Constructs a view with explicit extents, strides, offset, and data span. The offset accumulates from ...
Definition MultiArray.h:112
size_t offset
Definition MultiArray.h:174
T & operator()(Extents< RANK > idx) const
Subscript by Extents<RANK> multi-index. Always const — does not modify the view, only potentially the...
Definition MultiArray.h:137
std::span< T > dataView
Definition MultiArray.h:176
MultiArrayView(const MultiArrayView &)=default
MultiArrayView & operator=(const MultiArrayView &)=default
Extents< RANK > strides
Definition MultiArray.h:172
Owning, move-only, rank-RANK array. Non-copyable; follows value semantics regarding constness.
Definition MultiArray.h:299
MultiArray(Extents< RANK > extents, auto initializer)
Primary constructor. initializer is a callable (size_t totalElements) -> StorageType.
Definition MultiArray.h:308
multiarray::StorageType< T > StorageType
Definition MultiArray.h:301
const T & operator()(auto &&... i) const
Const element access. This overload is needed to prevent the non-const overload from shadowing the ba...
Definition MultiArray.h:352
void assignTo(MultiArrayConstView< TT, RANK > macv)
Element-by-element assignment from a const view of compatible type.
Definition MultiArray.h:328
friend void tag_invoke(const json::value_from_tag &, json::value &jv, const MultiArray &ma)
Boost.JSON serialization: emits {"extents": [...], "data": [...]}.
Definition MultiArray.h:359
const StorageType & dataStorage() const
Definition MultiArray.h:356
MultiArrayConstView< T, RANK > constView() const
Explicit const view, useful where implicit conversion is suppressed.
Definition MultiArray.h:340
MultiArray(const MultiArray &)=delete
MultiArray(MultiArray &&)=default
T & operator()(auto &&... i)
Non-const element access, forwarding to the base const overload via const_cast.
Definition MultiArray.h:349
MultiArray(Extents< RANK > extents)
Constructs an array with given extents and unspecified contents (see multiarray::noInit).
Definition MultiArray.h:315
auto mutableView()
Explicit mutable view.
Definition MultiArray.h:343
StorageType & dataStorage()
Direct access to the underlying storage vector.
Definition MultiArray.h:355
friend MultiArray copy(const MultiArray &ma)
Named copy: constructs a new owning array with a deep copy of ma's data.
Definition MultiArray.h:322
friend MultiArray tag_invoke(const json::value_to_tag< MultiArray > &, const json::value &jv)
Boost.JSON deserialization: reconstructs from {"extents": [...], "data": [...]}.
Definition MultiArray.h:369
constexpr struct cppqedutils::multiarray::Placeholder _
auto calculateExtent(Extents< RANK > extents)
Returns the total number of elements: the product of all extents.
Definition MultiArray.h:240
auto copyInit(const std::ranges::sized_range auto &input)
Initializer that copies from a sized range, checking that its size matches the requested extent.
Definition MultiArray.h:264
std::vector< T > StorageType
Underlying storage type: std::vector<T>. May eventually be replaced by kokkos::View or std::valarray.
Definition MultiArray.h:259
constexpr auto zeroInit
Initializer that allocates storage of size e and zero-initializes all elements via T(0....
Definition MultiArray.h:254
auto calculateStrides(Extents< RANK > extents)
Computes first-index-fastest strides from extents (std::layout_left; column-major for rank 2): stride...
Definition MultiArray.h:231
constexpr auto noInit
Initializer for storage of size e whose contents the caller overwrites before reading them.
Definition MultiArray.h:249
Namespace alias for Boost.Hana, used for compile-time sequences and heterogeneous containers.
Definition MultiArray.h:17
constexpr auto concatenate(const std::array< Type, sizes > &... arrays)
Concatenates multiple std::array instances of different sizes into one.
Definition MultiArray.h:33
std::array< size_t, RANK > Extents
Compile-time–fixed shape and stride descriptor for a rank-RANK array. Should be passed by value,...
Definition MultiArray.h:46
std::string toStringJSON(auto &&v)
Serializes any JSON-convertible value to a string via json::value_from.
Definition Traits.h:27
auto & incrementMultiIndex(Extents< RANK > &idx, Extents< RANK > extents)
Increments a multi-index in last-index-fastest order, in-place.
Definition MultiArray.h:61
void checkExtents(MultiArrayConstView< T1, RANK > m1, MultiArrayConstView< T2, RANK > m2, std::string message)
Debug-mode extent check between two views. Throws std::runtime_error on mismatch.
Definition MultiArray.h:201
bool isEqual(MultiArrayConstView< T1, RANK > m1, MultiArrayConstView< T2, RANK > m2)
Element-by-element equality test. Traverses all elements via incrementMultiIndex.
Definition MultiArray.h:213
void checkContiguous(MultiArrayView< T, RANK > mav, std::string message)
Debug-mode check that a view covers its storage as an owning MultiArray of the same extents would: of...
Definition MultiArray.h:277
Metafunction yielding the const-reference type of State. Defaults to const State&....
Definition Traits.h:51
Metafunction yielding the reference type of State. Defaults to State&. Specialized for view types to ...
Definition Traits.h:44
Sentinel type for rank-2 slice notation: mav(i, _) returns the i-th row as a rank-1 view.
Definition MultiArray.h:86