Именованные требования C++: LayoutMapping (начиная с C++23)
LayoutMapping управляет отображением многомерного индекса в одномерное смещение относительно дескриптора данных в std::mdspan.
Требования
Тип M удовлетворяет требованиям LayoutMapping, если он моделирует copyable и equality_comparable, а также выполняются следующие условия true:
std::is_nothrow_move_constructible_v<M>std::is_nothrow_move_assignable_v<M>std::is_nothrow_swappable_v<M>
Кроме того, для следующих типов и значений выражения из приведённой ниже таблицы являются допустимыми и имеют указанный смысл:
Обозначения
| Тип | Определение |
|---|---|
M | класс отображения компоновки |
| Значение | Определение |
m | значение типа (возможно, квалифицированного как const) M |
i, j | пакеты целых чисел (возможно, квалифицированных как const), являющиеся многомерными индексами в m.extents() |
r | индекс ранга (возможно, квалифицированный как const) типа typenameM::extents_type |
d_r | пакет целых чисел (возможно, квалифицированных как const), для которого sizeof...(d_r) == M::extents_type::rank() — true, элемент с индексом ранга r равен 1, а все остальные элементы равны 0 |
Типы-члены
| Имя | Тип | Требования |
|---|---|---|
M::extents_type | Специализация шаблона класса std::extents | |
M::index_type | typenameM::extents_type::index_type | |
M::rank_type | typenameM::extents_type::rank_type | |
M::layout_type | Политика отображения компоновки MP, где typenameMP::templatemapping<E> является Mдля некоторого типа границ E
|
LayoutMappingPolicy, для которого M является типом отображения MP |
Функции-члены и операторы
| Выражение | Возвращаемый тип | Семантика |
|---|---|---|
m.extents() | consttypenameM::extents_type& | Возвращает константную ссылку на связанное пространство многомерных индексов |
m(i...) | typenameM::index_type |
|
m.required_span_size() | typenameM::index_type |
|
m.is_unique() | bool | Возвращает true только в том случае, если для каждого i и j, где (i != j || ...) является true, m(i...) != m(j...) является true. [примечание 1] |
m.is_exhaustive() | bool | Возвращает true только в том случае, если для всех k в диапазоне [0, m.required_span_size()) существует i, такое что m(i...) равно k. [примечание 2] |
m.is_strided() | bool | Возвращает true только в том случае, если для каждого индекса ранга r типа m.extents() существует целое число s_r, такое что для всех i, где (i + d_r) является многомерным индексом в m.extents(), m((i + d_r)...) - m(i...) равно s_r. [примечание 3] |
m.stride(r) | typenameM::index_type |
|
M::is_always_unique() | bool |
|
M::is_always_exhaustive() | bool |
|
M::is_always_strided() | bool |
|
- Отображение может возвращать
false, даже если условие выполняется. Для некоторых компоновок может быть невозможно эффективно определить, является ли компоновка уникальной. - То же, что и выше, но для исчерпывающих компоновок.
- То же, что и выше, но для компоновок с шагами.
- Отображение может возвращать
false, даже если условие выполняется. Для некоторых отображений компоновки может быть невозможно определить, является ли каждый экземпляр уникальным. - То же, что и выше, но для исчерпывающих экземпляров.
- То же, что и выше, но для экземпляров с шагами.
Концепт
Для использования в ограничениях под std::layout_stride::mapping определяется следующий концепт, предназначенный только для описания.
template< class M >
concept /*layout-mapping-alike*/ = requires
{
requires /*is-extents*/<typename M::extents_type>;
{ M::is_always_strided() } -> std::same_as<bool>;
{ M::is_always_exhaustive() } -> std::same_as<bool>;
{ M::is_always_unique() } -> std::same_as<bool>;
std::bool_constant<M::is_always_strided()>::value;
std::bool_constant<M::is_always_exhaustive()>::value;
std::bool_constant<M::is_always_unique()>::value;
};
| (только для описания*) |
Определяет минимальные требования к использованию для требования LayoutMapping. Этот концепт проверяет, что приведённые выше функции-предикаты свойств отображения существуют, являются константными выражениями и имеют возвращаемый тип bool.
/*is-extents*/<E> является true тогда и только тогда, когда E является специализацией std::extents.
Стандартная библиотека
Следующие типы стандартной библиотеки удовлетворяют требованиям LayoutMapping:
отображение компоновки layout_left(открытый шаблон класса-члена std::layout_left) |
|
отображение компоновки layout_right(открытый шаблон класса-члена std::layout_right) |
|
отображение компоновки layout_stride(открытый шаблон класса-члена std::layout_stride) |
|
отображение компоновки layout_left_padded(открытый шаблон класса-члена std::layout_left_padded<PaddingValue>) |
|
отображение компоновки layout_right_padded(открытый шаблон класса-члена std::layout_right_padded<PaddingValue>) |
См. также
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/named_req/LayoutMapping