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 Ma layout mapping class Value Definition ma value of type (possibly const-qualified) Mi, jpacks of (possibly const-qualified) integers that are multidimensional indices in m.extents()ra (possibly const-qualified) rank index of typenameM​::​extents_typed_ra 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 0Member types

NameTypeRequirements M::extents_typeSpecialization of class template std::extentsM::index_typetypenameM::extents_type::index_typeM::rank_typetypenameM::extents_type::rank_typeM::layout_typeLayout mapping policy MP where typenameMP::templatemapping<E> is M
for some extents type E

LayoutMappingPolicy

for which M is mapping type of MPMember functions and operators

ExpressionReturn typeSemantics m.extents()consttypenameM​::​extents_type&Returns constant reference to associated multidimensional index space m(i...)typenameM​::​index_typeReturns a nonnegative integer o such that o<std::numeric_limits<typenameM​::​index_type>​::​max() and o<=std::numeric_limits<std::size_t>​::​max() are both true.

Such expression is equivalent to m(static_cast<typenameM::index_type>(i)...).

m.required_span_size()typenameM​::​index_typeReturns 1 plus the maximum value of m(i...) for all i if the size of the multidimensional index space m.extents() is not 0.

Otherwise, returns 0.

m.is_unique()boolReturns true only if for every i and j where (i!=j||...) is true, m(i...)!=m(j...) is true.

[note 1]

m.is_exhaustive()boolReturns 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()boolReturns 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)typenameM​::​index_typeThe precondition is that m.is_strided() is true.

Returns a stride s_r at rank index r as defined in m.is_strided() above.

M::is_always_unique()boolReturns true only if m.is_unique() is true for all possible objects m of type M.

[note 4]

The return value is always a constant expression.

M::is_always_exhaustive()boolReturns true only if m.is_exhaustive() is true for all possible objects m of type M.

[note 5]

The return value is always a constant expression.

M::is_always_strided()boolReturns true only if m.is_strided() is true for all possible objects m of type M.

[note 6]

The return value is always a constant expression.

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.

Concept

For the constraints uses under std::layout_stride::mapping, the following exposition-only concept is defined.

template<classM>concept/*layout-mapping-alike*/=requires{requires/*is-extents*/<typenameM::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;};(exposition only*)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.

Standard library

The following standard library types satisfy LayoutMapping requirements:

a layout mapping of layout_left
(public member class template of std::layout_left)

[edit]

a layout mapping of layout_right
(public member class template of std::layout_right)

[edit]

a layout mapping of layout_stride
(public member class template of std::layout_stride)

[edit]

a layout mapping of layout_left_padded
(public member class template of std::layout_left_padded<PaddingValue>)

[edit]

a layout mapping of layout_right_padded
(public member class template of std::layout_right_padded<PaddingValue>)

[edit]

See also

LayoutMappingPolicy