名前空間
変種
操作

C++ 名前付き要件: LayoutMapping (C++23 以降)

From cppreference.com
 
 
C++ 名前付き要件
 

LayoutMapping は、std::mdspan において、多次元インデックスを 1 次元オフセットからデータハンドルへのマッピングを制御します。

目次

[編集] 要件

M は、copyable および equality_comparable をモデルとし、以下の条件が true である場合、LayoutMapping を満たします。

そして、以下の型と値が与えられた場合、以下の表に示す式は有効であり、示された意味を持ちます。

[編集] 凡例

定義
M レイアウトマッピングクラス
定義
m 型(const 修飾されている場合がある)M の値
i, j m.extents() における多次元インデックスである(const 修飾されている場合がある)整数のパック
r typename M​::​extents_type の(const 修飾されている場合がある)ランクインデックス
d_r (const 修飾されている場合がある)整数のパックで、sizeof...(d_r) = M​::​extents_type​::​rank()true であり、ランクインデックス r における要素は 1 に等しく、他のすべての要素は 0 に等しい。

[編集] メンバ型

名前 要件
M::extents_type クラステンプレート std::extents の特殊化
M::index_type typename M::extents_type::index_type
M::rank_type typename M::extents_type::rank_type
M::layout_type レイアウトマッピングポリシー MP。ここで typename MP::template mapping<E>M である。
ある E という extents 型に対して
MMP のマッピング型であるような LayoutMappingPolicy

[編集] メンバ関数と演算子

Expression 戻り値の型 セマンティクス
m.extents() const typename M​::​extents_type& 関連する多次元インデックス空間への const 参照を返します。
m(i...) typename M​::​index_type
  • o < std::numeric_limits<typename M​::​index_type>::​max() および o <= std::numeric_limits<std::size_t>::​max() が両方とも true である非負整数 o を返します。
  • このような式は m(static_cast<typename M::index_type>(i)...) に相当します。
m.required_span_size() typename M​::​index_type
  • 多次元インデックス空間 m.extents() のサイズが 0 でない場合、m(i...) の最大値に 1 を加えた値を返します。
  • それ以外の場合、0 を返します。
m.is_unique() bool すべての i および j に対して、(i != j || ...)true である場合にのみ m(i...) != m(j...)true となる場合、true を返します。[注 1]
m.is_exhaustive() bool m.required_span_size() の範囲 [0m.required_span_size()) 内のすべての k に対して、m(i...)k に等しくなるような i が存在する場合、true を返します。[注 2]
m.is_strided() bool m.extents() のすべてのランクインデックス r に対して、(i + d_r)m.extents() における多次元インデックスとなるようなすべての i に対して、m((i + d_r)...) - m(i...)s_r に等しくなるような整数 s_r が存在する場合、true を返します。[注 3]
m.stride(r) typename M​::​index_type
  • 前提条件は m.is_strided()true であることです。
  • 上記の m.is_strided() で定義されているランクインデックス r におけるストライド s_r を返します。
M::is_always_unique() bool
  • M のすべての可能なオブジェクト m に対して m.is_unique()true である場合にのみ true を返します。[注 4]
  • 戻り値は常に定数式です。
M::is_always_exhaustive() bool
  • M のすべての可能なオブジェクト m に対して m.is_exhaustive()true である場合にのみ true を返します。[注 5]
  • 戻り値は常に定数式です。
M::is_always_strided() bool
  • M のすべての可能なオブジェクト m に対して m.is_strided()true である場合にのみ true を返します。[注 6]
  • 戻り値は常に定数式です。
  1. マッピングは、条件が満たされている場合でも false を返すことがあります。特定のレイアウトでは、レイアウトが一意であるかどうかを効率的に判断できない場合があります。
  2. 上記と同様ですが、網羅的なレイアウトの場合です。
  3. 上記と同様ですが、ストライド付きレイアウトの場合です。
  4. マッピングは、条件が満たされている場合でも false を返すことがあります。特定のレイアウトマッピングでは、すべてのインスタンスが一意であるかどうかを判断できない場合があります。
  5. 上記と同様ですが、網羅的なインスタンスの場合です。
  6. 上記と同様ですが、ストライド付きインスタンスの場合です。

[編集] コンセプト

std::layout_stride::mapping の下での制約のために、以下の説明専用コンセプトが定義されています。

template< class M >

concept /*layout-mapping-alike*/ = requires
{
    requires /*is-extents*/<typename M::extents_type>;
    { M::is_always_strided() }    -> std::same_as<bool>;
    { M::is_always_exhaustive() } -> std::same_as<bool>;
    { M::is_always_unique() }     -> std::same_as<bool>;
    std::bool_constant<M::is_always_strided()>::value;
    std::bool_constant<M::is_always_exhaustive()>::value;
    std::bool_constant<M::is_always_unique()>::value;

};
(説明用*)

上記の述語マッピング特性関数が存在し、定数式であり、戻り値の型が bool であることをチェックします。これは LayoutMapping 要件の最小限のユーザビリティ制約を定義します。

/*is-extents*/<E>true であるのは、Estd::extents の特殊化である場合、かつその場合に限ります。

[編集] 標準ライブラリ

以下の標準ライブラリ型は LayoutMapping 要件を満たします。

layout_left のレイアウトマッピング
(std::layout_left の public メンバクラステンプレート)[編集]
layout_right のレイアウトマッピング
(std::layout_right の public メンバクラステンプレート)[編集]
layout_stride のレイアウトマッピング
(std::layout_stride の public メンバクラステンプレート)[編集]
layout_left_padded のレイアウトマッピング
(std::layout_left_padded<PaddingValue> の public メンバクラステンプレート)[編集]
layout_right_padded のレイアウトマッピング
(std::layout_right_padded<PaddingValue> の public メンバクラステンプレート)[編集]

[編集] 関連項目

English 日本語 中文(简体) 中文(繁體)