5#ifndef DUNE_COMMON_STD_LAYOUT_STRIDE_HH
6#define DUNE_COMMON_STD_LAYOUT_STRIDE_HH
11#include <dune/common/indices.hh>
12#include <dune/common/std/impl/fwd_layouts.hh>
17template <
class Extents>
20 template <
class>
friend class mapping;
21 static constexpr typename Extents::rank_type rank_ = Extents::rank();
24 using extents_type = Extents;
25 using index_type =
typename extents_type::index_type;
26 using size_type =
typename extents_type::size_type;
27 using rank_type =
typename extents_type::rank_type;
31 using strides_type = std::array<index_type,rank_>;
44 template <
class OtherIndexType,
45 std::enable_if_t<std::is_convertible_v<const OtherIndexType&, index_type>,
int> = 0,
46 std::enable_if_t<std::is_nothrow_constructible_v<index_type, const OtherIndexType&>,
int> = 0>
47 constexpr mapping (
const extents_type& e,
const std::array<OtherIndexType,rank_>& s) noexcept
51 for (rank_type r = 0; r < rank_; ++r)
56 template <
class OtherIndexType,
57 std::enable_if_t<std::is_convertible_v<const OtherIndexType&, index_type>,
int> = 0,
58 std::enable_if_t<std::is_nothrow_constructible_v<index_type, const OtherIndexType&>,
int> = 0>
63 for (rank_type r = 0; r < rank_; ++r)
69 std::enable_if_t<(M::extents_type::rank() == extents_type::rank()),
int> = 0,
70 std::enable_if_t<(M::is_always_unique()),
int> = 0,
71 std::enable_if_t<(M::is_always_strided()),
int> = 0,
72 decltype(std::declval<M>().extents(),
bool{}) =
true,
73 decltype(std::declval<M>().stride(std::declval<rank_type>()),
bool{}) =
true>
75 : extents_(m.extents())
78 for (rank_type r = 0; r < rank_; ++r)
85 constexpr const extents_type&
extents () const noexcept {
return extents_; }
90 return size(extents_,strides_);
95 std::enable_if_t<(
sizeof...(Indices) == rank_),
int> = 0,
96 std::enable_if_t<(std::is_convertible_v<Indices, index_type> && ...),
int> = 0,
97 std::enable_if_t<(std::is_nothrow_constructible_v<index_type, Indices> && ...),
int> = 0>
101 return ((
static_cast<index_type
>(ii)*strides_[r]) + ... + 0); },
102 std::make_index_sequence<rank_>{});
111 static constexpr bool is_always_unique () noexcept {
return true; }
112 static constexpr bool is_always_exhaustive () noexcept {
return false; }
113 static constexpr bool is_always_strided () noexcept {
return true; }
115 static constexpr bool is_unique () noexcept {
return true; }
116 static constexpr bool is_strided () noexcept {
return true; }
118 constexpr bool is_exhaustive () const noexcept
127 constexpr const strides_type&
strides () const noexcept
133 template <
class E = extents_type,
134 std::enable_if_t<(E::rank() > 0),
int> = 0>
135 constexpr index_type
stride (rank_type i)
const noexcept
140 template <
class OtherMapping,
141 std::enable_if_t<(OtherMapping::extents_type::rank() == extents_type::rank()),
int> = 0,
142 std::enable_if_t<(OtherMapping::is_always_strided()),
int> = 0>
143 friend constexpr bool operator== (
const mapping& a,
const OtherMapping& b)
noexcept
147 if constexpr(extents_type::rank() == 0)
149 return a.extents_ == b.extents_ && a.strides_ == b.strides_;
153 template <
class E,
class S>
154 static constexpr index_type size (
const E&
extents,
const S&
strides)
noexcept
156 if constexpr (E::rank() == 0)
162 index_type result = 1;
163 for (rank_type r = 0; r < E::rank(); ++r)
171 static constexpr size_type offset (
const M& m)
noexcept
173 if constexpr (M::extents_type::rank() == 0)
176 if (m.required_span_size() == 0)
180 return m((r,0)...); },
181 std::make_index_sequence<M::extents_type::rank()>{});
187 [[no_unique_address]] extents_type extents_;
188 strides_type strides_;
Multidimensional index space with dynamic and static extents.
Definition: extents.hh:54
constexpr index_type extent(rank_type r) const noexcept
Return the extent of dimension i
Definition: extents.hh:100
A layout mapping where the strides are user-defined.
Definition: layout_stride.hh:19
constexpr mapping(const extents_type &e, const span< OtherIndexType, rank_ > &s) noexcept
Construct the mapping from given extents and strides.
Definition: layout_stride.hh:59
constexpr mapping & operator=(const mapping &) noexcept=default
Copy-assignment for the mapping.
constexpr mapping() noexcept
The default construction initializes the strides from layout_right.
Definition: layout_stride.hh:36
constexpr mapping(const extents_type &e, const std::array< OtherIndexType, rank_ > &s) noexcept
Construct the mapping from given extents and strides.
Definition: layout_stride.hh:47
constexpr index_type stride(rank_type i) const noexcept
Get the single stride i
Definition: layout_stride.hh:135
constexpr index_type required_span_size() const noexcept
Return the sum 1 + (E(0)-1)*S(0) + (E(1)-1)*S(1) + ...
Definition: layout_stride.hh:88
constexpr const strides_type & strides() const noexcept
Get the array of all strides.
Definition: layout_stride.hh:127
constexpr mapping(const mapping &) noexcept=default
Copy constructor for the mapping.
constexpr index_type operator()() const noexcept
The default offset for rank-0 tensors is 0.
Definition: layout_stride.hh:106
A contiguous sequence of elements with static or dynamic extent.
Definition: span.hh:126
decltype(auto) constexpr unpackIntegerSequence(F &&f, std::integer_sequence< I, i... > sequence)
Unpack an std::integer_sequence<I,i...> to std::integral_constant<I,i>...
Definition: indices.hh:124
Namespace with predefined compile time indices for the range [0,19].
Definition: indices.hh:50
Namespace for features backported from new C++ standards.
Definition: default_accessor.hh:10
A layout where the rightmost extent has stride 1, and strides increase right-to-left as the product o...
Definition: fwd_layouts.hh:30
A layout mapping where the strides are user-defined.
Definition: fwd_layouts.hh:40