C++ named requirements: LayoutMapping (since C++23)
    LayoutMapping controls the mapping of a multidimensional index to a one-dimensional offset to data handle in std::mdspan .
Contents
[edit] 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:
[edit] Legend
M
 a layout mapping class
M
[edit] 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 MPwhere typename MP::template mapping<E> isMfor some extents type E | LayoutMappingPolicy for which Mis mapping type ofMP | 
[edit] 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.
[edit] Concept
For the constraints uses under std::layout_stride::mapping, the following exposition-only concept is defined.
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;
Defines the minimal usability constraints of the LayoutMapping requirement. This concept checks that the predicate mapping trait functions above exist, are constant expressions, and have a return type of bool.
/*is-extents*/<E> is true if and only if E is a specialization of std::extents.
[edit] Standard library
The following standard library types satisfy LayoutMapping requirements:
(public member class template of
std::layout_left_padded<PaddingValue>)[edit] 
(public member class template of
std::layout_right_padded<PaddingValue>)[edit]