Requisitos denominados de C++: LayoutMapping (desde C++23)
LayoutMapping controla la asignación de un índice multidimensional a un desplazamiento unidimensional al controlador de datos en std::mdspan.
Requisitos
Un tipo M satisafce LayoutMapping si modela copiable y comparable_en_igualdad, y se cumple lo siguiente:
std::is_nothrow_move_constructible_v<M>std::is_nothrow_move_assignable_v<M>std::is_nothrow_swappable_v<M>
Y, dados los siguientes tipos y valores, las expresiones que se muestran en la tabla a continuación son válidas y tienen la semántica indicada:
Leyenda
| Tipo | Definición |
M
|
Una clase de mapeo de diseño. |
| Valor | Definición |
m
|
Un valor de tipo (que puede estar calificado constante) M.
|
i, j
|
Paquetes de enteros (que pueden estar calificados constantes) que son índices multidimensionales en m.extents().
|
r
|
Un índice de rango (que puede estar calificado constante) de typename M::extents_type.
|
d_r
|
Un paquete de enteros (que pueden estar calificados constantes) para los que sizeof...(d_r) == M::extents_type::rank() es true, el elemento en el índice de rango r es igual a 1, y todos los demás elementos son iguales a 0.
|
Tipos miembro
| Nombre | Tipo | Requisitos |
|---|---|---|
M::extents_type |
Especialización de la plantilla de clase std::extents |
|
M::index_type |
typename M::extents_type::index_type |
|
M::rank_type |
typename M::extents_type::rank_type |
|
M::layout_type |
Política de mapeo de diseño MP donde typename MP::template mapping<E> es Mpara algunas extensiones de tipo E |
PolíticaMapeoDiseño para la cual M es el tipo de mapeo de MP
|
Funciones miembro y operadores
| Expresión | Tipo devuelto | Semántica |
|---|---|---|
m.extents() |
const typename M::extents_type& |
Devuelve una referencia constante al espacio de índice multidimensional |
m(i...) |
typename M::index_type |
|
m.required_span_size() |
typename M::index_type |
|
m.is_unique() |
bool |
Devuelve true sólo si para cada i y j donde (i != j || ...) es true, m(i...) != m(j...) es true. [note 1]
|
m.is_exhaustive() |
bool |
Devuelve true solo si para todos los k en el rango [0, m.required_span_size()), existe un i tal que m(i...) es igual a k. [note 2]
|
m.is_strided() |
bool |
Devuelve true solo si para cada índice de rango r de m.extents(), existe un entero s_r tal que, para todo i donde (i + d_r) es un índice multidimensional en m.extents(), m((i + d_r)...) - m(i...) es igual a s_r. [note 3]
|
m.stride(r) |
typename M::index_type |
|
M::is_always_unique() |
bool |
|
M::is_always_exhaustive() |
bool |
|
M::is_always_strided() |
bool |
|
- ↑ Un mapeo puede devolver
falseincluso si se cumple la condición. Para ciertos diseños, es posible que no sea posible determinar con eficiencia si el diseño es único. - ↑ Lo mismo que el anterior, pero en el caso de diseños exhaustivos.
- ↑ Igual que el anterior, pero en el caso de diseños escalonados.
- ↑ Un mapeo puede devolver
falseincluso si se cumple la condición. Para ciertos mapeos de diseño, puede no ser posible determinar si cada instancia es única. - ↑ Lo mismo que el anterior, pero en el caso de instancias exhaustivas.
- ↑ La mismo que el anterior, pero en el caso de instancias escalonadas.
Concepto
Para los usos de restricciones bajo std::layout_stride::mapping, se define el siguiente concepto de solo exposisición.
template< class M > concept /*mapeo de diseño similar*/ = requires { requires /*es extensión*/<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; }; |
(solo de exposición*) | |
Define las restricciones mínimas de usabilidad del requisito LayoutMapping. Este concepto comprueba que las funciones de atributo de mapeo de predicados mencionadas anteriormente existan, sena expresiones constantes, y tenga un tipo de retorno bool.
/*es extención*/<E> es true solo si E es una especialización de std::extents.
Biblioteca estándar
Los siguientes tipos de la biblioteca estándar satisfacen los requisitos de LayoutMapping:
| Un mapeo de diseño de layout_left. (plantilla de clase miembro pública de std::layout_left)
| |
| Un mapeo de diseño de layout_right. (plantilla de clase miembro pública de std::layout_right)
| |
| Un mapeo de diseño de layout_stride. (plantilla de clase miembro pública de std::layout_stride)
| |
| Un mapeo de diseño de layout_left_padded. (plantilla de clase miembro pública de std::layout_left_padded<PaddingValue>)
| |
| Un mapeo de diseño de layout_right_padded. (plantilla de clase miembro pública de std::layout_right_padded<PaddingValue>)
|