Spec-Zone.ru › C++

Именованные требования 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
  • Возвращает неотрицательное целое число 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() typenameM​::​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) typenameM​::​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, даже если условие выполняется. Для некоторых компоновок может быть невозможно эффективно определить, является ли компоновка уникальной.
  2. То же, что и выше, но для исчерпывающих компоновок.
  3. То же, что и выше, но для компоновок с шагами.
  4. Отображение может возвращать false, даже если условие выполняется. Для некоторых отображений компоновки может быть невозможно определить, является ли каждый экземпляр уникальным.
  5. То же, что и выше, но для исчерпывающих экземпляров.
  6. То же, что и выше, но для экземпляров с шагами.

Концепт

Для использования в ограничениях под 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:

mapping
отображение компоновки layout_left
(открытый шаблон класса-члена std::layout_left)
mapping
отображение компоновки layout_right
(открытый шаблон класса-члена std::layout_right)
mapping
отображение компоновки layout_stride
(открытый шаблон класса-члена std::layout_stride)
mapping
отображение компоновки layout_left_padded
(открытый шаблон класса-члена std::layout_left_padded<PaddingValue>)
mapping
отображение компоновки layout_right_padded
(открытый шаблон класса-члена std::layout_right_padded<PaddingValue>)

См. также

  • LayoutMappingPolicy

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/named_req/LayoutMapping

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API