Namespaces
Variants

C++ named requirements: LayoutMapping (since C++23)

From cppreference.net
C++ named requirements

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

目次

要件

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

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

凡例

定義
M レイアウトマッピングクラス
定義
m (おそらくconst修飾された) 型 M の値
i , j (おそらくconst修飾された) 整数のパックで、 m. extents ( ) 内の多次元インデックス
r (おそらくconst修飾された) typename M​ :: ​extents_type のランクインデックス
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 に対して
LayoutMappingPolicy であり、 M MP のマッピング型であるもの

メンバー関数と演算子

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

コンセプト

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

template < class M >

concept /*レイアウトマッピング類似*/ = 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 ;

} ;
( 説明専用* )

LayoutMapping 要件の最小限の使用可能性制約を定義します。このコンセプトは、前述の述語マッピング特性関数が存在し、定数式であり、戻り値の型が bool であることをチェックします。

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

標準ライブラリ

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

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

関連項目