3#ifndef TETL_MDSPAN_SUBMDSPAN_EXTENTS_HPP
4#define TETL_MDSPAN_SUBMDSPAN_EXTENTS_HPP
20template <etl::
size_t K,
typename Extent,
typename Sk>
21constexpr auto submdspan_static_extent()
23 using IndexT =
typename Extent::index_type;
27 return Extent::static_extent(Extent::rank() - K);
28 }
else if constexpr (index_pair_like<Sk, IndexT>) {
31 if constexpr (integral_constant_like<FirstT> and integral_constant_like<SecondT>) {
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) {
39 }
else if constexpr (integral_constant_like<ExtT> and integral_constant_like<StrideT>) {
40 return 1 + (de_ice(ExtT()) - 1) / de_ice(StrideT());
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& , SlicesAndExtents... slicesAndExtents)
54 return submdspan_extents_builder<
57 Extents::static_extent(Extents::rank() - K),
58 NewExtents...>::next(ext, slicesAndExtents..., ext.extent(Extents::rank() - K));
60 return submdspan_extents_builder<K - 1, Extents, NewExtents...>::next(ext, slicesAndExtents...);
61 }
else if constexpr (is_strided_slice<Slice>) {
64 constexpr auto newStaticExt = submdspan_static_extent<K, Extents, Slice>();
65 return submdspan_extents_builder<K - 1, Extents, newStaticExt, NewExtents...>::next(
73template <
typename Extents,
size_t... NewStaticExtents>
74struct submdspan_extents_builder<0, Extents, NewStaticExtents...> {
76 template <
typename... NewExtents>
77 static constexpr auto next(Extents
const& , NewExtents... newExts)
79 return etl::extents<
typename Extents::index_type, NewStaticExtents...>(newExts...);
85template <
typename IndexT,
etl::size_t... Extents,
typename... SliceSpecifiers>
90 return detail::submdspan_extents_builder<ext_t::rank(), ext_t>
::next(ext, slices...);
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