On Wed, May 21, 2025 at 11:52 AM Luc Grosheintz <luc.groshei...@gmail.com> wrote:
> Adds tests for layout_right and for the parts of layout_left that depend > on layout_right. > > libstdc++-v3/ChangeLog: > > * testsuite/23_containers/mdspan/layouts/class_mandate_neg.cc: Add > tests for layout_stride. > * testsuite/23_containers/mdspan/layouts/ctors.cc: Add tests for > layout_right and the interaction with layout_left. > * testsuite/23_containers/mdspan/layouts/mapping.cc: ditto. > > Signed-off-by: Luc Grosheintz <luc.groshei...@gmail.com> > This also looks nice. The generalization of the test in previous comments have paid off as you can add new layouts easily. > --- > .../mdspan/layouts/class_mandate_neg.cc | 1 + > .../23_containers/mdspan/layouts/ctors.cc | 64 +++++++++++++++ > .../23_containers/mdspan/layouts/mapping.cc | 78 ++++++++++++++++--- > 3 files changed, 133 insertions(+), 10 deletions(-) > > diff --git > a/libstdc++-v3/testsuite/23_containers/mdspan/layouts/class_mandate_neg.cc > b/libstdc++-v3/testsuite/23_containers/mdspan/layouts/class_mandate_neg.cc > index b276fbd333e..a41bad988d2 100644 > --- > a/libstdc++-v3/testsuite/23_containers/mdspan/layouts/class_mandate_neg.cc > +++ > b/libstdc++-v3/testsuite/23_containers/mdspan/layouts/class_mandate_neg.cc > @@ -18,5 +18,6 @@ template<typename Layout> > }; > > A<std::layout_left> a_left; // { dg-error "required > from" } > +A<std::layout_right> a_right; // { dg-error "required > from" } > > // { dg-prune-output "must be representable as index_type" } > diff --git a/libstdc++-v3/testsuite/23_containers/mdspan/layouts/ctors.cc > b/libstdc++-v3/testsuite/23_containers/mdspan/layouts/ctors.cc > index c96f314818a..4a7d2bffeef 100644 > --- a/libstdc++-v3/testsuite/23_containers/mdspan/layouts/ctors.cc > +++ b/libstdc++-v3/testsuite/23_containers/mdspan/layouts/ctors.cc > @@ -222,6 +222,66 @@ namespace from_same_layout > } > } > > +// ctor: mapping(layout_{right,left}::mapping<OExtents>) > +namespace from_left_or_right > +{ > + template<typename SLayout, typename OLayout, typename SExtents, > + typename OExtents> > + constexpr void > + verify_ctor(OExtents oexts) > + { > + using SMapping = typename SLayout::mapping<SExtents>; > + using OMapping = typename OLayout::mapping<OExtents>; > + > + constexpr bool expected = std::is_convertible_v<OExtents, SExtents>; > + if constexpr (expected) > + verify_nothrow_convertible<SMapping>(OMapping(oexts)); > + else > + verify_nothrow_constructible<SMapping>(OMapping(oexts)); > + } > + > + template<typename SLayout, typename OLayout> > + constexpr bool > + test_ctor() > + { > + assert_not_constructible< > + typename SLayout::mapping<std::extents<int>>, > + typename OLayout::mapping<std::extents<int, 1>>>(); > + > + verify_ctor<OLayout, SLayout, std::extents<int>>( > + std::extents<unsigned int>{}); > + > + verify_ctor<OLayout, SLayout, std::extents<unsigned int>>( > + std::extents<int>{}); > + > + assert_not_constructible< > + typename SLayout::mapping<std::extents<int, 1>>, > + typename OLayout::mapping<std::extents<int>>>(); > + > + verify_ctor<OLayout, SLayout, std::extents<int, 1>>( > + std::extents<int, 1>{}); > + > + verify_ctor<OLayout, SLayout, std::extents<int, 1>>( > + std::extents<unsigned int, 1>{}); > + > + verify_ctor<OLayout, SLayout, std::extents<unsigned int, 1>>( > + std::extents<int, 1>{}); > + > + assert_not_constructible< > + typename SLayout::mapping<std::extents<int, 1, 2>>, > + typename OLayout::mapping<std::extents<int, 1, 2>>>(); > + return true; > + } > + > + template<typename SLayout, typename OLayout> > + constexpr void > + test_all() > + { > + test_ctor<SLayout, OLayout>(); > + static_assert(test_ctor<SLayout, OLayout>()); > + } > +} > + > template<typename Layout> > constexpr void > test_all() > @@ -234,5 +294,9 @@ int > main() > { > test_all<std::layout_left>(); > + test_all<std::layout_right>(); > + > + from_left_or_right::test_all<std::layout_left, std::layout_right>(); > + from_left_or_right::test_all<std::layout_right, std::layout_left>(); > return 0; > } > diff --git > a/libstdc++-v3/testsuite/23_containers/mdspan/layouts/mapping.cc > b/libstdc++-v3/testsuite/23_containers/mdspan/layouts/mapping.cc > index 60630dc37ca..c6bf04a5446 100644 > --- a/libstdc++-v3/testsuite/23_containers/mdspan/layouts/mapping.cc > +++ b/libstdc++-v3/testsuite/23_containers/mdspan/layouts/mapping.cc > @@ -294,6 +294,15 @@ template<> > VERIFY(m.stride(1) == 3); > } > > +template<> > + constexpr void > + test_stride_2d<std::layout_right>() > + { > + std::layout_right::mapping<std::extents<int, 3, 5>> m; > + VERIFY(m.stride(0) == 5); > + VERIFY(m.stride(1) == 1); > + } > + > template<typename Layout> > constexpr void > test_stride_3d(); > @@ -308,6 +317,16 @@ template<> > VERIFY(m.stride(2) == 3*5); > } > > +template<> > + constexpr void > + test_stride_3d<std::layout_right>() > + { > + std::layout_right::mapping m(std::dextents<int, 3>(3, 5, 7)); > + VERIFY(m.stride(0) == 35); > + VERIFY(m.stride(1) == 7); > + VERIFY(m.stride(2) == 1); > + } > + > template<typename Layout> > constexpr bool > test_stride_all() > @@ -382,24 +401,59 @@ template<typename M1, typename M2> > { m2 != m1 } -> std::same_as<bool>; > }; > > -template<typename Layout> > - constexpr bool > +template<typename SLayout, typename OLayout, bool Expected> > + constexpr void > test_has_op_eq() > { > + static_assert(has_op_eq< > + typename SLayout::mapping<std::extents<int>>, > + typename OLayout::mapping<std::extents<int>>> == Expected); > + > + static_assert(!has_op_eq< > + typename SLayout::mapping<std::extents<int>>, > + typename OLayout::mapping<std::extents<int, 1>>>); > + > + static_assert(has_op_eq< > + typename SLayout::mapping<std::extents<int, 1>>, > + typename OLayout::mapping<std::extents<int, 1>>> == Expected); > + > + static_assert(has_op_eq< > + typename SLayout::mapping<std::extents<int, 1>>, > + typename OLayout::mapping<std::extents<int, 2>>> == Expected); > + > static_assert(!has_op_eq< > - typename Layout::mapping<std::extents<int, 1, 2>>, > - typename Layout::mapping<std::extents<int, 1>>>); > + typename SLayout::mapping<std::extents<int, 1>>, > + typename OLayout::mapping<std::extents<int, 1, 2>>>); > > static_assert(has_op_eq< > - typename Layout::mapping<std::extents<int, 1>>, > - typename Layout::mapping<std::extents<int, 1>>>); > + typename SLayout::mapping<std::extents<int, 1, 2>>, > + typename OLayout::mapping<std::extents<int, 1, 2>>> == Expected); > > static_assert(has_op_eq< > - typename Layout::mapping<std::extents<int, 1>>, > - typename Layout::mapping<std::extents<int, 2>>>); > - return true; > + typename SLayout::mapping<std::extents<int, 1, 2>>, > + typename OLayout::mapping<std::extents<int, 2, 2>>> == Expected); > + > + static_assert(!has_op_eq< > + typename SLayout::mapping<std::extents<int, 1, 2>>, > + typename OLayout::mapping<std::extents<int, 1, 2, 3>>>); > } > > +constexpr void > +test_has_op_eq_peculiar() > +{ > + static_assert(has_op_eq< > + std::layout_right::mapping<std::extents<int>>, > + std::layout_left::mapping<std::extents<unsigned int>>>); > + > + static_assert(has_op_eq< > + std::layout_right::mapping<std::extents<int, 1>>, > + std::layout_left::mapping<std::extents<int, dyn>>>); > + > + static_assert(!has_op_eq< > + std::layout_right::mapping<std::extents<int, 1, 2>>, > + std::layout_left::mapping<std::extents<int, dyn, 2>>>); > +} > + > template<typename Layout> > constexpr bool > test_mapping_all() > @@ -427,12 +481,16 @@ template<typename Layout> > test_has_stride_0d<Layout>(); > test_has_stride_1d<Layout>(); > test_has_stride_2d<Layout>(); > - test_has_op_eq<Layout>(); > + test_has_op_eq<Layout, Layout, true>(); > } > > int > main() > { > test_all<std::layout_left>(); > + test_all<std::layout_right>(); > + > + test_has_op_eq<std::layout_right, std::layout_left, false>(); > + test_has_op_eq_peculiar(); > return 0; > } > -- > 2.49.0 > >