C++-Namensanforderungen: LayoutMapping (seit C++23)
LayoutMapping steuert die Abbildung eines mehrdimensionalen Index auf einen eindimensionalen Offset für den Datenhandle in std::mdspan.
Inhalt |
[bearbeiten] Anforderungen
Ein Typ M erfüllt LayoutMapping, wenn er copyable und equality_comparable modelliert und Folgendes gilt true
- std::is_nothrow_move_constructible_v<M>
- std::is_nothrow_move_assignable_v<M>
- std::is_nothrow_swappable_v<M>
Und, unter den folgenden Typen und Werten, sind die in der folgenden Tabelle gezeigten Ausdrücke gültig und haben die angegebene Semantik
[bearbeiten] Legende
| Typ | Definition |
M
|
eine Layout-Mapping-Klasse |
| Wert | Definition |
| m | ein Wert vom Typ (möglicherweise konstantenqualifiziert) M |
| i, j | Packete von (möglicherweise konstantenqualifizierten) ganzen Zahlen, die mehrdimensionale Indizes in m.extents() sind |
| r | ein (möglicherweise konstantenqualifizierter) Rangindex von typename M::extents_type |
| d_r | ein Paket von (möglicherweise konstantenqualifizierten) ganzen Zahlen, für die sizeof...(d_r) == M::extents_type::rank() gilt true, das Element am Rangindex r gleich 1 ist und alle anderen Elemente gleich 0 sind |
[bearbeiten] Mitgliedstypen
| Name | Typ | Anforderungen |
|---|---|---|
M::extents_type |
Spezialisierung der Klassenschablone std::extents | |
M::index_type |
typename M::extents_type::index_type | |
M::rank_type |
typename M::extents_type::rank_type | |
M::layout_type |
Layout-Mapping-Richtlinie MP, bei der typename MP::template mapping<E> M istfür einen beliebigen Extents-Typ E |
LayoutMappingPolicy, für die M der Mapping-Typ von MP ist |
[bearbeiten] Member-Funktionen und Operatoren
| Ausdruck | Rückgabetyp | Semantik |
|---|---|---|
| m.extents() | const typename M::extents_type& | Gibt eine konstante Referenz auf den zugehörigen mehrdimensionalen Indexraum zurück. |
| m(i...) | typename M::index_type |
|
| m.required_span_size() | typename M::index_type |
|
| m.is_unique() | bool | Gibt true nur dann zurück, wenn für alle i und j, für die (i != j || ...) gilt true, m(i...) != m(j...) gilt true. [Anmerkung 1] |
| m.is_exhaustive() | bool | Gibt true nur dann zurück, wenn für alle k im Bereich [0, m.required_span_size()) ein i existiert, so dass m(i...) gleich k ist. [Anmerkung 2] |
| m.is_strided() | bool | Gibt true nur dann zurück, wenn für jeden Rangindex r von m.extents() eine ganze Zahl s_r existiert, so dass für alle i, für die (i + d_r) ein mehrdimensionaler Index in m.extents() ist, gilt m((i + d_r)...) - m(i...) gleich s_r ist. [Anmerkung 3] |
| m.stride(r) | typename M::index_type |
|
| M::is_always_unique() | bool |
|
| M::is_always_exhaustive() | bool |
|
| M::is_always_strided() | bool |
|
- ↑ Ein Mapping kann false zurückgeben, auch wenn die Bedingung erfüllt ist. Für bestimmte Layouts ist es möglicherweise nicht effizient möglich zu bestimmen, ob das Layout eindeutig ist.
- ↑ Dasselbe wie oben, aber im Fall von erschöpfenden Layouts.
- ↑ Dasselbe wie oben, aber im Fall von gestuften Layouts.
- ↑ Ein Mapping kann false zurückgeben, auch wenn die Bedingung erfüllt ist. Für bestimmte Layout-Mappings ist es möglicherweise nicht möglich zu bestimmen, ob jede Instanz eindeutig ist.
- ↑ Dasselbe wie oben, aber im Fall von erschöpfenden Instanzen.
- ↑ Dasselbe wie oben, aber im Fall von gestuften Instanzen.
[bearbeiten] Konzept
Für die Einschränkungen, die unter std::layout_stride::mapping verwendet werden, wird das folgende expositions-nur-Konzept definiert.
template< class M > concept /*layout-mapping-alike*/ = requires |
(nur Exposition*) | |
Definiert die minimalen Nutzungseinschränkungen der LayoutMapping-Anforderung. Dieses Konzept prüft, ob die prädikativen Mapping-Trait-Funktionen existieren, konstante Ausdrücke sind und einen Rückgabetyp von bool haben.
/*is-extents*/<E> ist true genau dann, wenn E eine Spezialisierung von std::extents ist.
[bearbeiten] Standardbibliothek
Die folgenden Standardbibliotheks-Typen erfüllen die Anforderungen an LayoutMapping
| ein Layout-Mapping von layout_left (öffentliche Member-Klassenschablone von std::layout_left) | |
| ein Layout-Mapping von layout_right (öffentliche Member-Klassenschablone von std::layout_right) | |
| ein Layout-Mapping von layout_stride (öffentliche Member-Klassenschablone von std::layout_stride) | |
| ein Layout-Mapping von layout_left_padded (öffentliche Member-Klassenschablone von std::layout_left_padded<PaddingValue>) | |
| ein Layout-Mapping von layout_right_padded (öffentliche Member-Klassenschablone von std::layout_right_padded<PaddingValue>) |