5#ifndef DUNE_COMMON_STD_LAYOUT_RIGHT_HH
6#define DUNE_COMMON_STD_LAYOUT_RIGHT_HH
17template <
class Extents>
41 template <
class OtherExtents,
42 std::enable_if_t<std::is_constructible_v<extents_type, OtherExtents>,
int> = 0>
43 #if __cpp_conditional_explicit >= 201806L
44 explicit(!std::is_convertible_v<OtherExtents, extents_type>)
52 std::enable_if_t<(E::rank() <= 1),
int> = 0,
53 std::enable_if_t<std::is_constructible_v<extents_type, OtherExtents>,
int> = 0>
54 #
if __cpp_conditional_explicit >= 201806L
55 explicit(!std::is_convertible_v<OtherExtents, extents_type>)
62 template <
class OtherExtents,
63 std::enable_if_t<std::is_constructible_v<extents_type, OtherExtents>,
int> = 0>
64 #if __cpp_conditional_explicit >= 201806L
65 explicit(extents_type::rank() > 0)
71 if constexpr(extents_type::rank() > 0) {
73 for (
rank_type r = extents_type::rank()-1; r > 0; --r) {
89 template <
class... Indices,
90 std::enable_if_t<(
sizeof...(Indices) == extents_type::rank()),
int> = 0,
91 std::enable_if_t<(std::is_convertible_v<Indices, index_type> && ...),
int> = 0,
92 std::enable_if_t<(std::is_nothrow_constructible_v<Indices, index_type> && ...),
int> = 0>
95 const std::array indices{
index_type(std::move(ii))...};
97 for (
rank_type j = 0; j < extents_type::rank()-1; ++j) {
98 value = indices[j+1] + extents_.extent(j+1) * value;
113 static constexpr bool is_unique () noexcept {
return true; }
115 static constexpr bool is_strided () noexcept {
return true; }
119 std::enable_if_t<(E::rank() > 0),
int> = 0>
122 assert(i < extents_type::rank());
124 for (
rank_type r = i+1; r < extents_type::rank(); ++r)
129 template <
class OtherExtents>
132 return a.extents_ == b.extents_;
Namespace for features backported from new C++ standards.
Definition default_accessor.hh:10
A layout mapping where the leftmost extent has stride 1.
Definition layout_left.hh:19
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 rightmost extent has stride 1.
Definition layout_right.hh:19
constexpr const extents_type & extents() const noexcept
Definition layout_right.hh:85
constexpr index_type operator()() const noexcept
The default offset for rank-0 tensors is 0.
Definition layout_right.hh:104
constexpr mapping & operator=(const mapping &) noexcept=default
Copy-assignment for the mapping.
constexpr index_type required_span_size() const noexcept
Definition layout_right.hh:86
constexpr mapping() noexcept=default
The default construction is possible for default constructible extents.
typename extents_type::size_type size_type
Definition layout_right.hh:24
Extents extents_type
Definition layout_right.hh:23
static constexpr bool is_always_unique() noexcept
Definition layout_right.hh:109
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:120
static constexpr bool is_exhaustive() noexcept
Definition layout_right.hh:114
constexpr mapping(const layout_left::mapping< OtherExtents > &m) noexcept
Construct the mapping from a layout_left.
Definition layout_right.hh:57
static constexpr bool is_strided() noexcept
Definition layout_right.hh:115
typename extents_type::rank_type rank_type
Definition layout_right.hh:25
static constexpr bool is_always_strided() noexcept
Definition layout_right.hh:111
static constexpr bool is_unique() noexcept
Definition layout_right.hh:113
friend constexpr bool operator==(const mapping &a, const mapping< OtherExtents > &b) noexcept
Definition layout_right.hh:130
static constexpr bool is_always_exhaustive() noexcept
Definition layout_right.hh:110
typename extents_type::index_type index_type
Definition layout_right.hh:26
A layout mapping where the strides are user-defined.
Definition layout_stride.hh:19
constexpr const extents_type & extents() const noexcept
Definition layout_stride.hh:85
constexpr const strides_type & strides() const noexcept
Get the array of all strides.
Definition layout_stride.hh:127