Namespaces
Variants

C++ named requirements: LayoutMapping (since C++23)

From cppreference.net
C++ named requirements

LayoutMapping управляет отображением многомерного индекса в одномерное смещение к дескриптору данных в std:: mdspan .

Содержание

Требования

Тип M удовлетворяет требованиям LayoutMapping , если он моделирует copyable и equality_comparable , и следующие условия являются true :

**Примечание:** Весь представленный код на C++ оставлен без изменений в соответствии с требованиями, включая HTML-теги, атрибуты и содержимое внутри тегов ` `. В данном фрагменте отсутствует переводимый текст за пределами 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
  • Возвращает неотрицательное целое число o такое, что o < std:: numeric_limits < typename M​ :: ​index_type > :: ​max ( ) и o <= std:: numeric_limits < std:: size_t > :: ​max ( ) оба равны true .
  • Такое выражение эквивалентно m ( static_cast < typename M :: index_type > ( i ) ... ) .
m. required_span_size ( ) typename M​ :: ​index_type
  • Возвращает 1 плюс максимальное значение m ( i... ) для всех i если размер многомерного индексного пространства m. extents ( ) не равен 0.
  • В противном случае возвращает 0 .
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_strided ( ) равно true .
  • Возвращает шаг s_r по индексу ранга r , как определено в m. is_strided ( ) выше.
M :: is_always_unique ( ) bool
  • Возвращает true только если m. is_unique ( ) равно true для всех возможных объектов m типа M . [примечание 4]
  • Возвращаемое значение всегда является константным выражением.
M :: is_always_exhaustive ( ) bool
  • Возвращает true только если m. is_exhaustive ( ) равно true для всех возможных объектов m типа M . [примечание 5]
  • Возвращаемое значение всегда является константным выражением.
M :: is_always_strided ( ) bool
  • Возвращает true только если m. is_strided ( ) равно true для всех возможных объектов m типа M . [примечание 6]
  • Возвращаемое значение всегда является константным выражением.
  1. Отображение может возвращать false даже если условие выполняется. Для некоторых layout'ов может быть нецелесообразно эффективно определять, является ли layout уникальным.
  2. То же самое, что и выше, но в случае exhaustive layouts.
  3. То же самое, что и выше, но в случае strided layouts.
  4. Отображение может возвращать false даже если условие выполняется. Для некоторых layout mappings может быть нецелесообразно определять, является ли каждый экземпляр уникальным.
  5. То же самое, что и выше, но в случае exhaustive instances.
  6. То же самое, что и выше, но в случае strided instances.

Концепция

Для ограничений, используемых в 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> )

Смотрите также