Iros
 
Loading...
Searching...
No Matches
mdspan.h
Go to the documentation of this file.
1#pragma once
2
6#include "di/meta/language.h"
12#include "di/vocab/md/extents.h"
14
15namespace di::vocab {
16template<typename Element, concepts::Extents Extents, concepts::MDLayout<Extents> Layout = LayoutRight,
17 concepts::MDAccessor Accessor = DefaultAccessor<Element>>
18class MDSpan {
19public:
21 using LayoutType = Layout;
22 using AccessorType = Accessor;
23 using MappingType = typename LayoutType::template Mapping<ExtentsType>;
24 using ElementType = Element;
28 using DataHandle = typename AccessorType::DataHandle;
29 using Reference = typename AccessorType::Reference;
30
31 constexpr static auto rank() -> RankType { return ExtentsType::rank(); }
32 constexpr static auto rank_dynamic() -> RankType { return ExtentsType::rank_dynamic(); }
33 constexpr static auto static_extent(RankType r) -> size_t { return ExtentsType::static_extent(r); }
34 constexpr auto extent(RankType r) const -> SizeType { return extents().extent(r); }
35
39 = default;
40
41 MDSpan(MDSpan const&) = default;
42 MDSpan(MDSpan&&) = default;
43
44 template<typename... OtherSizeTypes>
46 (sizeof...(OtherSizeTypes) == rank() || ((sizeof...(OtherSizeTypes) == rank_dynamic()) &&
49 constexpr explicit MDSpan(DataHandle data_handle, OtherSizeTypes... exts)
50 : m_data_handle(util::move(data_handle)), m_mapping(ExtentsType(static_cast<SizeType>(util::move(exts))...)) {}
51
52 template<typename OtherSizeType, size_t N>
55 constexpr explicit(N != rank_dynamic()) MDSpan(DataHandle data_handle, Span<OtherSizeType, N> exts)
56 : m_data_handle(util::move(data_handle)), m_mapping(ExtentsType(exts)) {}
57
58 template<typename OtherSizeType, size_t N>
61 constexpr explicit(N != rank_dynamic()) MDSpan(DataHandle data_handle, Array<OtherSizeType, N> const& exts)
62 : m_data_handle(util::move(data_handle)), m_mapping(ExtentsType(exts)) {}
63
64 constexpr MDSpan(DataHandle data_handle, ExtentsType const& ext)
66 : m_data_handle(util::move(data_handle)), m_mapping(ext) {}
67
68 constexpr MDSpan(DataHandle data_handle, MappingType const& mapping)
70 : m_data_handle(util::move(data_handle)), m_mapping(mapping) {}
71
72 constexpr MDSpan(DataHandle data_handle, MappingType const& mapping, AccessorType const& accessor)
73 : m_data_handle(util::move(data_handle)), m_mapping(mapping), m_accessor(accessor) {}
74
75 template<typename OtherElementType, typename OtherExtents, typename OtherLayout, typename OtherAccessor>
79 !concepts::ConvertibleTo<OtherAccessor const&,
80 AccessorType>) constexpr MDSpan(MDSpan<OtherElementType, OtherExtents,
81 OtherLayout, OtherAccessor> const& other)
82 : m_data_handle(other.data()), m_mapping(other.mapping()), m_accessor(other.accessor()) {}
83
84 auto operator=(MDSpan const&) -> MDSpan& = default;
85 auto operator=(MDSpan&&) -> MDSpan& = default;
86
87 template<typename... OtherSizeTypes>
88 requires(sizeof...(OtherSizeTypes) == rank() && (concepts::ConvertibleTo<OtherSizeTypes, SizeType> && ...))
89 constexpr auto operator[](OtherSizeTypes... indices) const -> Reference {
90 auto index = m_mapping(ExtentsType::index_cast(util::move(indices))...);
91 DI_ASSERT(index < m_mapping.required_span_size());
92 return m_accessor.access(m_data_handle, index);
93 }
94
95 template<typename OtherSizeType>
97 constexpr auto operator[](Span<OtherSizeType, rank()> indices) const -> Reference {
98 return function::unpack<meta::MakeIndexSequence<rank()>>([&]<size_t... i>(meta::ListV<i...>) {
99 return (*this)[util::as_const(indices[i])...];
100 });
101 }
102
103 template<typename OtherSizeType>
105 constexpr auto operator[](Array<OtherSizeType, rank()> const& indices) const -> Reference {
106 return (*this)[indices.span()];
107 }
108
109 template<typename... OtherSizeTypes>
110 requires(sizeof...(OtherSizeTypes) == rank() && (concepts::ConvertibleTo<OtherSizeTypes, SizeType> && ...))
111 constexpr auto operator()(OtherSizeTypes... indices) const -> Reference {
112 auto index = m_mapping(ExtentsType::index_cast(util::move(indices))...);
113 DI_ASSERT(index < m_mapping.required_span_size());
114 return m_accessor.access(m_data_handle, index);
115 }
116
117 template<typename OtherSizeType>
119 constexpr auto operator()(Span<OtherSizeType, rank()> indices) const -> Reference {
120 return function::unpack<meta::MakeIndexSequence<rank()>>([&]<size_t... i>(meta::ListV<i...>) {
121 return (*this)[util::as_const(indices[i])...];
122 });
123 }
124
125 template<typename OtherSizeType>
127 constexpr auto operator()(Array<OtherSizeType, rank()> const& indices) const -> Reference {
128 return (*this)[indices.span()];
129 }
130
131 constexpr auto each() const {
133 [&]<usize... rank_indices>(meta::ListV<rank_indices...>) {
136 return (*this)(indices...);
137 }));
138 });
139 }
140
141 constexpr auto size() const -> size_t { return extents().fwd_prod_of_extents(rank()); }
142 constexpr auto empty() const -> bool { return size() == 0; }
143
144 constexpr auto extents() const -> ExtentsType const& { return m_mapping.extents(); }
145 constexpr auto data() const -> DataHandle const& { return m_data_handle; }
146 constexpr auto mapping() const -> MappingType const& { return m_mapping; }
147 constexpr auto accessor() const -> AccessorType const& { return m_accessor; }
148
149 constexpr static auto is_always_unique() -> bool { return MappingType::is_always_unique(); }
150 constexpr static auto is_always_contiguous() -> bool { return MappingType::is_always_contiguous(); }
151 constexpr static auto is_always_strided() -> bool { return MappingType::is_always_strided(); }
152
153 constexpr auto is_unique() const -> bool { return m_mapping.is_unique(); }
154 constexpr auto is_contiguous() const -> bool { return m_mapping.is_contiguous(); }
155 constexpr auto is_strided() const -> bool { return m_mapping.is_strided(); }
156 constexpr auto stride(RankType r) const -> SizeType { return m_mapping.stride(r); }
157
158private:
159 [[no_unique_address]] DataHandle m_data_handle {};
160 [[no_unique_address]] MappingType m_mapping {};
161 [[no_unique_address]] AccessorType m_accessor {};
162};
163
164template<concepts::LanguageArray CArray>
165requires(meta::ArrayRank<CArray> == 1)
167
168template<typename Pointer>
171
172template<typename ElementType, typename... integrals>
173requires(sizeof...(integrals) > 0 && (concepts::ConvertibleTo<integrals, size_t> && ...))
174explicit MDSpan(ElementType*, integrals...) -> MDSpan<ElementType, Dextents<size_t, sizeof...(integrals)>>;
175
176template<typename ElementType, typename OtherSizeType, size_t N>
177MDSpan(ElementType*, Span<OtherSizeType, N>) -> MDSpan<ElementType, Dextents<size_t, N>>;
178
179template<typename ElementType, typename OtherSizeType, size_t N>
180MDSpan(ElementType*, Array<OtherSizeType, N> const&) -> MDSpan<ElementType, Dextents<size_t, N>>;
181
182template<typename ElementType, typename SizeType, size_t... extents>
183MDSpan(ElementType*, Extents<SizeType, extents...> const&) -> MDSpan<ElementType, Extents<SizeType, extents...>>;
184
185template<class ElementType, class MappingType>
186MDSpan(ElementType*, MappingType const&)
187 -> MDSpan<ElementType, typename MappingType::ExtentsType, typename MappingType::LayoutType>;
188
189template<class MappingType, class AccessorType>
190MDSpan(typename AccessorType::DataHandle const&, MappingType const&, AccessorType const&)
191 -> MDSpan<typename AccessorType::ElementType, typename MappingType::ExtentsType, typename MappingType::LayoutType,
192 AccessorType>;
193}
194
195namespace di {
196using vocab::MDSpan;
197}
#define DI_ASSERT(...)
Definition assert_bool.h:7
Definition extents_forward_declaration.h:11
static constexpr auto static_extent(size_t index) -> size_t
Definition extents.h:15
static constexpr auto rank() -> size_t
Definition extents.h:55
size_t RankType
Definition extents.h:53
static constexpr auto rank_dynamic() -> size_t
Definition extents.h:56
T SizeType
Definition extents.h:52
Definition mdspan.h:18
Accessor AccessorType
Definition mdspan.h:22
OtherExtents
Definition mdspan.h:80
constexpr explicit(N !=rank_dynamic()) MDSpan(DataHandle data_handle
MDSpan(MDSpan &&)=default
constexpr auto is_contiguous() const -> bool
Definition mdspan.h:154
typename AccessorType::Reference Reference
Definition mdspan.h:29
Extents ExtentsType
Definition mdspan.h:20
constexpr auto operator[](Array< OtherSizeType, rank()> const &indices) const -> Reference
Definition mdspan.h:105
typename AccessorType::DataHandle DataHandle
Definition mdspan.h:28
typename ExtentsType::SizeType SizeType
Definition mdspan.h:26
Layout LayoutType
Definition mdspan.h:21
Element ElementType
Definition mdspan.h:24
constexpr auto operator()(Array< OtherSizeType, rank()> const &indices) const -> Reference
Definition mdspan.h:127
constexpr auto data() const -> DataHandle const &
Definition mdspan.h:145
auto operator=(MDSpan const &) -> MDSpan &=default
static constexpr auto rank() -> RankType
Definition mdspan.h:31
static constexpr auto is_always_strided() -> bool
Definition mdspan.h:151
constexpr auto is_strided() const -> bool
Definition mdspan.h:155
static constexpr auto rank_dynamic() -> RankType
Definition mdspan.h:32
constexpr MDSpan(DataHandle data_handle, ExtentsType const &ext)
Definition mdspan.h:64
constexpr auto each() const
Definition mdspan.h:131
constexpr auto mapping() const -> MappingType const &
Definition mdspan.h:146
constexpr auto extent(RankType r) const -> SizeType
Definition mdspan.h:34
constexpr auto accessor() const -> AccessorType const &
Definition mdspan.h:147
constexpr auto is_unique() const -> bool
Definition mdspan.h:153
MDSpan(MDSpan const &)=default
OtherAccessor const & other
Definition mdspan.h:82
constexpr auto stride(RankType r) const -> SizeType
Definition mdspan.h:156
meta::RemoveCV< ElementType > ValueType
Definition mdspan.h:25
constexpr auto size() const -> size_t
Definition mdspan.h:141
constexpr auto extents() const -> ExtentsType const &
Definition mdspan.h:144
typename ExtentsType::RankType RankType
Definition mdspan.h:27
auto operator=(MDSpan &&) -> MDSpan &=default
OtherLayout
Definition mdspan.h:81
static constexpr auto is_always_unique() -> bool
Definition mdspan.h:149
constexpr MDSpan(DataHandle data_handle, MappingType const &mapping, AccessorType const &accessor)
Definition mdspan.h:72
constexpr auto empty() const -> bool
Definition mdspan.h:142
constexpr Span< OtherSizeType, N > exts
Definition mdspan.h:56
static constexpr auto static_extent(RankType r) -> size_t
Definition mdspan.h:33
constexpr MDSpan(DataHandle data_handle, MappingType const &mapping)
Definition mdspan.h:68
static constexpr auto is_always_contiguous() -> bool
Definition mdspan.h:150
typename LayoutType::template Mapping< ExtentsType > MappingType
Definition mdspan.h:23
Definition span_forward_declaration.h:10
Definition operations.h:11
Definition operations.h:99
Definition operations.h:24
Definition language.h:61
constexpr auto cartesian_product
Definition cartesian_product.h:36
constexpr auto transform
Definition transform.h:28
constexpr auto range
Definition range.h:22
constexpr auto unpack
Definition unpack.h:24
constexpr auto uncurry
Definition uncurry.h:94
MakeIntegerSequence< usize, count > MakeIndexSequence
Definition algorithm.h:285
constexpr auto ArrayRank
Definition language.h:140
RemoveConst< RemoveVolatile< T > > RemoveCV
Definition core.h:57
size_t usize
Definition integers.h:33
Definition vocab.h:96
Definition lazy.h:165
MDSpan(CArray &) -> MDSpan< meta::RemoveAllExtents< CArray >, Extents< size_t, meta::Extent< CArray, 0 > > >
detail::DextentsHelper< SizeType, meta::Repeat< Constexpr< dynamic_extent >, rank > >::Type Dextents
Definition dextents.h:19
Definition zstring_parser.h:9
Definition core.h:8
Definition span_fixed_size.h:37