Namespaces
Variants

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

From cppreference.net
C++ named requirements

LayoutMapping 控制多维索引到数据句柄一维偏移量的映射,该映射应用于 std:: mdspan 中。

目录

要求

类型 M 满足 LayoutMapping 当且仅当其满足 copyable equality_comparable 概念,且以下条件为 true

并且,给定以下类型和值,下表中所示的表达式是有效的,并具有指定的语义:

图例

类型 定义
M 布局映射类
定义
m 类型为(可能带有 const 限定) M 的值
i , j (可能带有 const 限定)整数包,表示 m. extents ( ) 中的多维索引
r typename M​ :: ​extents_type 的(可能带有 const 限定)秩索引
d_r (可能带有 const 限定)整数包,满足 sizeof... ( d_r ) == M​ :: ​extents_type​ :: ​rank ( ) true ,其中秩索引 r 处的元素等于 1 ,其余所有元素等于 0

成员类型

名称 类型 要求
M::extents_type 类模板 std:: extents 的特化
M::index_type typename M :: extents_type :: index_type
M::rank_type typename M :: extents_type :: rank_type
M::layout_type 布局映射策略 MP ,其中 typename MP :: template mapping < E > M
对于某个维度类型 E
LayoutMappingPolicy ,且 M MP 的映射类型

成员函数与运算符

表达式 返回类型 语义
m. extents ( ) const typename M​ :: ​extents_type & 返回关联多维索引空间的常量引用
m ( i... ) typename M​ :: ​index_type
m. required_span_size ( ) typename M​ :: ​index_type
  • 若多维索引空间 m. extents ( ) 的大小不为 0,则返回 m ( i... ) 对所有 i 的最大值加 1
  • 否则返回 0
m. is_unique ( ) bool 仅当对于所有满足 ( i ! = j || ... ) true i j m ( i... ) ! = m ( j... ) true 时返回 true [注释 1]
m. is_exhaustive ( ) bool 仅当对于范围 [ 0 , m. required_span_size ( ) ) 内的所有 k ,存在 i 使得 m ( i... ) 等于 k 时返回 true [注释 2]
m. is_strided ( ) bool 仅当对于 m. extents ( ) 的每个秩索引 r ,存在整数 s_r ,使得对于所有满足 ( i + d_r ) m. extents ( ) 中多维索引的 i m ( ( i + d_r ) ... ) - m ( i... ) 等于 s_r 时返回 true [注释 3]
m. stride ( r ) typename M​ :: ​index_type
  • 前置条件为 m. is_strided ( ) true
  • 返回秩索引 r 处的步长 s_r ,定义见上文的 m. is_strided ( )
M :: is_always_unique ( ) bool
  • 仅当对于类型 M 的所有可能对象 m m. is_unique ( ) 均为 true 时返回 true [注释 4]
  • 返回值始终为常量表达式。
M :: is_always_exhaustive ( ) bool
  • 仅当对于类型 M 的所有可能对象 m m. is_exhaustive ( ) 均为 true 时返回 true [注释 5]
  • 返回值始终为常量表达式。
M :: is_always_strided ( ) bool
  • 仅当对于类型 M 的所有可能对象 m m. is_strided ( ) 均为 true 时返回 true [注释 6]
  • 返回值始终为常量表达式。
  1. 即使条件满足,映射也可能返回 <span class="t-c

概念

对于在 std::layout_stride::mapping 下使用的约束条件,定义了以下仅用于说明的概念。

template < class M >

concept /*布局映射类似体*/ = requires
{
requires /*是范围类型*/ < 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 ;

} ;
( 仅用于说明* )

定义 LayoutMapping 要求的最小可用性约束。此概念检查上述谓词映射特征函数是否存在、是否为常量表达式,并具有 bool 返回类型。

/*is-extents*/ < E > true 当且仅当 E std::extents 的特化。

标准库

以下标准库类型满足 LayoutMapping 要求:

layout_left 的布局映射
( std::layout_left 的公开成员类模板)
layout_right 的布局映射
( std::layout_right 的公开成员类模板)
layout_stride 的布局映射
( std::layout_stride 的公开成员类模板)
layout_left_padded 的布局映射
( std::layout_left_padded<PaddingValue> 的公开成员类模板)
layout_right_padded 的布局映射
( std::layout_right_padded<PaddingValue> 的公开成员类模板)

参见