Skip to content

Commit 8c041b3

Browse files
committed
layout_right_padded/mapping: コンストラクタ(#1341)
1 parent 5c9ff3e commit 8c041b3

File tree

3 files changed

+235
-13
lines changed

3 files changed

+235
-13
lines changed

reference/mdspan/layout_left_padded/mapping/op_constructor.md

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,7 @@ constexpr explicit(see below)
3535
* rank()[link ../../extents/rank.md]
3636
* layout_left::mapping[link ../../layout_left/mapping.md]
3737
* layout_stride::mapping[link ../../layout_stride/mapping.md]
38-
* LayoutLeftPaddedMapping[link ../../layout_left_padded/mapping.md]
39-
* see below[itaic]
38+
* see below[italic]
4039
4140
## 概要
4241
- (1) : デフォルトコンストラクタ
@@ -72,21 +71,21 @@ constexpr explicit(see below)
7271
## 事前条件
7372
- (3) :
7473
- `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`型で表現できること。
74+
- `rank_ > 1`かつ`padding_value !=` [`dynamic_extent`](/reference/span/dynamic_extent.md)のとき、`LEAST-MULTIPLE-AT-LEAST(padding_value, ext.`[`extent`](../../extents/extent.md)`(0))`を`index_type`型で表現できること。
75+
- `rank_ > 1`かつ`padding_value !=` [`dynamic_extent`](/reference/span/dynamic_extent.md)のとき、半開区間`[1, rank_)`の全ての値`k`に対して`LEAST-MULTIPLE-AT-LEAST(padding_value, ext.`[`extent`](../../extents/extent.md)`(0))`と全ての`ext.extent(k)`を乗算した値を`index_type`型で表現できること。
7776
- (4) :
7877
- `pad`の値を`index_type`型で表現できること。
7978
- `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`型で表現できること。
79+
- `rank_ > 1`のとき、`LEAST-MULTIPLE-AT-LEAST(pad, ext.`[`extent`](../../extents/extent.md)`(0))`を`index_type`型で表現できること。
80+
- `rank_ > 1`のとき、半開区間`[1, rank_)`の全ての値`k`に対して`LEAST-MULTIPLE-AT-LEAST(pad, ext.`[`extent`](../../extents/extent.md)`(0))`と全ての`ext.extent(k)`を乗算した値を`index_type`型で表現できること。
8281
- `padding_value !=` [`dynamic_extent`](/reference/span/dynamic_extent.md)のとき、`padding_value == extetns_type::`[`index-cast`](../../extents/index-cast.md)`(pad)`
8382
- (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)))`
83+
- `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`](../../extents/extent.md)`(0)))`
8584
- `other.`[`required_span_size()`](../../layout_left/mapping/required_span_size.md)を、`index_type`型で表現できること。
8685
- (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)))`
86+
- `rank_ > 1`かつ`padding_value !=` [`dynamic_extent`](/reference/span/dynamic_extent.md)のとき、`other.`[`stride`](../../layout_stride/mapping/stride.md)`(1) == LEAST-MULTIPLE-AT-LEAST(padding_value, extents_type::`[`index-cast`](../../extents/index-cast.md)`(other.extents().`[`extent`](../../extents/extent.md)`(0)))`
8887
- `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)`
88+
- `rank_ > 2`のとき、半開区間`[2, rank_)`の全ての値`r`に対して`other.`[`stride`](../../layout_stride/mapping/stride.md)`(r) == (other.extents().fwd-prod-of-extents(r) / other.extents().`[`extent`](../../extents/extent.md)`(0)) * other.stride(1)`
9089
- `other.`[`required_span_size()`](../../layout_stride/mapping/required_span_size.md)を、`index_type`型で表現できること。
9190
- (7) :
9291
- `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)))`
@@ -101,11 +100,11 @@ constexpr explicit(see below)
101100
- (3) :
102101
- `ext`を用いて`extents_`を直接非リスト初期化する。
103102
- `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))`
103+
- `padding_value ==` [`dynamic_extent`](/reference/span/dynamic_extent.md)のとき、`ext.`[`extent`](../../extents/extent.md)`(0)`
104+
- そうでなければ、`LEAST-MULTIPLE-AT-LEAST(padding_value, ext.`[`extent`](../../extents/extent.md)`(0))`
106105
- (4) :
107106
- `ext`を用いて`extents_`を直接非リスト初期化する。
108-
- `rank_ > 1`のとき、`LEAST-MULTIPLE-AT-LEAST(pad, ext.extent(0))`を用いて`stride-1`を直接非リスト初期化する。
107+
- `rank_ > 1`のとき、`LEAST-MULTIPLE-AT-LEAST(pad, ext.`[`extent`](../../extents/extent.md)`(0))`を用いて`stride-1`を直接非リスト初期化する。
109108
- (5) :
110109
- `mapping(other.extents())`と等価。
111110
- (6), (7) :
@@ -192,6 +191,7 @@ int main()
192191
```
193192
* std::layout_left_padded<4>::mapping[color ff0000]
194193
* std::layout_left_padded<>::mapping[color ff0000]
194+
* std::layout_left::mapping[link ../../layout_left/mapping.md]
195195
* std::layout_right::mapping[link ../../layout_right/mapping.md]
196196
* std::layout_stride::mapping[link ../../layout_stride/mapping.md]
197197
* std::dims[link ../../extents.md]

reference/mdspan/layout_right_padded/mapping.md

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

0 commit comments

Comments
 (0)