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
>
>

Reply via email to