C++ 具名要求:布局映射 (LayoutMapping) (C++23 起)
布局映射 (LayoutMapping) 控制 std::mdspan 中从多维索引到数据句柄的一维偏移量的映射。
目录 |
[编辑] 要求
如果类型 M
实现了 copyable
和 equality_comparable
,而且以下各项均为 true,则它满足布局映射 (LayoutMapping) :
- std::is_nothrow_move_constructible_v<M>
- std::is_nothrow_move_assignable_v<M>
- std::is_nothrow_swappable_v<M>
并且,给定以下各类型和值,下表所示的表达式均有效并具有所指定的语义:
[编辑] 凡例
类型 | 定义 |
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> 对于尺度类型 E 为 M |
布局映射策略 (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.is_unique() | bool | 仅当对于满足 (i != j || ...) 为 true 的所有 i 和 j,m(i...) != m(j...) 都为 true 时,返回 true。[note 1] |
m.is_exhaustive() | bool | 仅当对于范围 [ 0, m.required_span_size()) 中的每个 k 都存在一个 i 使得 m(i...) 等于 k 时,返回 true。[note 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。[note 3] |
m.stride(r) | typename M::index_type |
|
M::is_always_unique() | bool |
|
M::is_always_exhaustive() | bool |
|
M::is_always_strided() | bool |
|
[编辑] 概念
定义了如下仅用于阐释的概念,以用于 std::layout_stride::mapping 中的约束。
template< class M > concept /*layout-mapping-alike*/ = requires |
(仅用于阐述*) | |
定义布局映射 (LayoutMapping) 的最小可用约束。此概念检查上述的谓词映射特征函数都存在,都是常量表达式,且返回类型都为 bool。
当且仅当 E
是 std::extents 的特化时,/*is-extents*/<E> 为 true。
[编辑] 标准库
序列标准库类型均满足布局映射 (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> 的公开成员类模板)
|