概要
LayoutMappingは、多次元配列ビューmdspanにおいて多次元インデクスから参照先メモリブロック位置への対応関係(レイアウトマッピング)を定めるクラスが満たすべき要件である。
LayoutMappingを満たすユーザ定義型layout_custom::mapping<E>は、常にレイアウトマッピングポリシーを満たすlayout_customの公開メンバmappingクラステンプレートとして定義される。
// レイアウトマッピングポリシー
struct layout_custom {
// レイアウトマッピング
template<class Extents>
class mapping {
public:
using layout_type = layout_custom;
using extent_type = Extents;
// ...
};
};
レイアウトマッピング特性
レイアウトマッピングによる多次元インデクスからメモリブロック位置への変換は、次の3種類の特性によって記述される。
- Unique特性 : 異なる多次元インデクス値であれば、互いに異なる要素位置へと変換される。
- Exhaustive特性 : 取りうる全ての多次元インデクス値に対応する要素位置を考えたとき、アクセスされうる要素位置に隙間が生じない。
- Strided特性 : 多次元インデクス値
I_nと各次元ストライド幅S_nを用いて、要素位置を式(I_i * S_i) + ...により計算できる。
例えば、多次元配列ビューmdspanのデフォルトレイアウトポリシーlayout_rightは3つの特性を全て満たす。
要素数3×2の2次元配列ビューmat3x2における有効な多次元インデクス値i,jは0,0, 0,1, 1,0, 1,1, 2,0, 2,1の6パターンとなり、それぞれ参照先メモリブロックaの要素位置a[0], a[1], a[2], a[3], a[4], a[5]に対応する。
int a[6] = {0, 1, 2, 3, 4, 5};
using Extents = std::extents<size_t, 3, 2>;
std::mdspan<int, Extents> mat3x2{a};
- Unique特性 : 異なる多次元インデクス値は、異なる要素位置に対応する。参照先が重複することはない。
- Exhaustive特性 : 全ての多次元インデクス値に対応する要素位置は隣接配置される。
- Strided特性 : 多次元インデクス値
i,jに対応する要素位置は、ストライド幅2,1を用いてi*2+j*1と計算できる。
要件
LayoutMappingを満たす型Mは
Mはcopyableおよびequality_comparableのモデルであり、かつis_nothrow_move_constructible_v<M>はtrueであり、かつis_nothrow_move_assignable_v<M>はtrueであり、かつis_nothrow_swappable_v<M>はtrueであること
型Mは下記のメンバ型を持つこと
M::extents_type:extentsの特殊化M::index_type:extents_type::index_typeM::rank_type:extents_type::rank_typeM::layout_type: 自クラスを提供するレイアウトマッピングポリシー型
説明用の変数mを(const) Mの値、パックiをM::extents_type::rank()個からなる整数値、変数rを多次元の次元番号としたとき、下記の式が妥当であること
m.extents():const M::extents_type&型を返すこと。m(i...):M::index_type型を返すこと。- 戻り値 : 非負整数値
m(i...) == m(static_cast<M::index_type>(i)...):trueとなること。m.required_span_size():M::index_type型を返すこと。- 戻り値 :
m.extents()の多次元インデクス空間サイズが0のときは値0。そうでなければ、レイアウトマッピングによりアクセスする可能性のあるメモリブロック範囲の最大値に1を足した値。
- 戻り値 :
m.is_unique():bool型を返すこと。- 戻り値 : Unique特性を満たすときに限り
true。
- 戻り値 : Unique特性を満たすときに限り
m.is_exhaustive():bool型を返すこと。- 戻り値 : Exhaustive特性を満たすときに限り
true。
- 戻り値 : Exhaustive特性を満たすときに限り
m.is_strided():bool型を返すこと。- 戻り値 : Strided特性を満たすときに限り
true。
- 戻り値 : Strided特性を満たすときに限り
m.stride(r):M::index_type型を返すこと。- 前提条件 :
m.is_strided() == true - 戻り値 :
r番目次元のストライド幅
- 前提条件 :
M::is_always_unique():bool型の定数式となること。- 戻り値 : 型
MのあらゆるオブジェクトにおいてUnique特性を満たすときにtrue。
- 戻り値 : 型
M::is_always_exhaustive():bool型の定数となること。- 戻り値 : 型
MのあらゆるオブジェクトにおいてExhaustive特性を満たすときにtrue。
- 戻り値 : 型
M::is_always_strided():bool型の定数となること。- 戻り値 : 型
MのあらゆるオブジェクトにおいてStrided特性を満たすときにtrue。
- 戻り値 : 型
LayoutMappingに該当する型
バージョン
言語
- C++23