- mdspan[meta header]
- function template[meta id-type]
- std[meta namespace]
- layout_stride::mapping[meta class]
- cpp26[meta cpp]
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...);
}
- see below[italic]
- submdspan-mapping-impl[italic]
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...)...)
説明専用のsubmdspan-mapping-impl
関数テンプレートは下記の値を返す。
Extents::rank()
== 0
のとき、submdspan_mapping_result
{*this, 0}
submdspan_mapping_result
{
layout_stride::mapping
(sub_ext, sub_strides), offset}
- C++26
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??