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
関数をサポートするためのカスタマイゼーションポイント。
説明用の型index_type
をExtents::index_type
、型S_k
をSliceSpecifiers
のk
番目の型とする。
テンプレートパラメータ制約
sizeof...(slices)
がExtents::rank()
と等しいこと。
適格要件
extents()
の各次元インデクスk
において、下記いずれかのうち1つだけを満たすこと。
- 型
S_k
がconvertible_to<index_type>
のモデル - 型
S_k
がindex-pair-like<index_type>
のモデル is_convertible_v<S_k, full_extent_t>
がtrue
- 型
S_k
がstrided_slice
の特殊化
事前条件
extents()
の各次元インデクスk
において、s_k
をslices
のk
番目の値としたとき、下記を全て満たすこと。
- 型
S_k
がstrided_slice
の特殊化のときs_k.extent == 0
、またはs_k.stride > 0
0
≤first_<index_type, k>(slices...)
≤last_<k>(extents(), slices...)
≤extents().extent(k)
戻り値
説明用の値や型を次の通り定義する。
- 値
sub_ext
: 式submdspan_extents(extents(), slices...)
の結果 - 型
SubExtents
:decltype(sub_ext)
- 値
sub_strides
:extents()
の各次元インデクスk
において、map-rank[k]
がdynamic_extent
ではないk
に対しsub_strides[map-rank[k]]
が下記を満たす、array<SubExtents::index_type, SubExtents::rank()>
型の配列値- 型
S_k
がstrided_slice
の特殊化かつs_k.stride < s_k.extent
の場合、stride(k) * de-ice(s_k.stride)
- そうでなければ、
stride(k)
- 型
- パラメータパック
P
:is_same_v<make_index_sequence<rank()>, index_sequence<P...>> == true
- 値
offset
:size_t
型の値(*this)(first_<index_type, P>(slices...)...)
下記を満たす型S
を、単位ストライド幅スライス(unit-stride slice)と定義する。
- 型
S
がstrided_slice
の特殊化であり型S::stride_type
がintegral-constant-like
のモデルかつS::stride_type::value
が1
に等しい、もしくは - 型
S
がindex-pair-like<index_type>
のモデル、もしくは is_convertible_v<S, full_extent_t>
がtrue
説明専用のsubmdspan-mapping-impl
関数テンプレートは下記の値を返す。
Extents::rank() == 0
のとき、submdspan_mapping_result{*this, 0}
SubExtents::rank() == 0
のとき、submdspan_mapping_result{layout_right::mapping(sub_ext), offset}
- 以下を満たすとき、
submdspan_mapping_result{layout_right::mapping(sub_ext), offset}
- 半開区間
[Extents::rank() - SubExtents::rank()+1, Extents::rank())
の値k
に対して、is_convertible_v<S_k, full_extent_t>
がtrue
、かつ Extents::rank()-SubExtents::rank()
に等しい値k
に対して、型S_k
が単位ストライド幅スライスである
- 半開区間
- 以下を満たすとき、
submdspan_mapping_result{layout_right_padded<S_static>::mapping(sub_ext, stride(rank_-u-2)), offset}
- 型
S_p
が単位ストライド幅スライスを満たすrank_-1
より小さい最大値p
に対して、rank_-u-2
がp
となる値u
を用いてrank_-1
に等しい値k
に対して、型S_k
が単位ストライド幅スライスであり、かつ- 半開区間
[rank_-SubExtents::rank()-u+1, rank_-u-1)
の値k
に対して、is_convertible_v<S_k, full_extent_t>
、かつ rank_-SubExtents::rank()-u
に等しい値k
に対して、型S_k
が単位ストライド幅スライスである
- ここで定数
S_static
は- 半開区間
[rank_-u-1, rank_)
のいずれかの値k
に対してstatic_extent(k)
がdynamic_extent
のとき、dynamic_extent
- そうでなければ、半開区間
[rank_-u-1, rank_)
の全ての値k
に対してstatic_extent(k)
を乗算した値
- 半開区間
- 型
submdspan_mapping_result{layout_stride::mapping(sub_ext, sub_strides), offset}
バージョン
言語
- C++26
処理系
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??