最終更新日時: 2024年02月09日 00時27分13秒 (JST)
yoh が更新

履歴 編集

class template
<mdspan>

# std::layout_left::mapping(C++23)

    namespace std {
      template<class Extents>
      class layout_left::mapping;
    }

## 概要

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

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

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

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

- `extents_` : `extents_type`型の多次元配列サイズ情報

## 適格要件

- `Extents`は`extents`の特殊化であること。
- `Extents::rank_dynamic() == 0`が`true`のとき、多次元インデクス空間`Extents()`のサイズが`Extents::index_type`型で表現できること。

## メンバ関数

### 構築・破棄

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

### 観測

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

## 静的メンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`is_always_unique` | `true`を返す | C++23
`is_always_exhaustive` | `true`を返す | C++23
`is_always_strided` | `true`を返す | C++23
`is_unique` | `true`を返す | C++23
`is_exhaustive` | `true`を返す | C++23
`is_strided` | `true`を返す | C++23

## メンバ型

名前 | 説明 | 対応バージョン
--- | --- | ---
`extents_type` | `Extents` | C++23
`index_type` | `Extents::index_type` | C++23
`size_type` | `Extents::size_type` | C++23
`rank_type` | `Extents::rank_type` | C++23
`layout_type` | `layout_left` | C++23

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

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

### 比較演算子

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

## 例

    #include <mdspan>
    #include <iostream>

    int main()
    {
      double arr[] = {1, 2, 3, 4, 5, 6};

      // 要素数2x3の2次元配列／列優先レイアウト
      using Ext2x3 = std::extents<size_t, 2, 3>;
      using Mapping = std::layout_left::mapping<Ext2x3>;
      std::mdspan mat{arr, Mapping{}};

      for (size_t i = 0; i < mat.extent(0); ++i) {
        for (size_t j = 0; j < mat.extent(1); ++j) {
          std::cout << (j ? " " : "") << mat[i, j];
        }
        std::cout << "\n";
      }
    }

### 出力

    1 3 5
    2 4 6

## バージョン

### 言語

- C++23

### 処理系

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

## 関連項目

- `mdspan`
- `submdspan`

## 参照

- P0009R18 MDSPAN
- P2630R4 Submdspan