最終更新日時: 2024年09月05日 19時41分09秒 (JST)
yoh が更新

履歴 編集

class template
<mdspan>

# std::layout_left_padded::mapping(C++26)

    namespace std {
      template<size_t PaddingValue>
      template<class Extents>
      class layout_left_padded<PaddingValue>::mapping;
    }

## 概要

`layout_left_padded<S>::mapping<E>`は、`extents`型の多次元配列サイズ`E`をパラメータとして、パディングあり列優先(column major)レイアウトマッピングを表現するクラスである。

`layout_left_padded<S>::mapping<E>`はトリビアルコピー可能であり、`regular`のモデルである。

### 説明専用の仮想操作

動作説明用の仮想操作`LEAST-MULTIPLE-AT-LEAST(x,y)`を、次のように定義する。

- `x == 0`のとき、`y`
- そうでなければ、`y`以上で最小となる`x`の倍数

### 説明専用メンバ変数

`layout_left_padded<S>::mapping`クラステンプレートは、下記の説明専用メンバ変数を保持する。

- `stride-1` : `index_type`型の値`static-padding-stride`
- `extents_` : `extents_type`型の多次元配列サイズ情報

また下記の説明専用静的メンバ変数を保持する。

- `rank_` : `size_t`型の定数`extents_type::rank()`
- `first-static-extent` : `size_t`型の定数`extents_type::static_extent(0)`
- `static-padding-stride` : `size_t`型の下記定数
  - `rank_`が`0`または`1`のとき、値`0`
  - `padding_value`または`first-static-extent`が`dynamic_extent`と等しいとき、`dynamic_extent`
  - そうでなければ、`LEAST-MULTIPLE-AT-LEAST(padding_value, first-static-extent)`

## 適格要件

- `Extents`は`extents`の特殊化であること。
- `rank_dynamic() == 0`のとき、多次元インデクス空間`Extents()`のサイズが`index_type`型で表現できること。
- 値`padding_value`が`index_type`型で表現できること。
- 以下を満たすとき、`LEAST-MULTIPLE-AT-LEAST(padding_value, first-static-extent)`が、`size_t`型および`index_type`型で表現できること。
  - `rank_ > 1`、かつ
  - `padding_value != dynamic_extent`、かつ
  - `first-static-extent`が`dynamic_extent`と等しくないとき。
- 以下を満たすとき、半開区間`[1, rank_)`の全ての値`k`に対して`LEAST-MULTIPLE-AT-LEAST(padding_value, ext.static_extent(0))`と全ての`ext.static_extent(k)`を乗じた結果が、`size_t`型および`index_type`型で表現できること。
  - `rank_ > 1`、かつ
  - `padding_value != dynamic_extent`、かつ
  - 半開区間`[0, extents_type::rank())`の全ての値`k`に対して`extents_type::static_extent(k)`が`dynamic_extent`と等しくないとき。

## メンバ関数

### 構築・破棄

名前 | 説明 | 対応バージョン
--- | --- | ---
`(constructor)` | コンストラクタ | C++26
`(destructor)` | デストラクタ | C++26
`operator=` | コピー代入演算子 | C++26

### 観測

名前 | 説明 | 対応バージョン
--- | --- | ---
`extents` | 多次元配列のサイズ`extents_`を取得する | C++26
`strides` | ストライド幅配列を取得する | C++26
`required_span_size` | 要素アクセス範囲を取得する | C++26
`operator()` | 多次元配列インデクスから要素位置へ変換する | C++26
`is_exhaustive` | Exhaustive特性を取得する | C++26
`stride` | 指定次元のストライド幅を取得する | C++26

## 静的メンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`is_always_unique` | `true`を返す | C++26
`is_always_exhaustive` | 型のExhaustive特性を取得する | C++26
`is_always_strided` | `true`を返す | C++26
`is_unique` | `true`を返す | C++26
`is_strided` | `true`を返す | C++26

## メンバ型

名前 | 説明 | 対応バージョン
--- | --- | ---
`extents_type` | `Extents` | C++26
`index_type` | `Extents::index_type` | C++26
`size_type` | `Extents::size_type` | C++26
`rank_type` | `Extents::rank_type` | C++26
`layout_type` | `layout_left_padded<PaddingValue>` | C++26

## 非メンバ（Hidden friends）関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`submdspan_mapping` | `submdspan`サポート | C++26

### 比較演算子

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator==` | 等値比較 | C++26
`operator!=` | 非等値比較 (`==`により使用可能) | C++26

## バージョン

### 言語

- C++26

### 処理系

- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??

## 関連項目

- `mdspan`
- `submdspan`

## 参照

- P2642R6 Padded mdspan layouts