命名空间
变体
操作

C++ 命名要求: LayoutMapping (自 C++23 起)

来自 cppreference.cn
 
 
C++ 命名要求
 

LayoutMapping 控制多维索引到 std::mdspan 中数据句柄的一维偏移的映射。

目录

[编辑] 要求

如果类型 M 建模 copyableequality_comparable,并且以下条件为 true,则类型 M 满足 LayoutMapping

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

[编辑] 图例

类型 定义
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,对于它 MMP 的映射类型

[编辑] 成员函数和运算符

表达式 返回类型 语义
m.extents() const typename M​::​extents_type& 返回对关联的多维索引空间的常量引用
m(i...) typename M​::​index_type
m.required_span_size() typename M​::​index_type
  • 如果多维索引空间 m.extents() 的大小不为 0,则返回 1 加上所有 im(i...) 的最大值。
  • 否则,返回 0
m.is_unique() bool 仅当对于每个 ij,其中 (i != j || ...)true 时,m(i...) != m(j...)true 时,返回 true[注 1]
m.is_exhaustive() bool 仅当对于范围 [0m.required_span_size()) 中的所有 k,都存在 i 使得 m(i...) 等于 k 时,返回 true[注 2]
m.is_strided() bool 仅当对于 m.extents() 的每个秩索引 r,都存在一个整数 s_r,使得对于所有 i,其中 (i + d_r)m.extents() 中的多维索引,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 的所有可能对象 mm.is_unique()true 时,返回 true[注 4]
  • 返回值始终是常量表达式。
M::is_always_exhaustive() bool
  • 仅当对于类型 M 的所有可能对象 mm.is_exhaustive()true 时,返回 true[注 5]
  • 返回值始终是常量表达式。
M::is_always_strided() bool
  • 仅当对于类型 M 的所有可能对象 mm.is_strided()true 时,返回 true[注 6]
  • 返回值始终是常量表达式。
  1. 即使条件满足,映射也可能返回 false。对于某些布局,可能无法有效确定布局是否唯一。
  2. 与上述相同,但在穷尽布局的情况下。
  3. 与上述相同,但在步幅布局的情况下。
  4. 即使条件满足,映射也可能返回 false。对于某些布局映射,可能无法确定每个实例是否唯一。
  5. 与上述相同,但在穷尽实例的情况下。
  6. 与上述相同,但在步幅实例的情况下。

[编辑] 概念

对于 std::layout_stride::mapping 下使用的约束,定义了以下仅用于演示的概念。

template< class M >

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;

};
仅用于演示*

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

/*is-extents*/<E> 当且仅当 Estd::extents 的特化时,为 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> 的公共成员类模板)[编辑]

[编辑] 参见