tetl 0.1.0
Embedded Template Library
Loading...
Searching...
No Matches
submdspan_extents.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSL-1.0
2
3#ifndef TETL_MDSPAN_SUBMDSPAN_EXTENTS_HPP
4#define TETL_MDSPAN_SUBMDSPAN_EXTENTS_HPP
5
15
16namespace etl {
17
18namespace detail {
19
20template <etl::size_t K, typename Extent, typename Sk>
21constexpr auto submdspan_static_extent()
22{
23 using IndexT = typename Extent::index_type;
24
25 if constexpr (Extent::static_extent(Extent::rank() - K) != etl::dynamic_extent) {
27 return Extent::static_extent(Extent::rank() - K);
28 } else if constexpr (index_pair_like<Sk, IndexT>) {
29 using FirstT = etl::tuple_element_t<0, Sk>;
30 using SecondT = etl::tuple_element_t<1, Sk>;
31 if constexpr (integral_constant_like<FirstT> and integral_constant_like<SecondT>) {
33 }
34 } else if constexpr (is_strided_slice<Sk>) {
35 using ExtT = typename Sk::extent_type;
36 using StrideT = typename Sk::stride_type;
37 if constexpr (integral_constant_like<ExtT> and not integral_constant_like<StrideT> and ExtT() == 0) {
38 return 0;
39 } else if constexpr (integral_constant_like<ExtT> and integral_constant_like<StrideT>) {
40 return 1 + (de_ice(ExtT()) - 1) / de_ice(StrideT());
41 }
42 }
43 }
44
46}
47
48template <etl::size_t K, typename Extents, size_t... NewExtents>
49struct submdspan_extents_builder {
50 template <typename Slice, typename... SlicesAndExtents>
51 static constexpr auto next(Extents const& ext, Slice const& /*unused*/, SlicesAndExtents... slicesAndExtents)
52 {
54 return submdspan_extents_builder<
55 K - 1,
56 Extents,
57 Extents::static_extent(Extents::rank() - K),
58 NewExtents...>::next(ext, slicesAndExtents..., ext.extent(Extents::rank() - K));
59 } else if constexpr (etl::is_convertible_v<Slice, etl::size_t>) {
60 return submdspan_extents_builder<K - 1, Extents, NewExtents...>::next(ext, slicesAndExtents...);
61 } else if constexpr (is_strided_slice<Slice>) {
62 static_assert(etl::always_false<Slice>);
63 } else {
64 constexpr auto newStaticExt = submdspan_static_extent<K, Extents, Slice>();
65 return submdspan_extents_builder<K - 1, Extents, newStaticExt, NewExtents...>::next(
66 ext,
67 slicesAndExtents...
68 );
69 }
70 }
71};
72
73template <typename Extents, size_t... NewStaticExtents>
74struct submdspan_extents_builder<0, Extents, NewStaticExtents...> {
75
76 template <typename... NewExtents>
77 static constexpr auto next(Extents const& /*unused*/, NewExtents... newExts)
78 {
79 return etl::extents<typename Extents::index_type, NewStaticExtents...>(newExts...);
80 }
81};
82
83} // namespace detail
84
85template <typename IndexT, etl::size_t... Extents, typename... SliceSpecifiers>
86[[nodiscard]] constexpr auto submdspan_extents(etl::extents<IndexT, Extents...> const& ext, SliceSpecifiers... slices)
87 requires(sizeof...(slices) == etl::extents<IndexT, Extents...>::rank())
88{
89 using ext_t = etl::extents<IndexT, Extents...>;
90 return detail::submdspan_extents_builder<ext_t::rank(), ext_t>::next(ext, slices...);
91}
92
93} // namespace etl
94
95#endif // TETL_MDSPAN_SUBMDSPAN_EXTENTS_HPP
constexpr auto next(InputIt it, typename iterator_traits< InputIt >::difference_type n=1) -> InputIt
Return the nth successor of iterator it.
Definition next.hpp:14
constexpr auto dynamic_extent
etl::dynamic_extent is a constant of type etl::size_t that is used to differentiate etl::span of stat...
Definition dynamic_extent.hpp:14
Definition adjacent_find.hpp:8
extents(Integrals...) -> extents< etl::size_t, etl::size_t((Integrals(), etl::dynamic_extent))... >
constexpr bool always_false
Definition always_false.hpp:9
constexpr bool is_convertible_v
Definition is_convertible.hpp:46
typename tuple_element< I, T >::type tuple_element_t
Definition tuple_element.hpp:20
TETL_BUILTIN_SIZET size_t
etl::size_t is the unsigned integer type of the result of the sizeof operator.
Definition size_t.hpp:14
constexpr auto submdspan_extents(etl::extents< IndexT, Extents... > const &ext, SliceSpecifiers... slices)
Definition submdspan_extents.hpp:86
Definition extents.hpp:22
static constexpr auto rank() noexcept -> rank_type
Definition extents.hpp:53