C++ named requirements: LayoutMapping (since C++23)

From cppreference.com
< cpp‎ | named req
 
 
C++ named requirements
 

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:

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
  • Returns a nonnegative integer o such that o < std::numeric_limits<typename M​::​index_type>::​max() and o <= std::numeric_limits<std::size_t>::​max() are both true.
  • Such expression is equivalent to m(static_cast<typename M::index_type>(i)...).
m.required_span_size() typename M​::​index_type
  • Returns 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() 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 [0m.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
  • The 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() bool
  • Returns 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() bool
  • Returns 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() bool
  • Returns 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.
  1. 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.
  2. Same as above, but in the case of exhaustive layouts.
  3. Same as above, but in the case of strided layouts.
  4. 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.
  5. Same as above, but in the case of exhaustive instances.
  6. 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>)