C++ 名前付き要件: LayoutMapping (C++23 以降)
LayoutMapping は、std::mdspan において、多次元インデックスを 1 次元オフセットからデータハンドルへのマッピングを制御します。
目次 |
[編集] 要件
型 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 | m.extents() における多次元インデックスである(const 修飾されている場合がある)整数のパック |
| 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 という extents 型に対して |
M が MP のマッピング型であるような LayoutMappingPolicy |
[編集] メンバ関数と演算子
| Expression | 戻り値の型 | セマンティクス |
|---|---|---|
| m.extents() | const typename M::extents_type& | 関連する多次元インデックス空間への const 参照を返します。 |
| m(i...) | typename M::index_type |
|
| m.required_span_size() | typename M::index_type |
|
| m.is_unique() | bool | すべての i および j に対して、(i != j || ...) が true である場合にのみ m(i...) != m(j...) が true となる場合、true を返します。[注 1] |
| m.is_exhaustive() | bool | m.required_span_size() の範囲 [0, m.required_span_size()) 内のすべての k に対して、m(i...) が k に等しくなるような i が存在する場合、true を返します。[注 2] |
| m.is_strided() | bool | m.extents() のすべてのランクインデックス r に対して、(i + d_r) が m.extents() における多次元インデックスとなるようなすべての i に対して、m((i + d_r)...) - m(i...) が s_r に等しくなるような整数 s_r が存在する場合、true を返します。[注 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 |
(説明用*) | |
上記の述語マッピング特性関数が存在し、定数式であり、戻り値の型が bool であることをチェックします。これは LayoutMapping 要件の最小限のユーザビリティ制約を定義します。
/*is-extents*/<E> が true であるのは、E が std::extents の特殊化である場合、かつその場合に限ります。
[編集] 標準ライブラリ
以下の標準ライブラリ型は LayoutMapping 要件を満たします。
| layout_left のレイアウトマッピング ( std::layout_left の public メンバクラステンプレート) | |
| layout_right のレイアウトマッピング ( std::layout_right の public メンバクラステンプレート) | |
| layout_stride のレイアウトマッピング ( std::layout_stride の public メンバクラステンプレート) | |
| layout_left_padded のレイアウトマッピング ( std::layout_left_padded<PaddingValue> の public メンバクラステンプレート) | |
| layout_right_padded のレイアウトマッピング ( std::layout_right_padded<PaddingValue> の public メンバクラステンプレート) |