Namensräume
Varianten
Aktionen

C++-Namensanforderungen: LayoutMapping (seit C++23)

Von cppreference.com
 
 
C++ benannte Anforderungen
 

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

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 ist
fü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
  • Gibt eine nicht-negative ganze Zahl o zurück, so dass o < std::numeric_limits<typename M​::​index_type>::​max() und o <= std::numeric_limits<std::size_t>::​max() beide true sind.
  • Ein solcher Ausdruck ist äquivalent zu m(static_cast<typename M::index_type>(i)...).
m.required_span_size() typename M​::​index_type
  • Gibt 1 plus den Maximalwert von m(i...) für alle i zurück, wenn die Größe des mehrdimensionalen Indexraums m.extents() nicht 0 ist.
  • Andernfalls wird 0 zurückgegeben.
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 [0m.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
  • Die Vorbedingung ist, dass m.is_strided() true ist.
  • Gibt den Schritt s_r am Rangindex r zurück, wie in m.is_strided() oben definiert.
M::is_always_unique() bool
  • Gibt true nur dann zurück, wenn m.is_unique() für alle möglichen Objekte m vom Typ M true ist. [Anmerkung 4]
  • Der Rückgabewert ist immer ein konstanten Ausdruck.
M::is_always_exhaustive() bool
  • Gibt true nur dann zurück, wenn m.is_exhaustive() für alle möglichen Objekte m vom Typ M true ist. [Anmerkung 5]
  • Der Rückgabewert ist immer ein konstanten Ausdruck.
M::is_always_strided() bool
  • Gibt true nur dann zurück, wenn m.is_strided() für alle möglichen Objekte m vom Typ M true ist. [Anmerkung 6]
  • Der Rückgabewert ist immer ein konstanten Ausdruck.
  1. 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.
  2. Dasselbe wie oben, aber im Fall von erschöpfenden Layouts.
  3. Dasselbe wie oben, aber im Fall von gestuften Layouts.
  4. 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.
  5. Dasselbe wie oben, aber im Fall von erschöpfenden Instanzen.
  6. 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
{
    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;

};
(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)[bearbeiten]
ein Layout-Mapping von layout_right
(öffentliche Member-Klassenschablone von std::layout_right)[bearbeiten]
ein Layout-Mapping von layout_stride
(öffentliche Member-Klassenschablone von std::layout_stride)[bearbeiten]
ein Layout-Mapping von layout_left_padded
(öffentliche Member-Klassenschablone von std::layout_left_padded<PaddingValue>)[bearbeiten]
ein Layout-Mapping von layout_right_padded
(öffentliche Member-Klassenschablone von std::layout_right_padded<PaddingValue>)[bearbeiten]

[bearbeiten] Siehe auch