|
| 1 | +# LayoutMapping |
| 2 | +* named requirement[meta id-type] |
| 3 | +* cpp23[meta cpp] |
| 4 | + |
| 5 | + |
| 6 | +## 概要 |
| 7 | +LayoutMappingは、多次元配列ビュー[`mdspan`](mdspan.md)において多次元インデクスから参照先メモリブロック位置への対応関係(レイアウトマッピング)を定めるクラスが満たすべき要件である。 |
| 8 | + |
| 9 | +LayoutMappingを満たすユーザ定義型`layout_custom::mapping<E>`は、常に[レイアウトマッピングポリシー](LayoutMappingPolicy.md)を満たす`layout_custom`の公開メンバ`mapping`クラステンプレートとして定義される。 |
| 10 | + |
| 11 | +```cpp |
| 12 | +// レイアウトマッピングポリシーs |
| 13 | +struct layout_custom { |
| 14 | + // レイアウトマッピング |
| 15 | + template<class Extents> |
| 16 | + class mapping { |
| 17 | + public: |
| 18 | + using layout_type = layout_custom; |
| 19 | + using extent_type = Extents; |
| 20 | + // ... |
| 21 | + }; |
| 22 | +}; |
| 23 | +``` |
| 24 | +* Extents[link extents.md] |
| 25 | +
|
| 26 | +### レイアウトマッピング特性 |
| 27 | +
|
| 28 | +レイアウトマッピングによる多次元インデクスからメモリブロック位置への変換は、次の3種類の特性によって記述される。 |
| 29 | +
|
| 30 | +- Unique特性 : 異なる多次元インデクス値であれば、互いに異なる要素位置へと変換される。 |
| 31 | +- Exhaustive特性 : 取りうる全ての多次元インデクス値に対応する要素位置を考えたとき、アクセスされうる要素位置に隙間が生じない。 |
| 32 | +- Strided特性 : 要素位置は多次元インデクス値と各次元ストライド幅のみを用いて計算できる。 |
| 33 | +
|
| 34 | +例えば、多次元配列ビュー[`mdspan`](mdspan.md)のデフォルトレイアウトポリシー[`layout_right`](layout_right.md)は3つの特性を全て満たす。 |
| 35 | +要素数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]`に対応する。 |
| 36 | +
|
| 37 | +```cpp |
| 38 | +int a[6] = {0, 1, 2, 3, 4, 5}; |
| 39 | +
|
| 40 | +using Extents = std::extents<size_t, 3, 2>; |
| 41 | +std::mdspan<int, Extents> mat3x2{a}; |
| 42 | +``` |
| 43 | + |
| 44 | +- Unique特性 : 異なる多次元インデクス値は、異なる要素位置に対応する。参照先が重複することはない。 |
| 45 | +- Exhaustive特性 : 全ての多次元インデクス値に対応する要素位置は連続している。 |
| 46 | +- Strided特性 : 多次元インデクス値`i,j`に対応する要素位置は、ストライド幅`2,1`を用いて`(i*2+j)*1`と計算できる。 |
| 47 | + |
| 48 | + |
| 49 | +## 要件 |
| 50 | +LayoutMappingを満たす型`M`は |
| 51 | + |
| 52 | +- `M`は[`copyable`](/reference/concepts/copyable.md)および[`equality_comparable`](/reference/concepts/equality_comparable.md)のモデルであり、かつ |
| 53 | +- [`is_nothrow_move_constructible_v`](/reference/type_traits/is_nothrow_constructible.md)`<M>`は`true`であり、かつ |
| 54 | +- [`is_nothrow_move_assignable_v`](/reference/type_traits/is_nothrow_move_assignable.md)`<M>`は`true`であり、かつ |
| 55 | +- [`is_nothrow_swappable_v`](/reference/type_traits/is_nothrow_swappable.md)`<M>`は`true`であること |
| 56 | + |
| 57 | +型`M`は下記のメンバ型を持つこと |
| 58 | + |
| 59 | +- `M::extents_type` : [`extents`](extents.md)の特殊化 |
| 60 | +- `M::index_type` : [`extents_type::index_type`](extents.md) |
| 61 | +- `M::rank_type` : [`extents_type::rank_type`](extents.md) |
| 62 | +- `M::layout_type` : 自クラスを提供する[レイアウトマッピングポリシー型](LayoutMappingPolicy.md) |
| 63 | + |
| 64 | +説明用の変数`m`を`(const) M`の値、パック`i`を[`M::extents_type::rank()`](extents/rank.md)個からなる整数値、変数`r`を多次元の次元番号としたとき、下記の式が妥当であること |
| 65 | + |
| 66 | +- `m.extents()` : `const M::extents_type&`型を返すこと。 |
| 67 | +- `m(i...)` : `M::index_type`型を返すこと。 |
| 68 | + - 戻り値 : 非負整数値 |
| 69 | +- `m(i...) == m(static_cast<M::index_type>(i)...)` : `true`となること。 |
| 70 | +- `m.required_span_size()` : `M::index_type`型を返すこと。 |
| 71 | + - 戻り値 : `m.extents()`の多次元インデクス空間サイズが0のときは値`0`。そうでなければ、レイアウトマッピングによりアクセスする可能性のあるメモリブロック範囲の最大値に`1`を足した値。 |
| 72 | +- `m.is_unique()` : `bool`型を返すこと。 |
| 73 | + - 戻り値 : Unique特性を満たすときに限り`true`。 |
| 74 | +- `m.is_exhaustive()` : `bool`型を返すこと。 |
| 75 | + - 戻り値 : Exhaustive特性を満たすときに限り`true`。 |
| 76 | +- `m.is_strided()` : `bool`型を返すこと。 |
| 77 | + - 戻り値 : Strided特性を満たすときに限り`true`。 |
| 78 | +- `m.stride(r)` : `M::index_type`型を返すこと。 |
| 79 | + - 前提条件 : `m.is_strided() == true` |
| 80 | + - 戻り値 : `r`番目次元のストライド幅 |
| 81 | +- `M::is_always_unique()` : `bool`型の定数式となること。 |
| 82 | + - 戻り値 : 型`M`のあらゆるオブジェクトにおいてUnique特性を満たすときに`true`。 |
| 83 | +- `M::is_always_exhaustive()` : `bool`型の定数となること。 |
| 84 | + - 戻り値 : 型`M`のあらゆるオブジェクトにおいてExhaustive特性を満たすときに`true`。 |
| 85 | +- `M::is_always_strided()` : `bool`型の定数となること。 |
| 86 | + - 戻り値 : 型`M`のあらゆるオブジェクトにおいてStrided特性を満たすときに`true`。 |
| 87 | + |
| 88 | + |
| 89 | +## `LayoutMapping`に該当する型 |
| 90 | + |
| 91 | +- `layout_left::mapping<E>` |
| 92 | +- `layout_right::mapping<E>` |
| 93 | +- `layout_stride::mapping<E>` |
| 94 | + |
| 95 | + |
| 96 | +## バージョン |
| 97 | +### 言語 |
| 98 | +- C++23 |
| 99 | + |
| 100 | + |
| 101 | +## 関連項目 |
| 102 | +- [`mdspan`](mdspan.md) |
| 103 | +- [`extents`](extents.md) |
| 104 | +- [LayoutMappingPolicy](LayoutMappingPolicy.md) |
| 105 | + |
| 106 | + |
| 107 | +## 参照 |
| 108 | +- [P0009R18 MDSPAN](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p0009r18.html) |
| 109 | +- [P2604R0 `mdspan`: rename `pointer` and `contiguous`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2604r0.html) |
0 commit comments