7#ifndef INCLUDE_GUARD_ARENE_BASE_ARENE_BASE_MDSPAN_SUBMDSPAN_CANONICALIZE_SLICES_HPP_
8#define INCLUDE_GUARD_ARENE_BASE_ARENE_BASE_MDSPAN_SUBMDSPAN_CANONICALIZE_SLICES_HPP_
10#include "arene/base/compiler_support/cpp14_inline.hpp"
11#include "arene/base/constraints/constraints.hpp"
12#include "arene/base/contracts/contract.hpp"
13#include "arene/base/mdspan/detail/canonical_slice.hpp"
14#include "arene/base/mdspan/detail/is_valid_submdspan_slice_for.hpp"
15#include "arene/base/mdspan/detail/is_valid_submdspan_slice_type_for.hpp"
16#include "arene/base/mdspan/detail/mandate_each_argtype_is_submdspan_slice.hpp"
17#include "arene/base/mdspan/detail/to_array.hpp"
18#include "arene/base/mdspan/extents.hpp"
19#include "arene/base/stdlib_choice/cstddef.hpp"
20#include "arene/base/stdlib_choice/declval.hpp"
21#include "arene/base/stdlib_choice/enable_if.hpp"
22#include "arene/base/stdlib_choice/logical_and.hpp"
23#include "arene/base/stdlib_choice/make_tuple.hpp"
24#include "arene/base/stdlib_choice/move.hpp"
25#include "arene/base/tuple/detail/tuple_transform_reduce.hpp"
26#include "arene/base/type_traits/all_of.hpp"
27#include "arene/base/type_traits/is_invocable.hpp"
35namespace submdspan_canonicalize_slices_detail {
39class submdspan_canonicalize_slices_fn {
72 std::size_t... Extents,
73 class... SliceSpecifiers,
74 constraints<std::enable_if_t<
sizeof...(Extents) ==
sizeof...(SliceSpecifiers)>> =
nullptr,
75 std::nullptr_t = mdspan_detail::mandate_each_argtype_is_submdspan_slice<IndexType, SliceSpecifiers...>()>
76 constexpr auto operator()(extents<IndexType, Extents...>
const& src, SliceSpecifiers... slices)
const noexcept(
77 all_of_v<is_nothrow_invocable_v<mdspan_detail::canonical_slice_fn<IndexType>, SliceSpecifiers&&>...>
78 ) ->
decltype(std::make_tuple(std::declval<mdspan_detail::canonical_slice_t<IndexType, SliceSpecifiers>>()...)) {
79 using mdspan_detail::is_valid_submdspan_slice_type_for_v;
81 all_of_v<is_valid_submdspan_slice_type_for_v<
82 mdspan_detail::canonical_slice_t<IndexType, SliceSpecifiers>,
84 "each type in 'SliceSpecifiers' must be a valid 'submdspan' slice type for the associated extent"
87 auto const canonicalized = std::make_tuple(mdspan_detail::canonical_slice<IndexType>(std::move(slices))...);
89 ARENE_PRECONDITION(tuple_detail::tuple_transform_reduce(
91 mdspan_detail::to_array(src),
94 mdspan_detail::is_valid_submdspan_slice_for
115 submdspan_canonicalize_slices_detail::submdspan_canonicalize_slices_fn,
Definition array_exceptions_disabled.cpp:11
ARENE_CPP14_INLINE_VARIABLE(submdspan_canonicalize_slices_detail::submdspan_canonicalize_slices_fn, submdspan_canonicalize_slices)
Copyright 2026, Toyota Motor Corporation.
Definition array_exceptions_disabled.cpp:10