5 #ifndef DUNE_COMMON_STD_LAYOUT_RIGHT_HH 6 #define DUNE_COMMON_STD_LAYOUT_RIGHT_HH 18 template <
class Extents>
19 class layout_right::mapping
31 constexpr
mapping () noexcept = default;
42 template <
class OtherExtents,
43 std::enable_if_t<std::is_constructible_v<extents_type, OtherExtents>,
int> = 0>
44 #if __cpp_conditional_explicit >= 201806L 45 explicit(!std::is_convertible_v<OtherExtents, extents_type>)
53 std::enable_if_t<(E::rank() <= 1), int> = 0,
54 std::enable_if_t<std::is_constructible_v<extents_type, OtherExtents>,
int> = 0>
55 #if __cpp_conditional_explicit >= 201806L 56 explicit(!std::is_convertible_v<OtherExtents, extents_type>)
63 template <
class OtherExtents,
64 std::enable_if_t<std::is_constructible_v<extents_type, OtherExtents>,
int> = 0>
65 #if __cpp_conditional_explicit >= 201806L 66 explicit(extents_type::rank() > 0)
72 if constexpr(extents_type::rank() > 0) {
74 for (
rank_type r = extents_type::rank()-1; r > 0; --r) {
90 template <
class... Indices,
91 std::enable_if_t<(
sizeof...(Indices) == extents_type::rank()),
int> = 0,
92 std::enable_if_t<(std::is_convertible_v<Indices, index_type> && ...),
int> = 0,
93 std::enable_if_t<(std::is_nothrow_constructible_v<Indices, index_type> && ...),
int> = 0>
96 const std::array indices{
index_type(std::move(ii))...};
98 for (
rank_type j = 0; j < extents_type::rank()-1; ++j) {
99 value = indices[j+1] + extents_.extent(j+1) * value;
114 static constexpr
bool is_unique () noexcept {
return true; }
116 static constexpr
bool is_strided () noexcept {
return true; }
120 std::enable_if_t<(E::rank() > 0),
int> = 0>
123 assert(
i < extents_type::rank());
125 for (
rank_type r =
i+1; r < extents_type::rank(); ++r)
130 template <
class OtherExtents>
133 return a.extents_ == b.extents_;
142 #endif // DUNE_COMMON_STD_LAYOUT_RIGHT_HH A layout mapping where the strides are user-defined.
Definition: fwd_layouts.hh:42
Namespace for features backported from new C++ standards.
Definition: algorithm.hh:19
constexpr mapping() noexcept=default
The default construction is possible for default constructible extents.
static constexpr bool is_unique() noexcept
Definition: layout_right.hh:114
typename extents_type::rank_type rank_type
Definition: layout_right.hh:26
#define DUNE_NO_UNIQUE_ADDRESS
Definition: no_unique_address.hh:24
typename extents_type::index_type index_type
Definition: layout_right.hh:27
constexpr const extents_type & extents() const noexcept
Definition: layout_left.hh:86
constexpr const extents_type & extents() const noexcept
Definition: layout_stride.hh:87
I i
Definition: hybridmultiindex.hh:328
static constexpr bool is_always_exhaustive() noexcept
Definition: layout_right.hh:111
A layout where the rightmost extent has stride 1, and strides increase right-to-left as the product o...
Definition: fwd_layouts.hh:29
static constexpr bool is_exhaustive() noexcept
Definition: layout_right.hh:115
constexpr mapping & operator=(const mapping &) noexcept=default
Copy-assignment for the mapping.
constexpr index_type operator()() const noexcept
The default offset for rank-0 tensors is 0.
Definition: layout_right.hh:105
typename extents_type::size_type size_type
Definition: layout_right.hh:25
constexpr const extents_type & extents() const noexcept
Definition: layout_right.hh:86
static constexpr bool is_always_unique() noexcept
Definition: layout_right.hh:110
constexpr index_type required_span_size() const noexcept
Definition: layout_right.hh:87
constexpr const strides_type & strides() const noexcept
Get the array of all strides.
Definition: layout_stride.hh:129
static constexpr bool is_strided() noexcept
Definition: layout_right.hh:116
A layout mapping where the leftmost extent has stride 1.
Definition: fwd_layouts.hh:19
friend constexpr bool operator==(const mapping &a, const mapping< OtherExtents > &b) noexcept
Definition: layout_right.hh:131
constexpr index_type stride(rank_type i) const noexcept
The stride is the product of the extents E(n)*E(n-1)*...*E(i+1)
Definition: layout_right.hh:121
Extents extents_type
Definition: layout_right.hh:24
A layout mapping where the rightmost extent has stride 1.
Definition: fwd_layouts.hh:32
static constexpr bool is_always_strided() noexcept
Definition: layout_right.hh:112