5#ifndef DUNE_COMMON_STD_LAYOUT_LEFT_HH
6#define DUNE_COMMON_STD_LAYOUT_LEFT_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>)
47 : extents_(m.extents())
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>)
58 : extents_(m.extents())
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 = 0; r < extents_type::rank()-1; ++r) {
77 assert(m.
strides(extents_type::rank()-1) == prod);
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>
93 constexpr index_type operator() (Indices... ii)
const noexcept
95 const std::array indices{
index_type(std::move(ii))...};
97 for (
rank_type r = 1; r < extents_type::rank(); ++r) {
98 const rank_type j = extents_type::rank()-r;
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());
130 template <
class OtherExtents,
131 std::enable_if_t<(Extents::rank() == OtherExtents::rank()),
int> = 0>
134 return a.extents_ == b.extents_;
Namespace for features backported from new C++ standards.
Definition default_accessor.hh:10
A layout where the leftmost extent has stride 1.
Definition fwd_layouts.hh:17
A layout mapping where the leftmost extent has stride 1.
Definition layout_left.hh:19
constexpr index_type stride(rank_type i) const noexcept
The stride is the product of the extents E(0)*E(1)*...*E(i-1)
Definition layout_left.hh:121
typename extents_type::index_type index_type
Definition layout_left.hh:26
constexpr index_type required_span_size() const noexcept
Definition layout_left.hh:86
constexpr mapping & operator=(const mapping &) noexcept=default
Copy-assignment for the mapping.
Extents extents_type
Definition layout_left.hh:23
static constexpr bool is_always_unique() noexcept
Definition layout_left.hh:110
constexpr mapping() noexcept=default
The default construction is possible for default constructible extents.
static constexpr bool is_strided() noexcept
Definition layout_left.hh:116
static constexpr bool is_always_strided() noexcept
Definition layout_left.hh:112
constexpr index_type operator()() const noexcept
The default offset for rank-0 tensors is 0.
Definition layout_left.hh:105
typename extents_type::size_type size_type
Definition layout_left.hh:24
constexpr mapping(const mapping< OtherExtents > &m) noexcept
Construct the mapping from another mapping with a different extents type.
Definition layout_left.hh:46
static constexpr bool is_unique() noexcept
Definition layout_left.hh:114
constexpr mapping(const layout_right::mapping< OtherExtents > &m) noexcept
Construct the mapping from a layout_right.
Definition layout_left.hh:57
constexpr const extents_type & extents() const noexcept
Definition layout_left.hh:85
static constexpr bool is_always_exhaustive() noexcept
Definition layout_left.hh:111
typename extents_type::rank_type rank_type
Definition layout_left.hh:25
static constexpr bool is_exhaustive() noexcept
Definition layout_left.hh:115
A layout mapping where the rightmost extent has stride 1.
Definition layout_right.hh:19
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