Skip to content

Commit 5c9ff3e

Browse files
committed
layout_left_padded/mapping: コンストラクタ(#1341)
1 parent 4e4c416 commit 5c9ff3e

File tree

7 files changed

+270
-28
lines changed

7 files changed

+270
-28
lines changed

reference/mdspan/is-mapping-of.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# is-mapping-of
2+
* mdspan[meta header]
3+
* variable[meta id-type]
4+
* cpp23[meta cpp]
5+
6+
```cpp
7+
template<class Layout, class Mapping>
8+
constexpr bool is-mapping-of = // exposition only
9+
is_same_v<typename Layout::template mapping<typename Mapping::extents_type>, Mapping>;
10+
```
11+
* is_same_v[link /reference/type_traits/is_same.md]
12+
13+
14+
## 概要
15+
`is-mapping-of`は、`Mapping`が`Layout`の[レイアウトマッピング](LayoutMapping.md)か否かを判定する説明専用変数テンプレートである。
16+
17+
18+
## バージョン
19+
### 言語
20+
- C++23
21+
22+
23+
## 関連項目
24+
- [LayoutMappingPolicy](LayoutMappingPolicy.md)
25+
- [LayoutMapping](LayoutMapping.md)
26+
27+
28+
## 参照
29+
- [P0009R18 MDSPAN](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p0009r18.html)

reference/mdspan/layout_left/mapping/op_constructor.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ constexpr explicit(extents_type::rank() > 0)
3737
## 概要
3838
- (1) : デフォルトコンストラクタ
3939
- (2) : コピーコンストラクタ
40-
- (3) : [`extents`](../../extents.md)からの変換コンストラクタ
40+
- (3) : [`extents`](../../extents.md)から構築
4141
- (4) : 他`layout_left::mapping`からの変換コンストラクタ
4242
- (5) : [`layout_right::mapping`](../../layout_right/mapping.md)からの変換コンストラクタ
4343
- (6) : [`layout_stride::mapping`](../../layout_stride/mapping.md)からの変換コンストラクタ
@@ -58,7 +58,7 @@ constexpr explicit(extents_type::rank() > 0)
5858
## 適格要件
5959
- (7) : 以下を満たすとき、`extents_type::`[`static_extent`](../../extents/static_extent.md)`(0)`が[`LayoutLeftPaddedMapping::static-padding-stride`](../../layout_left_padded/mapping.md)に等しいこと。
6060
- `extents_type::`[`rank()`](../../extents/rank.md) `> 1`、かつ
61-
- `extents_type::`[`static_extent`](../../extents/static_extent.md)`(0)`が[`dynamic_extent`](/reference/span/dynamic_extent.md)と等しくなく、かつ
61+
- `extents_type::`[`static_extent`](../../extents/static_extent.md)`(0) !=` [`dynamic_extent`](/reference/span/dynamic_extent.md)、かつ
6262
- `LayoutLeftPaddedMapping::static-padding-stride`が[`dynamic_extent`](/reference/span/dynamic_extent.md)と等しくないとき。
6363
6464
@@ -113,7 +113,7 @@ int main()
113113
std::layout_left::mapping<Ext3xN> map2_b = map2_a;
114114
assert(map2_a == map2_b);
115115
}
116-
// (3) : extentsからの変換コンストラクタ
116+
// (3) : extentsから構築
117117
{
118118
Ext3xN ext{4};
119119
std::layout_left::mapping<Ext3xN> map3 = ext;

reference/mdspan/layout_left_padded/mapping.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,11 @@ namespace std {
4848
- 値`padding_value`が`index_type`型で表現できること。
4949
- 以下を満たすとき、`LEAST-MULTIPLE-AT-LEAST(padding_value, first-static-extent)`が、`size_t`型および`index_type`型で表現できること。
5050
- `rank_ > 1`、かつ
51-
- `padding_value`が[`dynamic_extent`](/reference/span/dynamic_extent.md)と等しくなく、かつ
51+
- `padding_value !=` [`dynamic_extent`](/reference/span/dynamic_extent.md)、かつ
5252
- `first-static-extent`が[`dynamic_extent`](/reference/span/dynamic_extent.md)と等しくないとき。
5353
- 以下を満たすとき、半開区間`[1, rank_)`の全ての値`k`に対して`LEAST-MULTIPLE-AT-LEAST(padding_value, ext.static_extent(0))`と全ての`ext.static_extent(k)`を乗じた結果が、`size_t`型および`index_type`型で表現できること。
5454
- `rank_ > 1`、かつ
55-
- `padding_value`が[`dynamic_extent`](/reference/span/dynamic_extent.md)と等しくなく、かつ
55+
- `padding_value !=` [`dynamic_extent`](/reference/span/dynamic_extent.md)、かつ
5656
- 半開区間`[0, extents_type::`[`rank()`](../extents/rank.md)`)`の全ての値`k`に対して`extents_type::`[`static_extent`](../extents/static_extent.md)`(k)`が[`dynamic_extent`](/reference/span/dynamic_extent.md)と等しくないとき。
5757
5858
@@ -61,7 +61,7 @@ namespace std {
6161
6262
| 名前 | 説明 | 対応バージョン |
6363
|------|------|----------------|
64-
| [`(constructor)`](mapping/op_constructor.md.nolink) | コンストラクタ | C++26 |
64+
| [`(constructor)`](mapping/op_constructor.md) | コンストラクタ | C++26 |
6565
| `(destructor)` | デストラクタ | C++26 |
6666
| `operator=` | コピー代入演算子 | C++26 |
6767
Lines changed: 223 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
1+
# コンストラクタ
2+
* mdspan[meta header]
3+
* function[meta id-type]
4+
* std[meta namespace]
5+
* layout_left_padded::mapping[meta class]
6+
* cpp26[meta cpp]
7+
8+
```cpp
9+
constexpr mapping() noexcept; // (1)
10+
11+
constexpr mapping(const mapping&) noexcept = default; // (2)
12+
13+
constexpr mapping(const extents_type& ext); // (3)
14+
15+
template<class OtherIndexType>
16+
constexpr mapping(const extents_type& ext, OtherIndexType pad); // (4)
17+
18+
template<class OtherExtents>
19+
constexpr explicit(!is_convertible_v<OtherExtents, extents_type>)
20+
mapping(const layout_left::mapping<OtherExtents>& other); // (5)
21+
22+
template<class OtherExtents>
23+
constexpr explicit(extents_type::rank() > 0)
24+
mapping(const layout_stride::mapping<OtherExtents>& other); // (6)
25+
26+
template<class LayoutLeftPaddedMapping>
27+
constexpr explicit(see below)
28+
mapping(const LayoutLeftPaddedMapping& other); // (7)
29+
30+
template<class LayoutRightPaddedMapping>
31+
constexpr explicit(see below)
32+
mapping(const LayoutRightPaddedMapping& other) noexcept; // (8)
33+
```
34+
* is_convertible_v[link /reference/type_traits/is_convertible.md]
35+
* rank()[link ../../extents/rank.md]
36+
* layout_left::mapping[link ../../layout_left/mapping.md]
37+
* layout_stride::mapping[link ../../layout_stride/mapping.md]
38+
* LayoutLeftPaddedMapping[link ../../layout_left_padded/mapping.md]
39+
* see below[itaic]
40+
41+
## 概要
42+
- (1) : デフォルトコンストラクタ
43+
- (2) : コピーコンストラクタ
44+
- (3) : [`extents`](../../extents.md)から構築
45+
- (4) : [`extents`](../../extents.md)とパディングから構築
46+
- (5) : [`layout_left::mapping`](../../layout_left/mapping.md)からの変換コンストラクタ
47+
- (6) : [`layout_stride::mapping`](../../layout_stride/mapping.md)からの変換コンストラクタ
48+
- (7) : 他`layout_left_padded<S>::mapping`からの変換コンストラクタ
49+
- (8) : [`layout_right::mapping`](../../layout_right/mapping.md)または[`layout_right_padded<S>::mapping`](../../layout_right_padded/mapping.md)からの変換コンストラクタ
50+
51+
52+
## テンプレートパラメータ制約
53+
- (4) :
54+
- [`is_convertible_v`](/reference/type_traits/is_convertible.md)`<OtherIndexType, index_type>`が`true`であること。
55+
- [`is_nothrow_constructible_v`](/reference/type_traits/is_nothrow_constructible.md)`<index_type, OtherIndexType>`が`true`であること。
56+
- (5), (6) :
57+
- [`is_constructible_v`](/reference/type_traits/is_constructible.md)`<extents_type, OtherExtents>`が`true`であること。
58+
- (7) :
59+
- [`is-layout-left-padded-mapping-of`](../../is-layout-left-padded-mapping-of.md)`<LayoutLeftPaddedMapping>`が`true`であること。
60+
- [`is_constructible_v`](/reference/type_traits/is_constructible.md)`<extents_type, LayoutLeftPaddedMapping::extents_type>`が`true`であること。
61+
- (8) :
62+
- [`is-layout-right-padded-mapping-of`](../../is-layout-right-padded-mapping-of.md)`<LayoutRightPaddedMapping>`が`true`、または[`is-mapping-of`](../../is-mapping-of.md)`<`[`layout_right`](../../layout_right.md)`, LayoutRightPaddedMapping>`が`true`であること。
63+
- `rank_`が`0`または`1`であること。
64+
- [`is_constructible_v`](/reference/type_traits/is_constructible.md)`<extents_type, LayoutRightPaddedMapping::extents_type>`が`true`であること。
65+
66+
67+
## 適格要件
68+
- (5) : `OhterExtents::`[`rank()`](../../extents/rank.md) `> 1`のとき、`(static-padding-stride ==` [`dynamic_extent`](/reference/span/dynamic_extent.md)`) || (OtherExtents::`[`static_extent`](../../extents/static_extent.md)`(0) == dynamic_extent) || (static-padding-stride == OtherExtents::static_extent(0))`が`true`であること。
69+
- (7) : `rank_ > 1`のとき、`(padding_value ==` [`dynamic_extent`](/reference/span/dynamic_extent.md)`) || (LayoutLeftPaddedMapping::padding_value == dynamic_extent) || (padding_value == LayoutLeftPaddedMapping::padding_value)`が`true`であること。
70+
71+
72+
## 事前条件
73+
- (3) :
74+
- `ext`の多次元インデクス空間のサイズを、`index_type`型で表現できること。
75+
- `rank_ > 1`かつ`padding_value !=` [`dynamic_extent`](/reference/span/dynamic_extent.md)のとき、`LEAST-MULTIPLE-AT-LEAST(padding_value, ext.extent(0))`を`index_type`型で表現できること。
76+
- `rank_ > 1`かつ`padding_value !=` [`dynamic_extent`](/reference/span/dynamic_extent.md)のとき、半開区間`[1, rank_)`の全ての値`k`に対して`LEAST-MULTIPLE-AT-LEAST(padding_value, ext.extent(0))`と全ての`ext.extent(k)`を乗算した値を`index_type`型で表現できること。
77+
- (4) :
78+
- `pad`の値を`index_type`型で表現できること。
79+
- `extetns_type::`[`index-cast`](../../extents/index-cast.md)`(pad) > 0`
80+
- `rank_ > 1`のとき、`LEAST-MULTIPLE-AT-LEAST(pad, ext.extent(0))`を`index_type`型で表現できること。
81+
- `rank_ > 1`のとき、半開区間`[1, rank_)`の全ての値`k`に対して`LEAST-MULTIPLE-AT-LEAST(pad, ext.extent(0))`と全ての`ext.extent(k)`を乗算した値を`index_type`型で表現できること。
82+
- `padding_value !=` [`dynamic_extent`](/reference/span/dynamic_extent.md)のとき、`padding_value == extetns_type::`[`index-cast`](../../extents/index-cast.md)`(pad)`
83+
- (5) :
84+
- `extents_type::`[`rank()`](../../extents/rank.md) `> 1`かつ`padding_value !=` [`dynamic_extent`](/reference/span/dynamic_extent.md)のとき、`other.`[`stride`](../../layout_left/mapping/stride.md))`(1) == LEAST-MULTIPLE-AT-LEAST(padding_value, extents_type::`[`index-cast`](../../extents/index-cast.md)`(other.extents().extent(0)))`
85+
- `other.`[`required_span_size()`](../../layout_left/mapping/required_span_size.md)を、`index_type`型で表現できること。
86+
- (6) :
87+
- `rank_ > 1`かつ`padding_value !=` [`dynamic_extent`](/reference/span/dynamic_extent.md)のとき、`other.`[`stride`](../../layout_left/mapping/stride.md)`(1) == LEAST-MULTIPLE-AT-LEAST(padding_value, extents_type::`[`index-cast`](../../extents/index-cast.md)`(other.extents().extent(0)))`
88+
- `rank_ > 0`のとき、`other.`[`stride`](../../layout_stride/mapping/stride.md)`(0) == 1`
89+
- `rank_ > 2`のとき、半開区間`[2, rank_)`の全ての値`r`に対して`other.stride(r) == (other.extents().fwd-prod-of-extents(r) / other.extents().extent(0)) * other.stride(1)`
90+
- `other.`[`required_span_size()`](../../layout_stride/mapping/required_span_size.md)を、`index_type`型で表現できること。
91+
- (7) :
92+
- `rank_ > 1`かつ`padding_value !=` [`dynamic_extent`](/reference/span/dynamic_extent.md)のとき、`other.stride(1) == LEAST-MULTIPLE-AT-LEAST(padding_value, extents_type::`[`index-cast`](../../extents/index-cast.md)`(other.extent(0)))`
93+
- `other.required_span_size()`を、`index_type`型で表現できること。
94+
- (8) :
95+
- `other.required_span_size()`を、`index_type`型で表現できること。
96+
97+
98+
## 効果
99+
- (1) :
100+
- `mapping(extents_type{})`と等価。
101+
- (3) :
102+
- `ext`を用いて`extents_`を直接非リスト初期化する。
103+
- `rank_ > 1`のとき、次の値を用いて`stride-1`を直接非リスト初期化する。
104+
- `padding_value ==` [`dynamic_extent`](/reference/span/dynamic_extent.md)のとき、`ext.extent(0)`
105+
- そうでなければ、`LEAST-MULTIPLE-AT-LEAST(padding_value, ext.extent(0))`
106+
- (4) :
107+
- `ext`を用いて`extents_`を直接非リスト初期化する。
108+
- `rank_ > 1`のとき、`LEAST-MULTIPLE-AT-LEAST(pad, ext.extent(0))`を用いて`stride-1`を直接非リスト初期化する。
109+
- (5) :
110+
- `mapping(other.extents())`と等価。
111+
- (6), (7) :
112+
- `other.extents()`を用いて`extents_`を直接非リスト初期化する。
113+
- `rank_ > 1`のとき、`other.stride(1)`を用いて`stride-1`を直接非リスト初期化する。
114+
- (8) :
115+
- `other.extents()`を用いて`extents_`を直接非リスト初期化する。
116+
117+
118+
## 例外
119+
- (1), (2), (8) : 投げない
120+
121+
122+
## explicitになる条件
123+
- (5) : `!`[`is_convertible_v`](/reference/type_traits/is_convertible.md)`<OtherExtents, extents_type>`
124+
- (6) : [`extents_type::rank()`](../../extents/rank.md) `> 0`
125+
- (7) : `rank_ > 1 && (padding_value !=` [`dynamic_extent`](/reference/span/dynamic_extent.md) `|| LayoutLeftPaddedMapping::padding_value == dynamic_extent)`
126+
- (8) : `!`[`is_convertible_v`](/reference/type_traits/is_convertible.md)`<LayoutRightPaddedMapping::extents_type, extents_type>`
127+
128+
129+
## 例
130+
```cpp example
131+
#include <cassert>
132+
#include <array>
133+
#include <mdspan>
134+
135+
using Ext3x3 = std::extents<size_t, 3, 3>;
136+
using Ext2D = std::dims<2>;
137+
138+
int main()
139+
{
140+
// (1) : デフォルトコンストラクタ
141+
{
142+
std::layout_left_padded<4>::mapping<Ext3x3> map1s;
143+
std::layout_left_padded<>::mapping<Ext3x3> map1d;
144+
assert(map1s.stride(1) == 4);
145+
assert(map1d.stride(1) == 3);
146+
}
147+
// (2) : コピーコンストラクタ
148+
{
149+
std::layout_left_padded<4>::mapping<Ext3x3> map2_a;
150+
std::layout_left_padded<4>::mapping<Ext3x3> map2_b = map2_a;
151+
assert(map2_a == map2_b);
152+
}
153+
// (3) : extentsから構築
154+
{
155+
Ext2D ext{3, 3};
156+
std::layout_left_padded<>::mapping<Ext2D> map3 = ext;
157+
assert(map3.extents() == ext);
158+
}
159+
// (4) : extentsとパディングから構築
160+
{
161+
Ext2D ext{3, 3};
162+
std::layout_left_padded<>::mapping<Ext2D> map4{ext, 4};
163+
assert(map4.extents() == ext && map4.stride(1) == 4);
164+
}
165+
// (5) : layout_left::mappingからの変換コンストラクタ
166+
{
167+
std::layout_left::mapping src5{Ext3x3{}};
168+
std::layout_left_padded<>::mapping<Ext2D> dst5 = src5;
169+
assert(dst5.stride(1) == 3);
170+
}
171+
// (6) : layout_stride::mappingからの変換コンストラクタ
172+
{
173+
std::array<int, 2> strides{1, 4};
174+
std::layout_stride::mapping src6{Ext3x3{}, strides};
175+
std::layout_left_padded<>::mapping<Ext2D> dst6{src6};
176+
assert(dst6.stride(1) == 4);
177+
}
178+
// (7) : 他layout_left_padded::mappingからの変換コンストラクタ
179+
{
180+
std::layout_left_padded<4>::mapping<Ext3x3> src7;
181+
std::layout_left_padded<>::mapping<Ext2D> dst7{src7};
182+
assert(dst7.extents() == Ext3x3{} && dst7.stride(1) == 4);
183+
}
184+
// (8) : layout_right(_padded)::mappingからの変換コンストラクタ
185+
{
186+
using Ext1D = std::dims<1>;
187+
std::layout_right::mapping<Ext1D> src8{Ext1D{5}};
188+
std::layout_left_padded<>::mapping<Ext1D> dst8{src8};
189+
assert(dst8.extent(0) == 5);
190+
}
191+
}
192+
```
193+
* std::layout_left_padded<4>::mapping[color ff0000]
194+
* std::layout_left_padded<>::mapping[color ff0000]
195+
* std::layout_right::mapping[link ../../layout_right/mapping.md]
196+
* std::layout_stride::mapping[link ../../layout_stride/mapping.md]
197+
* std::dims[link ../../extents.md]
198+
199+
### 出力
200+
```
201+
```
202+
203+
204+
## バージョン
205+
### 言語
206+
- C++26
207+
208+
### 処理系
209+
- [Clang](/implementation.md#clang): ??
210+
- [GCC](/implementation.md#gcc): ??
211+
- [ICC](/implementation.md#icc): ??
212+
- [Visual C++](/implementation.md#visual_cpp): ??
213+
214+
215+
## 関連項目
216+
- [`layout_left::mapping`](../../layout_left/mapping.md)
217+
- [`layout_right::mapping`](../../layout_right/mapping.md)
218+
- [`layout_right_padded::mapping`](../../layout_right_padded/mapping.md)
219+
- [`layout_stride::mapping`](../../layout_stride/mapping.md)
220+
221+
222+
## 参照
223+
- [P2642R6 Padded mdspan layouts](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2642r6.pdf)

reference/mdspan/layout_right/mapping/op_constructor.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ constexpr explicit(!is_convertible_v<OtherExtents, extents_type>)
2222

2323
template<class LayoutRightPaddedMapping>
2424
constexpr explicit(!is_convertible_v<typename LayoutRightPaddedMapping::extents_type, extents_type>)
25-
mapping(const LayoutRightPaddedMapping&) noexcept; // (7) C++26
25+
mapping(const LayoutRightPaddedMapping& other) noexcept; // (7) C++26
2626

2727
template<class OtherExtents>
2828
constexpr explicit(extents_type::rank() > 0)
@@ -37,7 +37,7 @@ constexpr explicit(extents_type::rank() > 0)
3737
## 概要
3838
- (1) : デフォルトコンストラクタ
3939
- (2) : コピーコンストラクタ
40-
- (3) : [`extents`](../../extents.md)からの変換コンストラクタ
40+
- (3) : [`extents`](../../extents.md)から構築
4141
- (4) : 他`layout_right::mapping`からの変換コンストラクタ
4242
- (5) : [`layout_left::mapping`](../../layout_left/mapping.md)からの変換コンストラクタ
4343
- (6) : [`layout_stride::mapping`](../../layout_stride/mapping.md)からの変換コンストラクタ
@@ -58,7 +58,7 @@ constexpr explicit(extents_type::rank() > 0)
5858
## 適格要件
5959
- (7) : 以下を満たすとき、`extents_type::`[`static_extent`](../../extents/static_extent.md)`(`[`Extents::rank()`](../../extents/rank.md) `- 1)`が[`LayoutRightPaddedMapping::static-padding-stride`](../../layout_right_padded/mapping.md)に等しいこと。
6060
- `extents_type::`[`rank()`](../../extents/rank.md) `> 1`、かつ
61-
- `extents_type::`[`static_extent`](../../extents/static_extent.md)`(Extents::rank() - 1)`が[`dynamic_extent`](/reference/span/dynamic_extent.md)と等しくなく、かつ
61+
- `extents_type::`[`static_extent`](../../extents/static_extent.md)`(Extents::rank() - 1) !=` [`dynamic_extent`](/reference/span/dynamic_extent.md)、かつ
6262
- `LayoutRightPaddedMapping::static-padding-stride`が[`dynamic_extent`](/reference/span/dynamic_extent.md)と等しくないとき。
6363
6464
@@ -113,7 +113,7 @@ int main()
113113
std::layout_right::mapping<Ext3xN> map2_b = map2_a;
114114
assert(map2_a == map2_b);
115115
}
116-
// (3) : extentsからの変換コンストラクタ
116+
// (3) : extentsから構築
117117
{
118118
Ext3xN ext{4};
119119
std::layout_right::mapping<Ext3xN> map3 = ext;

reference/mdspan/layout_right_padded/mapping.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,11 @@ namespace std {
4848
- 値`padding_value`が`index_type`型で表現できること。
4949
- 以下を満たすとき、`LEAST-MULTIPLE-AT-LEAST(padding_value, last-static-extent)`が、`size_t`型および`index_type`型で表現できること。
5050
- `rank_ > 1`、かつ
51-
- `padding_value`が[`dynamic_extent`](/reference/span/dynamic_extent.md)と等しくなく、かつ
51+
- `padding_value !=` [`dynamic_extent`](/reference/span/dynamic_extent.md)、かつ
5252
- `last-static-extent`が[`dynamic_extent`](/reference/span/dynamic_extent.md)と等しくないとき。
5353
- 以下を満たすとき、半開区間`[1, rank_ - 1)`の全ての値`k`に対して`LEAST-MULTIPLE-AT-LEAST(padding_value, ext.static_extent(rank_ - 1))`と全ての`ext.static_extent(k)`を乗じた結果が、`size_t`型および`index_type`型で表現できること。
5454
- `rank_ > 1`、かつ
55-
- `padding_value`が[`dynamic_extent`](/reference/span/dynamic_extent.md)と等しくなく、かつ
55+
- `padding_value !=` [`dynamic_extent`](/reference/span/dynamic_extent.md)、かつ
5656
- 半開区間`[0, rank_)`の全ての値`k`に対して`extents_type::`[`static_extent`](../extents/static_extent.md)`(k)`が[`dynamic_extent`](/reference/span/dynamic_extent.md)と等しくないとき。
5757
5858

0 commit comments

Comments
 (0)