最終更新日時(UTC):
が更新

履歴 編集

named requirement
<mdspan>

::LayoutMapping(C++23)

概要

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,j0,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は下記のメンバ型を持つこと

説明用の変数m(const) Mの値、パックiM::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
  • m.is_exhaustive() : bool型を返すこと。
    • 戻り値 : Exhaustive特性を満たすときに限りtrue
  • m.is_strided() : bool型を返すこと。
    • 戻り値 : Strided特性を満たすときに限りtrue
  • 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

関連項目

参照