88``` cpp
99template <class ... SliceSpecifiers>
1010constexpr auto submdspan-mapping-impl( // exposition only
11- SliceSpecifiers ... slices) const -> see below;
11+ SliceSpecifiers... slices) const -> see below;
1212
1313template<class... SliceSpecifiers>
1414friend constexpr auto submdspan_mapping(
@@ -22,60 +22,47 @@ friend constexpr auto submdspan_mapping(
2222## 概要
2323[`submdspan`](../../submdspan.md)関数をサポートするためのカスタマイゼーションポイント。
2424
25- 説明用の型`index_type`を[`Extents::index_type`](../../extents.md)、型`S_k`を`SliceSpecifiers`の`k`番目の型とする。
26-
2725
2826## テンプレートパラメータ制約
29- `sizeof...(slices )`が[`Extents::rank()`](../../extents/rank.md)と等しいこと。
27+ `sizeof...(SliceSpecifiers )`が[`Extents::rank()`](../../extents/rank.md)と等しいこと。
3028
3129
3230## 適格要件
33- `extents()`の各次元インデクス`k`において、下記いずれかのうち1つだけを満たすこと。
34-
35- - 型`S_k`が[`convertible_to`](/reference/concepts/convertible_to.md)`<index_type>`のモデル
36- - 型`S_k`が[`index-pair-like`](../../index-pair-like.md)`<index_type>`のモデル
37- - [`is_convertible_v`](/reference/type_traits/is_convertible.md)`<S_k,` [`full_extent_t`](../../full_extent_t.md)`>`が`true`
38- - 型`S_k`が[`strided_slice`](../../strided_slice.md)の特殊化
31+ `extents()`の各次元インデクス`k`において、`SliceSpecifiers...[k]`が`Extents`のk番目次元の[有効`submdspan`スライス型(valid `submdspan` slice type)](../../submdspan_canonicalize_slices.md)であること。
3932
4033
4134## 事前条件
42- `extents()`の各次元インデクス`k`において、`s_k`を`slices`の`k`番目の値としたとき、下記を全て満たすこと。
43-
44- - 型`S_k`が[`strided_slice`](../../strided_slice.md)の特殊化のとき
45- - `s_k.extent == 0`、または
46- - `s_k.stride > 0`
47- - `0` ≤ [`first_`](../../first_.md)`<index_type, k>(slices...)` ≤ [`last_`](../../last_.md)`<k>(extents(), slices...)` ≤ `extents().`[`extent(k)`](../../extents/extent.md)
35+ `extents()`の各次元インデクス`k`において、`slices...[k]`が`extents()`のk番目次元の有効スライスであること。
4836
4937
5038## 戻り値
5139説明用の値や型を次の通り定義する。
5240
5341- 値`sub_ext` : 式[`submdspan_extents`](../../submdspan_extents.md)`(extents(), slices...)`の結果
5442- 型`SubExtents` : `decltype(sub_ext)`
55- - 値`sub_strides` : `extents()`の各次元インデクス`k`において、[`map-rank[ k]`](../../submdspan_extents.md)が[`dynamic_extent`](/reference/span/dynamic_extent.md)ではない`k`に対し `sub_strides[map-rank[k] ]`が下記を満たす、[`array`](/reference/array/array.md)`<SubExtents::index_type,` [`SubExtents::rank()`](../../extents/rank.md)`>`型の配列値
56- - 型`S_k`が[` strided_slice`](../../strided_slice.md)の特殊化かつ`s_k .stride < s_k .extent`の場合、[`stride(k)`](stride.md) `*` [`de-ice`](../../de-ice.md)`(s_k. stride) `
43+ - 値`sub_strides` : `slices...[ k]`の型が縮約スライス型(collapsing slice type)ではない`extents()`の各次元インデクス`k`において `sub_strides[MAP_RANK(slices, k) ]`が下記を満たす、[`array`](/reference/array/array.md)`<SubExtents::index_type,` [`SubExtents::rank()`](../../extents/rank.md)`>`型の配列値
44+ - 説明用の`s`を`slices...[k]`としたとき、`s`の型が[` strided_slice`](../../strided_slice.md)の特殊化かつ`s .stride < s .extent`の場合、[`stride(k)`](stride.md) `* s. stride`
5745 - そうでなければ、[`stride(k)`](stride.md)
58- - パラメータパック`P ` : [`is_same_v`](/reference/type_traits/is_same.md)`<`[`make_index_sequence`](/reference/utility/make_index_sequence.md)`<rank()>,` [`index_sequence`](/reference/utility/index_sequence.md)`<P...>> == true`
59- - 値`offset` : `size_t`型の値[`(*this)`](op_call.md)`(`[`first_ `](../../first_. md)`<index_type, P>(slices...)...)`
46+ - パック`ls ` : `extents()`の次元`r`に対して、`r`番目の要素が`slices...[r]`の`submdspan`スライス範囲の下限に等しい`index_type`型の値パック
47+ - 値`offset` : `extents()`における任意の次元インデクス`k`に対して`ls...[k]`が`extents().extent(k)`と等しいとき、`required_span_size()`に等しい`size_t`型の値。そうでなければ、[`operator() `](op_call. md)に等しい`size_t`型の値。
6048
61- 下記を満たす型`S`を、単位ストライド幅スライス (unit-stride slice)と定義する。
49+ 下記を満たす型`S`を、単位ストライド幅スライス型 (unit-stride slice type )と定義する。
6250
63- - 型`S`が[`strided_slice`](../../strided_slice.md)の特殊化であり型`S::stride_type`が[`integral-constant-like`](/reference/span/integral-constant-like.md)のモデルかつ`S::stride_type::value`が`1`に等しい、もしくは
64- - 型`S`が[`index-pair-like`](../../index-pair-like.md)`<index_type>`のモデル、もしくは
65- - [`is_convertible_v`](/reference/type_traits/is_convertible.md)`<S,` [`full_extent_t`](../../full_extent_t.md)`>`が`true`
51+ - `S`が[`strided_slice`](../../strided_slice.md)の特殊化であり、`S::stride_type`が[`constant_wrapper`](/reference/type_traits/constant_wrapper.md.nolink)の特殊化かつ`S::stride_type::value`が`1`、または
52+ - `S`が[`full_extent_t`](../../full_extent_t.md)
6653
6754説明専用の`submdspan-mapping-impl`関数テンプレートは下記の値を返す。
6855
6956- [`Extents::rank()`](../../extents/rank.md) `== 0`のとき、[`submdspan_mapping_result`](../../submdspan_mapping_result.md)`{*this, 0}`
7057- `SubExtents::rank() == 0`のとき、[`submdspan_mapping_result`](../../submdspan_mapping_result.md)`{`[`layout_left::mapping`](../../layout_left.md)`(sub_ext), offset}`
7158- 以下を満たすとき、[`submdspan_mapping_result`](../../submdspan_mapping_result.md)`{`[`layout_left::mapping`](../../layout_left.md)`(sub_ext), offset}`
72- - 半開区間`[0, SubExtents::rank()-1)`の値`k`に対して、[`is_convertible_v`](/reference/type_traits/is_convertible.md)`<S_k,` [`full_extent_t`](../../full_extent_t.md)`>`が`true` 、かつ
73- - `SubExtents::rank()-1`に等しい値`k`に対して、型`S_k`が単位ストライド幅スライスである
59+ - 半開区間`[0, SubExtents::rank()-1)`の値`k`に対して、`SliceSpecifiers...[k]`が [`full_extent_t`](../../full_extent_t.md)を表し 、かつ
60+ - `SubExtents::rank()-1`に等しい値`k`に対して、`SliceSpecifiers...[k]`が単位ストライド幅スライス型である
7461- 以下を満たすとき、[`submdspan_mapping_result`](../../submdspan_mapping_result.md)`{`[`layout_left_padded<S_static>::mapping`](../../layout_left_padded/mapping.md)`(sub_ext, stride(u + 1)), offset}`
75- - 型`S_p`が単位ストライド幅スライスを満たす `0`より大きい最小値`p`に対して、`u+1`が`p`となる値`u`を用いて
76- - 型`S_0`が単位ストライド幅スライスであり 、かつ
77- - 半開区間`[u+1, u+SubExtents::rank()-1)`の値`k`に対して、[`is_convertible_v`](/reference/type_traits/is_convertible.md)`<S_k,` [`full_extent_t`](../../full_extent_t.md)`>` 、かつ
78- - `u+SubExtents::rank()-1`に等しい値`k`に対して、型`S_k`が単位ストライド幅スライスである
62+ - `SliceSpecifiers...[p]`が単位ストライド幅スライス型となる `0`より大きい最小値`p`に対して、`u+1`が`p`となる値`u`を用いて
63+ - 型`SliceSpecifiers...[0]`が単位ストライド幅スライス型であり 、かつ
64+ - 半開区間`[u+1, u+SubExtents::rank()-1)`の値`k`に対して、`SliceSpecifiers...[k]`が [`full_extent_t`](../../full_extent_t.md)を表し 、かつ
65+ - `u+SubExtents::rank()-1`に等しい値`k`に対して、`SliceSpecifiers...[k]`が単位ストライド幅スライス型である
7966 - ここで定数`S_static`は
8067 - 半開区間`[0, u+1)`のいずれかの値`k`に対して`static_extent(k)`が[`dynamic_extent`](/reference/span/dynamic_extent.md)のとき、`dynamic_extent`
8168 - そうでなければ、半開区間`[0, u+1)`の全ての値`k`に対して`static_extent(k)`を乗算した値
@@ -101,3 +88,4 @@ friend constexpr auto submdspan_mapping(
10188- [P2630R4 Submdspan](https://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2630r4.html)
10289- [P2642R6 Padded mdspan layouts](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2642r6.pdf)
10390- [P3355R1 Fix submdspan for C++26](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3355r1.html)
91+ - [P3663R3 Future-proof `submdspan_mapping`](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3663r3.html)
0 commit comments