C++ named requirements: LayoutMapping (since 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 >
`. В данном фрагменте отсутствует переводимый текст за пределами C++ кода.
И, учитывая следующие типы и значения, выражения, приведенные в таблице ниже, являются допустимыми и имеют указанную семантику:
Легенда
| Тип | Определение |
M
|
класс отображения компоновки |
| Значение | Определение |
| m |
значение типа (возможно, с квалификатором const)
M
|
| i , j | наборы (возможно, с квалификатором const) целых чисел, которые являются многомерными индексами в m. extents ( ) |
| r | (возможно, с квалификатором const) индекс ранга typename M :: extents_type |
| d_r | набор (возможно, с квалификатором const) целых чисел, для которых sizeof... ( d_r ) == M :: extents_type :: rank ( ) равно true , элемент с индексом ранга r равен 1 , а все остальные элементы равны 0 |
Типы членов
| Название | Тип | Требования |
|---|---|---|
M::extents_type
|
Специализация шаблона класса std:: extents | |
M::index_type
|
typename M :: extents_type :: index_type | |
M::rank_type
|
typename M :: extents_type :: rank_type | |
M::layout_type
|
Политика маппинга размещения
MP
где
typename
MP
::
template
mapping
<
E
>
является
M
для некоторого типа размерностей
E
|
LayoutMappingPolicy
для которого
M
является типом маппинга
MP
|
Функции-члены и операторы
| Expression | Return type | Semantics |
|---|---|---|
| m. extents ( ) | const typename M :: extents_type & | Возвращает константную ссылку на связанное многомерное индексное пространство |
| m ( i... ) | typename M :: index_type |
|
| m. required_span_size ( ) | typename M :: 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 ) | typename M :: index_type |
|
| M :: is_always_unique ( ) | bool |
|
| M :: is_always_exhaustive ( ) | bool |
|
| M :: is_always_strided ( ) | bool |
|
- ↑ Отображение может возвращать false даже если условие выполняется. Для некоторых layout'ов может быть нецелесообразно эффективно определять, является ли layout уникальным.
- ↑ То же самое, что и выше, но в случае exhaustive layouts.
- ↑ То же самое, что и выше, но в случае strided layouts.
- ↑ Отображение может возвращать false даже если условие выполняется. Для некоторых layout mappings может быть нецелесообразно определять, является ли каждый экземпляр уникальным.
- ↑ То же самое, что и выше, но в случае exhaustive instances.
- ↑ То же самое, что и выше, но в случае strided instances.
Концепция
Для ограничений, используемых в std::layout_stride::mapping , определено следующее концептуальное описание (только для экспозиции).
|
template
<
class
M
>
concept
/*layout-mapping-alike*/
=
requires
|
( только для демонстрации* ) | |
Определяет минимальные ограничения применимости для требования 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>
)
|