Iros
 
Loading...
Searching...
No Matches
layout_stride.h
Go to the documentation of this file.
1#pragma once
2
6#include "di/meta/algorithm.h"
7#include "di/meta/constexpr.h"
12
13namespace di::vocab {
14namespace detail {
15 template<class Layout, class Mapping>
17
18 template<typename M>
19 concept LayoutMappingAlike = requires {
21 { M::is_always_strided() } -> concepts::SameAs<bool>;
22 { M::is_always_exhaustive() } -> concepts::SameAs<bool>;
23 { M::is_always_unique() } -> concepts::SameAs<bool>;
24 Constexpr<M::is_always_strided()>::value;
25 Constexpr<M::is_always_exhaustive()>::value;
26 Constexpr<M::is_always_unique()>::value;
27 };
28}
29
30template<typename Extents>
32public:
37
38private:
39 constexpr static RankType rank = ExtentsType::rank();
40
41public:
42 Mapping() = default;
43 Mapping(Mapping const&) = default;
44 Mapping(Mapping&&) = default;
45
46 constexpr Mapping(ExtentsType const& extents) : m_extents(extents) {}
47
48 template<typename OtherSizeType>
52 container::copy(strides, m_strides.data());
53 }
54
55 template<typename OtherSizeType>
58 constexpr Mapping(ExtentsType const& extents, Array<OtherSizeType, rank> const& strides) : m_extents(extents) {
59 container::copy(strides, m_strides.data());
60 }
61
62 template<detail::LayoutMappingAlike StridedLayoutMapping>
64 StridedLayoutMapping::is_always_unique() && StridedLayoutMapping::is_always_strided())
75
76 auto operator=(Mapping const&) -> Mapping& = default;
77
78 constexpr auto extents() const -> ExtentsType const& { return m_extents; }
79 constexpr auto strides() const -> Array<SizeType, rank> { return m_strides; }
80
81 constexpr auto required_span_size() const -> SizeType {
82 SizeType size = 1;
83 for (auto d : container::view::range(rank)) {
84 if (extents().extent(0) == 0) {
85 return 0;
86 }
87 size += (static_cast<SizeType>(extents().extent(d) - 1)) * stride(d);
88 }
89 return size;
90 }
91
92 template<typename... Indices>
93 requires(sizeof...(Indices) == ExtentsType::rank() && (concepts::ConvertibleTo<Indices, SizeType> && ...))
94 constexpr auto operator()(Indices... indices) const -> SizeType {
95 return function::unpack<meta::MakeIndexSequence<sizeof...(Indices)>>([&]<size_t... i>(meta::ListV<i...>) {
96 return ((static_cast<SizeType>(indices) * stride(i)) + ... + 0);
97 });
98 }
99
100 constexpr static auto is_always_unique() -> bool { return true; }
101 constexpr static auto is_always_exhaustive() -> bool { return false; }
102 constexpr static auto is_always_strided() -> bool { return true; }
103
104 constexpr static auto is_unique() -> bool { return true; }
105 constexpr auto is_exhaustive() const -> bool { return required_span_size() == extents().fwd_prod_of_extents(rank); }
106 constexpr static auto is_strided() -> bool { return true; }
107
108 constexpr auto stride(RankType i) const -> SizeType { return m_strides[i]; }
109
110private:
111 template<typename OtherExtents>
112 requires(Extents::rank() == OtherExtents::rank())
113 constexpr friend auto operator==(Mapping const& a, Mapping<OtherExtents> const& b) -> bool {
114 return a.extents() == b.extents() && a.m_strides == b.m_strides;
115 }
116
117 [[no_unique_address]] ExtentsType m_extents {};
118 [[no_unique_address]] Array<SizeType, rank> m_strides {};
119};
120}
Definition extents_forward_declaration.h:11
static constexpr auto rank() -> size_t
Definition extents.h:55
size_t RankType
Definition extents.h:53
T SizeType
Definition extents.h:52
Definition layout_stride.h:31
constexpr auto is_exhaustive() const -> bool
Definition layout_stride.h:105
constexpr Mapping(ExtentsType const &extents)
Definition layout_stride.h:46
typename ExtentsType::RankType RankType
Definition layout_stride.h:35
static constexpr auto is_strided() -> bool
Definition layout_stride.h:106
auto operator=(Mapping const &) -> Mapping &=default
typename ExtentsType::SizeType SizeType
Definition layout_stride.h:34
LayoutStride LayoutType
Definition layout_stride.h:36
constexpr auto extents() const -> ExtentsType const &
Definition layout_stride.h:78
static constexpr auto is_always_exhaustive() -> bool
Definition layout_stride.h:101
constexpr auto required_span_size() const -> SizeType
Definition layout_stride.h:81
constexpr auto stride(RankType i) const -> SizeType
Definition layout_stride.h:108
constexpr Mapping(ExtentsType const &extents, Span< OtherSizeType, rank > strides)
Definition layout_stride.h:51
Mapping(Mapping const &)=default
static constexpr auto is_always_unique() -> bool
Definition layout_stride.h:100
Extents ExtentsType
Definition layout_stride.h:33
static constexpr auto is_always_strided() -> bool
Definition layout_stride.h:102
constexpr Mapping(ExtentsType const &extents, Array< OtherSizeType, rank > const &strides)
Definition layout_stride.h:58
static constexpr auto is_unique() -> bool
Definition layout_stride.h:104
constexpr auto strides() const -> Array< SizeType, rank >
Definition layout_stride.h:79
Definition span_forward_declaration.h:10
Definition operations.h:11
Definition operations.h:99
Definition extents.h:17
Definition core.h:114
Definition layout_stride.h:16
Definition layout_stride.h:19
constexpr usize stride
Definition gfx_test.cpp:23
constexpr auto range
Definition range.h:22
constexpr auto copy
Definition copy.h:30
constexpr auto unpack
Definition unpack.h:24
MakeIntegerSequence< usize, count > MakeIndexSequence
Definition algorithm.h:285
Definition erasure_cast.h:7
Definition lazy.h:165
constexpr auto size
Definition size.h:54
A wrapper for a constexpr value.
Definition core.h:77
Definition core.h:8
Definition span_fixed_size.h:37
Definition extents_forward_declaration.h:23