template<class... SliceSpecifiers>
constexpr auto submdspan-mapping-impl( // exposition only
SliceSpecifiers... slices) const -> see below;
template<class... SliceSpecifiers>
friend constexpr auto submdspan_mapping(
const mapping& src, SliceSpecifiers... slices)
{
return src.submdspan-mapping-impl(slices...);
}
概要
submdspan関数をサポートするためのカスタマイゼーションポイント。
テンプレートパラメータ制約
sizeof...(SliceSpecifiers)がExtents::rank()と等しいこと。
適格要件
extents()の各次元インデクスkにおいて、SliceSpecifiers...[k]がExtentsのk番目次元の有効submdspanスライス型(valid submdspan slice type)であること。
事前条件
extents()の各次元インデクスkにおいて、slices...[k]がextents()のk番目次元の有効スライスであること。
戻り値
説明用の値や型を次の通り定義する。
- 値
sub_ext: 式submdspan_extents(extents(), slices...)の結果 - 型
SubExtents:decltype(sub_ext) - 値
sub_strides:slices...[k]の型が縮約スライス型(collapsing slice type)ではないextents()の各次元インデクスkにおいてsub_strides[MAP_RANK(slices, k)]が下記を満たす、array<SubExtents::index_type, SubExtents::rank()>型の配列値- 説明用の
sをslices...[k]としたとき、sの型がstrided_sliceの特殊化かつs.stride < s.extentの場合、stride(k) * s.stride - そうでなければ、
stride(k)
- 説明用の
- パック
ls:extents()の次元rに対して、r番目の要素がslices...[r]のsubmdspanスライス範囲の下限に等しいindex_type型の値パック - 値
offset:extents()における任意の次元インデクスkに対してls...[k]がextents().extent(k)と等しいとき、required_span_size()に等しいsize_t型の値。そうでなければ、operator()に等しいsize_t型の値。
下記を満たす型Sを、単位ストライド幅スライス型と定義する。
Sがstrided_sliceの特殊化であり、S::stride_typeがconstant_wrapperの特殊化かつS::stride_type::valueが1、またはSがfull_extent_t
説明専用のsubmdspan-mapping-impl関数テンプレートは下記の値を返す。
Extents::rank() == 0のとき、submdspan_mapping_result{*this, 0}SubExtents::rank() == 0のとき、submdspan_mapping_result{layout_left::mapping(sub_ext), offset}- 以下を満たすとき、
submdspan_mapping_result{layout_left::mapping(sub_ext), offset}- 半開区間
[0, SubExtents::rank()-1)の値kに対して、SliceSpecifiers...[k]がfull_extent_tを表し、かつ SubExtents::rank()-1に等しい値kに対して、SliceSpecifiers...[k]が単位ストライド幅スライス型である
- 半開区間
- 以下を満たすとき、
submdspan_mapping_result{layout_left_padded<S_static>::mapping(sub_ext, stride(u + 1)), offset}SliceSpecifiers...[p]が単位ストライド幅スライス型となる0より大きい最小値pに対して、u+1がpとなる値uを用いて- 型
SliceSpecifiers...[0]が単位ストライド幅スライス型であり、かつ - 半開区間
[u+1, u+SubExtents::rank()-1)の値kに対して、SliceSpecifiers...[k]がfull_extent_tを表し、かつ u+SubExtents::rank()-1に等しい値kに対して、SliceSpecifiers...[k]が単位ストライド幅スライス型である
- 型
- ここで定数
S_staticは- 半開区間
[0, u+1)のいずれかの値kに対してstatic_extent(k)がdynamic_extentのとき、dynamic_extent - そうでなければ、半開区間
[0, u+1)の全ての値kに対してstatic_extent(k)を乗算した値
- 半開区間
submdspan_mapping_result{layout_stride::mapping(sub_ext, sub_strides), offset}
バージョン
言語
- C++26
処理系
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??