7#ifndef INCLUDE_GUARD_ARENE_BASE_ARENE_BASE_MDSPAN_SUBMDSPAN_EXTENTS_HPP_
8#define INCLUDE_GUARD_ARENE_BASE_ARENE_BASE_MDSPAN_SUBMDSPAN_EXTENTS_HPP_
10#include "arene/base/compiler_support/cpp14_inline.hpp"
11#include "arene/base/constraints/constraints.hpp"
12#include "arene/base/mdspan/detail/canonical_slice.hpp"
13#include "arene/base/mdspan/detail/mandate_each_argtype_is_submdspan_slice.hpp"
14#include "arene/base/mdspan/detail/map_rank.hpp"
15#include "arene/base/mdspan/detail/to_array.hpp"
16#include "arene/base/mdspan/extents.hpp"
17#include "arene/base/mdspan/full_extent.hpp"
18#include "arene/base/mdspan/slice.hpp"
19#include "arene/base/mdspan/submdspan_canonicalize_slices.hpp"
20#include "arene/base/mdspan/submdspan_subextents_type.hpp"
21#include "arene/base/stdlib_choice/cstddef.hpp"
22#include "arene/base/stdlib_choice/enable_if.hpp"
23#include "arene/base/stdlib_choice/forward.hpp"
24#include "arene/base/stdlib_choice/integer_sequence.hpp"
25#include "arene/base/stdlib_choice/integral_constant.hpp"
26#include "arene/base/stdlib_choice/move.hpp"
27#include "arene/base/stdlib_choice/tuple.hpp"
28#include "arene/base/stdlib_choice/tuple_element.hpp"
29#include "arene/base/tuple/detail/get.hpp"
30#include "arene/base/tuple/detail/tuple_transform.hpp"
31#include "arene/base/type_traits/is_invocable.hpp"
38namespace submdspan_extents_detail {
54template <std::size_t... Is,
class Tuple,
class LiftedInverseMapping>
55constexpr auto filter_impl(std::index_sequence<Is...>, Tuple&& tuple, LiftedInverseMapping)
noexcept
56 -> std::tuple<std::tuple_element_t<LiftedInverseMapping::value[Is], Tuple>...> {
57 return std::tuple<std::tuple_element_t<LiftedInverseMapping::value[Is], Tuple>...>{
58 tuple_detail::get<LiftedInverseMapping::value[Is]>(std::forward<Tuple>(tuple))...
74template <
class Tuple,
class LiftedInverseMapping>
75constexpr auto filter(Tuple tuple, LiftedInverseMapping)
noexcept
76 ->
decltype(filter_impl(
77 std::make_index_sequence<LiftedInverseMapping::value.size()>{},
79 LiftedInverseMapping{}
82 std::make_index_sequence<LiftedInverseMapping::value.size()>{},
84 LiftedInverseMapping{}
96class submdspan_extents_fn {
98 class extent_from_slice {
107 template <
class IndexType,
class Offset,
class Extent,
class Stride>
108 constexpr auto operator()(IndexType
const&, extent_slice<Offset, Extent, Stride> slice)
const noexcept
117 template <
class IndexType>
118 constexpr auto operator()(IndexType
const& ext, full_extent_t)
const noexcept -> IndexType {
174 std::size_t... Extents,
175 class... SliceSpecifiers,
176 constraints<std::enable_if_t<
sizeof...(Extents) ==
sizeof...(SliceSpecifiers)>> =
nullptr,
177 std::nullptr_t = mdspan_detail::mandate_each_argtype_is_submdspan_slice<IndexType, SliceSpecifiers...>()
179 constexpr auto operator()(extents<IndexType, Extents...>
const& src, SliceSpecifiers... slices)
const noexcept(
180 is_nothrow_invocable_v<
181 decltype(submdspan_canonicalize_slices),
182 extents<IndexType, Extents...>
const& ,
183 SliceSpecifiers&&...>
184 ) -> submdspan_subextents_type_t<extents<IndexType, Extents...>, SliceSpecifiers...> {
188 constexpr auto lifted_inverse_mapping = std::integral_constant<
189 decltype((mdspan_detail::inverse_map_rank<mdspan_detail::canonical_slice_t<IndexType, SliceSpecifiers>...>)),
190 mdspan_detail::inverse_map_rank<mdspan_detail::canonical_slice_t<IndexType, SliceSpecifiers>...>>{};
197 return submdspan_subextents_type_t<extents<IndexType, Extents...>, SliceSpecifiers...>{
198 tuple_detail::tuple_transform_to_array<IndexType>(
199 filter(mdspan_detail::to_array(src), lifted_inverse_mapping),
200 filter(submdspan_canonicalize_slices(src, std::move(slices)...), lifted_inverse_mapping),
Definition array_exceptions_disabled.cpp:11
ARENE_CPP14_INLINE_VARIABLE(submdspan_extents_detail::submdspan_extents_fn, submdspan_extents)
Copyright 2026, Toyota Motor Corporation.
Definition array_exceptions_disabled.cpp:10