5#ifndef INCLUDE_GUARD_ARENE_BASE_ARENE_BASE_MDSPAN_IS_LAYOUT_MAPPING_HPP_
6#define INCLUDE_GUARD_ARENE_BASE_ARENE_BASE_MDSPAN_IS_LAYOUT_MAPPING_HPP_
9#include "arene/base/constraints/constraints.hpp"
10#include "arene/base/mdspan/extents.hpp"
11#include "arene/base/stdlib_choice/cstdint.hpp"
12#include "arene/base/stdlib_choice/declval.hpp"
13#include "arene/base/stdlib_choice/enable_if.hpp"
14#include "arene/base/stdlib_choice/integer_sequence.hpp"
15#include "arene/base/stdlib_choice/is_move_assignable.hpp"
16#include "arene/base/stdlib_choice/is_move_constructible.hpp"
17#include "arene/base/stdlib_choice/is_same.hpp"
18#include "arene/base/type_traits/comparison_traits.hpp"
19#include "arene/base/type_traits/is_copyable.hpp"
20#include "arene/base/type_traits/is_invocable.hpp"
21#include "arene/base/type_traits/is_swappable.hpp"
27namespace is_layout_mapping_detail {
36 typename = std::make_integer_sequence<
typename T::index_type, T::extents_type::rank()>,
37 typename = constraints<>>
38extern constexpr bool is_invocable_with_extents_indices_v =
false;
47template <
typename T,
typename IndexType, IndexType... Indices>
48extern constexpr bool is_invocable_with_extents_indices_v<
50 std::integer_sequence<IndexType, Indices...>,
51 constraints<std::enable_if_t<is_invocable_v<T
const&,
decltype(Indices)...>>>> =
52 std::is_same<invoke_result_t<T
const&,
decltype(Indices)...>, IndexType>::value;
79template <
typename T,
typename = constraints<>>
80extern constexpr bool is_basic_layout_mapping_v =
false;
108extern constexpr bool is_basic_layout_mapping_v<
111 typename T::extents_type,
112 typename T::index_type,
113 typename T::rank_type,
114 typename T::layout_type,
115 decltype(std::declval<T
const&>().extents()),
116 decltype(std::declval<T
const&>().required_span_size()),
117 decltype(std::declval<T
const&>().is_unique()),
118 decltype(std::declval<T
const&>().is_exhaustive()),
119 decltype(std::declval<T
const&>().is_strided()),
120 decltype(T::is_always_unique()),
121 decltype(T::is_always_strided()),
122 decltype(T::is_always_exhaustive()),
123 std::enable_if_t<(
static_cast<
void>(T::is_always_unique()),
true)>,
124 std::enable_if_t<(
static_cast<
void>(T::is_always_strided()),
true)>,
125 std::enable_if_t<(
static_cast<
void>(T::is_always_exhaustive()),
true)>,
126 std::enable_if_t<is_extents_v<
typename T::extents_type>>,
127 std::enable_if_t<is_copyable_v<T>>,
128 std::enable_if_t<std::is_nothrow_move_constructible<T>::value>,
129 std::enable_if_t<std::is_nothrow_move_assignable<T>::value>,
130 std::enable_if_t<is_nothrow_swappable_v<T>>,
131 std::enable_if_t<is_equality_comparable_v<T>>>> =
132 std::is_same<
typename T::index_type,
typename T::extents_type::index_type>::value &&
133 std::is_same<
typename T::rank_type,
typename T::extents_type::rank_type>::value &&
134 std::is_same<
decltype(std::declval<T
const&>().extents()),
typename T::extents_type
const&>::value &&
135 std::is_same<
decltype(std::declval<T
const&>().required_span_size()),
typename T::index_type>::value &&
136 std::is_same<
decltype(std::declval<T
const&>().is_unique()),
bool>::value &&
137 std::is_same<
decltype(std::declval<T
const&>().is_exhaustive()),
bool>::value &&
138 std::is_same<
decltype(std::declval<T
const&>().is_strided()),
bool>::value &&
139 std::is_same<
decltype(T::is_always_unique()),
bool>::value &&
140 std::is_same<
decltype(T::is_always_exhaustive()),
bool>::value &&
141 std::is_same<
decltype(T::is_always_strided()),
bool>::value && is_invocable_with_extents_indices_v<T>;
145using sample_extents_1 = dextents<std::int32_t, 5>;
147using sample_extents_2 = extents<std::uint16_t, 1, 2, 3, 4>;
157template <
typename T,
typename = constraints<>>
158extern constexpr bool is_layout_mapping_policy_v =
false;
169extern constexpr bool is_layout_mapping_policy_v<
172 std::enable_if_t<is_basic_layout_mapping_v<
typename T::
template mapping<sample_extents_1>>>,
174 std::is_same<
typename T::
template mapping<sample_extents_1>::extents_type, sample_extents_1>::value>,
175 std::enable_if_t<std::is_same<
typename T::
template mapping<sample_extents_1>::layout_type, T>::value>,
176 std::enable_if_t<is_basic_layout_mapping_v<
typename T::
template mapping<sample_extents_2>>>,
178 std::is_same<
typename T::
template mapping<sample_extents_2>::extents_type, sample_extents_2>::value>,
179 std::enable_if_t<std::is_same<
typename T::
template mapping<sample_extents_2>::layout_type, T>::value>>> =
true;
207template <
typename T,
typename = constraints<>>
208extern constexpr bool is_layout_mapping_v =
false;
237extern constexpr bool is_layout_mapping_v<
240 std::enable_if_t<is_basic_layout_mapping_v<T>>,
242 std::is_same<
typename T::layout_type::
template mapping<
typename T::extents_type>, T>::value>>> =
243 is_layout_mapping_policy_v<
typename T::layout_type>;
Definition array_exceptions_disabled.cpp:11
constexpr bool is_layout_mapping_v
Helper trait to indicate if the given type has all the basic properties required of a layout mapping:
constexpr bool is_layout_mapping_policy_v
Helper trait to check if T is a valid layout mapping policy.
Copyright 2026, Toyota Motor Corporation.
Definition array_exceptions_disabled.cpp:10