Adds tests for layout_right and for the parts of layout_left that depend on layout_right.
libstdc++/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> --- .../mdspan/layouts/class_mandate_neg.cc | 1 + .../23_containers/mdspan/layouts/ctors.cc | 90 +++++++++++++++++++ .../23_containers/mdspan/layouts/mapping.cc | 20 +++++ 3 files changed, 111 insertions(+) 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 2fd27d0bd35..fdebda8bd06 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 @@ -17,5 +17,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 "not 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 c7cf5501628..5c54b440083 100644 --- a/libstdc++-v3/testsuite/23_containers/mdspan/layouts/ctors.cc +++ b/libstdc++-v3/testsuite/23_containers/mdspan/layouts/ctors.cc @@ -116,6 +116,92 @@ namespace from_same_layout } } +// ctor: mapping(layout_{right,left}::mapping<OExtents>) +namespace from_left_or_right +{ + template<typename SLayout, typename OLayout> + constexpr void + test_constructible() + { + static_assert(!std::is_constructible_v< + typename SLayout::mapping<std::extents<int, 1>>, + typename OLayout::mapping<std::extents<int>>>); + + static_assert(!std::is_constructible_v< + typename SLayout::mapping<std::extents<int>>, + typename OLayout::mapping<std::extents<int, 1>>>); + + static_assert(!std::is_constructible_v< + typename SLayout::mapping<std::extents<int, 1, 2>>, + typename OLayout::mapping<std::extents<int, 1, 2>>>); + } + + template<typename SMapping, typename OMapping> + constexpr void + test_convertible() + { + constexpr bool expected = std::is_convertible_v< + typename OMapping::extents_type, typename SMapping::extents_type>; + static_assert(std::is_convertible_v<OMapping, SMapping> == expected); + } + + template<typename SLayout, typename OLayout> + constexpr void + test_convertible_all() + { + test_convertible< + typename OLayout::mapping<std::extents<int>>, + typename SLayout::mapping<std::extents<unsigned int>>>(); + + test_convertible< + typename OLayout::mapping<std::extents<unsigned int>>, + typename SLayout::mapping<std::extents<int>>>(); + + test_convertible< + typename OLayout::mapping<std::extents<int, 1>>, + typename SLayout::mapping<std::extents<int, 1>>>(); + + test_convertible< + typename OLayout::mapping<std::extents<int, 1>>, + typename SLayout::mapping<std::extents<unsigned int, 1>>>(); + + test_convertible< + typename OLayout::mapping<std::extents<unsigned int, 1>>, + typename SLayout::mapping<std::extents<int, 1>>>(); + } + + template<typename SLayout, typename OLayout, typename Extents> + constexpr bool + test_ctor(Extents exts) + { + typename OLayout::mapping<Extents> m1(exts); + typename SLayout::mapping<Extents> m2(m1); + VERIFY(m1.extents() == m2.extents()); + return true; + } + + template<typename SLayout, typename OLayout> + constexpr bool + test_ctor_all() + { + test_ctor<SLayout, OLayout>(std::extents<int>{}); + test_ctor<SLayout, OLayout>(std::extents<int, 1>{}); + test_ctor<SLayout, OLayout>(std::extents<int, dyn>{3}); + return true; + } + + template<typename SLayout, typename OLayout> + constexpr void + test_all() + { + test_constructible<SLayout, OLayout>(); + test_convertible_all<SLayout, OLayout>(); + + test_ctor_all<SLayout, OLayout>(); + static_assert(test_ctor_all<SLayout, OLayout>()); + } +} + template<typename Layout> constexpr void test_all() @@ -128,5 +214,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 1d7d4c4e1c7..f59dd75d01f 100644 --- a/libstdc++-v3/testsuite/23_containers/mdspan/layouts/mapping.cc +++ b/libstdc++-v3/testsuite/23_containers/mdspan/layouts/mapping.cc @@ -239,6 +239,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(); @@ -253,6 +262,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() @@ -367,5 +386,6 @@ int main() { test_all<std::layout_left>(); + test_all<std::layout_right>(); return 0; } -- 2.49.0