C++ named requirements: LayoutMapping (since C++23)
From cppreference.com
LayoutMapping controls the mapping of a multidimensional index to a one-dimensional offset to data handle in std::mdspan.
Requirements
A type M
satisfies LayoutMapping if it models copyable
and equality_comparable
, and the following are true:
- std::is_nothrow_move_constructible_v<M>
- std::is_nothrow_move_assignable_v<M>
- std::is_nothrow_swappable_v<M>
And, given the following types and values, the expressions shown in the table below are valid and have the indicated semantics:
Legend
Type | Definition |
M
|
a layout mapping class |
Value | Definition |
m | a value of type (possibly const-qualified) M
|
i, j | packs of (possibly const-qualified) integers that are multidimensional indices in m.extents() |
r | a (possibly const-qualified) rank index of typename M::extents_type |
d_r | a pack of (possibly const-qualified) integers for which sizeof...(d_r) == M::extents_type::rank() is true, the element at rank index r is equal to 1, and all other elements are equal to 0 |
Member types
Name | Type | Requirements |
---|---|---|
M::extents_type |
Specialization of class template 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 policy MP where typename MP::template mapping<E> is M for some extents type E |
LayoutMappingPolicy for which M is mapping type of MP
|
Member functions and operators
Expression | Return type | Semantics |
---|---|---|
m.extents() | const typename M::extents_type& | Returns constant reference to associated multidimensional index space |
m(i...) | typename M::index_type |
|
m.required_span_size() | typename M::index_type |
|
m.is_unique() | bool | Returns true only if for every i and j where (i != j || ...) is true, m(i...) != m(j...) is true. [note 1] |
m.is_exhaustive() | bool | Returns true only if for all k in the range [ 0, m.required_span_size()) , there exists an i such that m(i...) equals k. [note 2]
|
m.is_strided() | bool | Returns true only if for every rank index r of m.extents(), there exists an integer s_r such that, for all i where (i + d_r) is a multidimensional index in m.extents(), m((i + d_r)...) - m(i...) equals 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 |
|
- ↑ A mapping can return false even if the condition is met. For certain layouts, it is possibly not feasible to determine efficiently whether the layout is unique.
- ↑ Same as above, but in the case of exhaustive layouts.
- ↑ Same as above, but in the case of strided layouts.
- ↑ A mapping can return false even if the condition is met. For certain layout mappings, it is possibly not feasible to determine whether every instance is unique.
- ↑ Same as above, but in the case of exhaustive instances.
- ↑ Same as above, but in the case of strided instances.
See also
a layout mapping of layout_left (public member class template of std::layout_left ) | |
a layout mapping of layout_right (public member class template of std::layout_right ) | |
a layout mapping of layout_stride (public member class template of std::layout_stride ) | |
a layout mapping of layout_left_padded (public member class template of std::layout_left_padded<PaddingValue> ) | |
a layout mapping of layout_right_padded (public member class template of std::layout_right_padded<PaddingValue> ) |