This patch implements LWG 4491, addressing C++26 NB comments.
libstdc++-v3/ChangeLog:
* include/std/mdspan (std::submdspan_extents): Rename to...
(std::subextents): Renamed from submdspan_extents.
(std::submdspan_canonicalize_slices): Rename to...
(std::canonical_slices): Renamed from submdspan_canonicalize_slices.
* testsuite/23_containers/mdspan/submdspan/submdspan_canonicalize_slices.cc:
Move to...
* testsuite/23_containers/mdspan/submdspan/canonical_slices.cc: ...here.
Updated calls to submdspan_canonicalize_slices.
* testsuite/23_containers/mdspan/submdspan/submdspan_canonicalize_slices_neg.cc:
Move to...
* testsuite/23_containers/mdspan/submdspan/canonical_slices_neg.cc: ...here.
Updated calls to submdspan_canonicalize_slices.
* testsuite/23_containers/mdspan/submdspan/submdspan_extents.cc: Move to...
* testsuite/23_containers/mdspan/submdspan/subextents.cc: ...here.
Qualified and renamed calls to submdspan_extents.
* testsuite/23_containers/mdspan/submdspan/submdspan_extents_neg.cc: Move to...
* testsuite/23_containers/mdspan/submdspan/subextents_neg.cc: ...here.
Qualified and renamed calls to submdspan_extents.
Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
template<typename _IndexType, size_t... _Extents, typename... _RawSlices>
requires (sizeof...(_RawSlices) == sizeof...(_Extents))
constexpr auto
- submdspan_extents(const extents<_IndexType, _Extents...>& __exts,
- _RawSlices... __raw_slices)
+ subextents(const extents<_IndexType, _Extents...>& __exts,
+ _RawSlices... __raw_slices)
{
auto __impl = [&__exts](auto... __slices)
{
template<typename _IndexType, size_t... _Extents, typename... _RawSlices>
requires (sizeof...(_Extents) == sizeof...(_RawSlices))
constexpr auto
- submdspan_canonicalize_slices(const extents<_IndexType, _Extents...>& __exts,
- _RawSlices... __raw_slices)
+ canonical_slices(const extents<_IndexType, _Extents...>& __exts,
+ _RawSlices... __raw_slices)
{
auto __impl = [&__exts](auto... __slices)
{
{
using IndexType = typename Extents::index_type;
auto ci_expected = std::cw<IndexType{ci_raw.value}>;
- auto [ci] = std::submdspan_canonicalize_slices(exts, ci_raw);
+ auto [ci] = std::canonical_slices(exts, ci_raw);
static_assert(std::same_as<decltype(ci), decltype(ci_expected)>);
VERIFY(std::cmp_equal(ci.value, ci_raw.value));
- auto [i] = std::submdspan_canonicalize_slices(exts, ci_raw.value);
+ auto [i] = std::canonical_slices(exts, ci_raw.value);
static_assert(std::same_as<decltype(i), IndexType>);
VERIFY(std::cmp_equal(i, ci_raw.value));
return true;
auto c1 = std::cw<IndexType{1}>;
auto raw_cc = Pair{cbegin, cend};
- auto [cc] = std::submdspan_canonicalize_slices(exts, raw_cc);
+ auto [cc] = std::canonical_slices(exts, raw_cc);
assert_same(cc.offset, coffset);
assert_same(cc.extent, cextent);
assert_same(cc.stride, c1);
auto raw_cd = Pair{cbegin, cend.value};
- auto [cd] = std::submdspan_canonicalize_slices(exts, raw_cd);
+ auto [cd] = std::canonical_slices(exts, raw_cd);
assert_same(cd.offset, coffset);
assert_same(cd.extent, cextent.value);
assert_same(cd.stride, c1);
auto raw_dc = Pair{cbegin.value, cend};
- auto [dc] = std::submdspan_canonicalize_slices(exts, raw_dc);
+ auto [dc] = std::canonical_slices(exts, raw_dc);
assert_same(dc.offset, coffset.value);
assert_same(dc.extent, cextent.value);
assert_same(dc.stride, c1);
auto raw_dd = Pair{cbegin.value, cend.value};
- auto [dd] = std::submdspan_canonicalize_slices(exts, raw_dd);
+ auto [dd] = std::canonical_slices(exts, raw_dd);
assert_same(dd.offset, coffset.value);
assert_same(dd.extent, cextent.value);
assert_same(dd.stride, c1);
auto cstride = std::cw<IndexType{cs.value}>;
auto raw_ccc = std::strided_slice{co, ce, cs};
- auto [ccc] = std::submdspan_canonicalize_slices(exts, raw_ccc);
+ auto [ccc] = std::canonical_slices(exts, raw_ccc);
assert_same(ccc.offset, coffset);
assert_same(ccc.extent, cextent);
assert_same(ccc.stride, cstride);
auto raw_dcc = std::strided_slice{co.value, ce, cs};
- auto [dcc] = std::submdspan_canonicalize_slices(exts, raw_dcc);
+ auto [dcc] = std::canonical_slices(exts, raw_dcc);
assert_same(dcc.offset, coffset.value);
assert_same(dcc.extent, cextent);
assert_same(dcc.stride, cstride);
auto raw_cdc = std::strided_slice{co, ce.value, cs};
- auto [cdc] = std::submdspan_canonicalize_slices(exts, raw_cdc);
+ auto [cdc] = std::canonical_slices(exts, raw_cdc);
assert_same(cdc.offset, coffset);
assert_same(cdc.extent, cextent.value);
assert_same(cdc.stride, cstride);
auto raw_ccd = std::strided_slice{co, ce, cs.value};
- auto [ccd] = std::submdspan_canonicalize_slices(exts, raw_ccd);
+ auto [ccd] = std::canonical_slices(exts, raw_ccd);
assert_same(ccd.offset, coffset);
assert_same(ccd.extent, cextent);
assert_same(ccd.stride, cstride.value);
using IndexType = typename decltype(exts)::index_type;
auto c0 = std::cw<uint8_t{0}>;
auto raw_ccc = std::strided_slice{c0, c0, cs};
- auto [ccc] = std::submdspan_canonicalize_slices(exts, raw_ccc);
+ auto [ccc] = std::canonical_slices(exts, raw_ccc);
assert_same(ccc.stride, std::cw<IndexType{1}>);
auto raw_ccd = std::strided_slice{c0, c0, cs.value};
- auto [ccd] = std::submdspan_canonicalize_slices(exts, raw_ccd);
+ auto [ccd] = std::canonical_slices(exts, raw_ccd);
assert_same(ccd.stride, std::cw<IndexType{1}>);
return true;
}
test_rank_mismatch()
{
auto exts = std::extents(1);
- std::submdspan_canonicalize_slices(exts, 0, 0); // { dg-error "no matching" }
+ std::canonical_slices(exts, 0, 0); // { dg-error "no matching" }
return true;
}
constexpr bool
test_under1(Int i1, Extents exts)
{
- auto [s1] = std::submdspan_canonicalize_slices(exts, i1);
+ auto [s1] = std::canonical_slices(exts, i1);
return true;
}
constexpr bool
test_over1(Int i1, Extents exts)
{
- auto [s1] = std::submdspan_canonicalize_slices(exts, i1);
+ auto [s1] = std::canonical_slices(exts, i1);
return true;
}
constexpr bool
test_under2(Offset o, Extent e, Stride s, Extents exts)
{
- std::submdspan_canonicalize_slices(exts, std::strided_slice{o, e, s});
+ std::canonical_slices(exts, std::strided_slice{o, e, s});
return true;
}
constexpr bool
test_over2(Offset o, Extent e, Stride s, Extents exts)
{
- std::submdspan_canonicalize_slices(exts, std::strided_slice{o, e, s});
+ std::canonical_slices(exts, std::strided_slice{o, e, s});
return true;
}
{
auto exts = std::extents<uint8_t, dyn>{255};
auto slice = std::strided_slice{o, e, 1};
- std::submdspan_canonicalize_slices(exts, slice);
+ std::canonical_slices(exts, slice);
return true;
}
{
auto exts = std::extents<uint8_t, dyn>{255};
auto slice = std::pair{b, e};
- std::submdspan_canonicalize_slices(exts, slice);
+ std::canonical_slices(exts, slice);
return true;
}
{
auto exts = std::extents(5);
auto slice = std::strided_slice(0, e, s);
- std::submdspan_canonicalize_slices(exts, slice);
+ std::canonical_slices(exts, slice);
return true;
}
test_from_full_extent()
{
auto exts = std::extents<int, 3, dyn, 7>{};
- auto sub_exts = submdspan_extents(exts, 1, all, all);
+ auto sub_exts = std::subextents(exts, 1, all, all);
VERIFY(sub_exts.rank() == 2);
VERIFY(sub_exts.static_extent(0) == dyn);
VERIFY(sub_exts.extent(0) == exts.extent(1));
auto s0 = Cw<1>{};
auto s1 = Pair{Cw<1>{}, Cw<2>{}};
auto s2 = Pair{Cw<1>{}, 4};
- auto sub_exts = submdspan_extents(exts, s0, s1, s2);
+ auto sub_exts = std::subextents(exts, s0, s1, s2);
VERIFY(sub_exts.rank() == 2);
VERIFY(sub_exts.static_extent(0) == size_t(get<1>(s1) - get<0>(s1)));
VERIFY(sub_exts.static_extent(1) == dyn);
test_from_int_like_as_scalar()
{
auto exts = std::extents<int, 3, 5>{};
- auto sub_exts = submdspan_extents(exts, Int(1), std::tuple{1, 3});
+ auto sub_exts = std::subextents(exts, Int(1), std::tuple{1, 3});
VERIFY(sub_exts.rank() == 1);
VERIFY(sub_exts.static_extent(0) == dyn);
VERIFY(sub_exts.extent(0) == 2);
test_from_const_int()
{
auto exts = std::extents<int, 3, 5>{};
- auto sub_exts = submdspan_extents(exts, Cw<1>{}, std::tuple{1, 3});
+ auto sub_exts = std::subextents(exts, Cw<1>{}, std::tuple{1, 3});
VERIFY(sub_exts.rank() == 1);
VERIFY(sub_exts.static_extent(0) == dyn);
VERIFY(sub_exts.extent(0) == 2);
test_from_int_like_in_tuple()
{
auto exts = std::extents<int, 3, 5>{};
- auto sub_exts = submdspan_extents(exts, Int(1), std::tuple{Int(1), Int(3)});
+ auto sub_exts = std::subextents(exts, Int(1), std::tuple{Int(1), Int(3)});
VERIFY(sub_exts.rank() == 1);
VERIFY(sub_exts.static_extent(0) == dyn);
VERIFY(sub_exts.extent(0) == 2);
auto s0 = 1;
auto s1 = std::strided_slice{0, 0, 0};
auto s2 = std::strided_slice{1, Cw<0>{}, 0};
- auto sub_exts = submdspan_extents(exts, s0, s1, s2);
+ auto sub_exts = std::subextents(exts, s0, s1, s2);
VERIFY(sub_exts.rank() == 2);
VERIFY(sub_exts.static_extent(0) == dyn);
VERIFY(sub_exts.extent(0) == 0);
auto s0 = 1;
auto s1 = std::strided_slice{0, 2, Cw<1>{}};
auto s2 = std::strided_slice{1, Cw<2>{}, 1};
- auto sub_exts = submdspan_extents(exts, s0, s1, s2);
+ auto sub_exts = std::subextents(exts, s0, s1, s2);
VERIFY(sub_exts.rank() == 2);
VERIFY(sub_exts.static_extent(0) == dyn);
VERIFY(sub_exts.extent(0) == 2);
auto s0 = 1;
auto s1 = std::strided_slice{1, Cw<4>{}, 2};
auto s2 = std::strided_slice{1, Cw<10>{}, Cw<3>{}};
- auto sub_exts = submdspan_extents(exts, s0, s1, s2);
+ auto sub_exts = std::subextents(exts, s0, s1, s2);
VERIFY(sub_exts.rank() == 2);
VERIFY(sub_exts.static_extent(0) == dyn);
VERIFY(sub_exts.extent(0) == 2);
auto s0 = std::strided_slice(0, 3, 2);
auto s1 = std::strided_slice(1, 4, 2);
auto s2 = std::strided_slice(0, 7, 3);
- auto sub_exts = submdspan_extents(exts, s0, s1, s2);
+ auto sub_exts = std::subextents(exts, s0, s1, s2);
VERIFY(sub_exts.rank() == 3);
VERIFY(sub_exts.extent(0) == 2);
VERIFY(sub_exts.extent(1) == 2);
test_unrelated_stride_type()
{
auto exts = std::extents(3, 5, 7);
- auto sub_exts = submdspan_extents(exts, 1, NotASlice{}, 2); // { dg-error "required from" }
+ auto sub_exts = subextents(exts, 1, NotASlice{}, 2); // { dg-error "required from" }
return true;
}
static_assert(test_unrelated_stride_type());
{
auto exts = std::extents(3, 5, 7);
auto s = std::strided_slice{0, 1, 0};
- auto sub_exts = submdspan_extents(exts, 1, s, 2); // { dg-error "expansion of" }
+ auto sub_exts = std::subextents(exts, 1, s, 2); // { dg-error "expansion of" }
return true;
}
static_assert(test_invalid_stride_zero());
test_out_of_bounds(const Slice& slice)
{
auto exts = std::extents<uint16_t, 3, 5, 7>{};
- auto sub_exts = submdspan_extents(exts, 1, slice, 2); // { dg-error "expansion of" }
+ auto sub_exts = std::subextents(exts, 1, slice, 2); // { dg-error "expansion of" }
return true;
}
static_assert(test_out_of_bounds(std::strided_slice{0, 6, 1})); // { dg-error "expansion of" }