Pushed to the trunk. On Wed, Jul 23, 2025 at 1:22 PM Tomasz Kaminski <tkami...@redhat.com> wrote:
> I plan to merge this to trunk with one change to message, as mentioned > below, > to reduce the number of commits that will be piling up to get approved. > > On Wed, Jul 23, 2025 at 11:30 AM Luc Grosheintz <luc.groshei...@gmail.com> > wrote: > >> All test code of default_accessor can be reused. This commit moves >> the reuseable code into a file generic.cc and prepares the tests for >> reuse with aligned_accessor. >> >> The AllocatorTrait creates a unified interface for creating both >> default_accessor<T> and aligned_accessor<T, N> typenames. >> > I will remove that sentence as we just pass Acesssor. > >> >> libstdc++-v3/ChangeLog: >> >> * testsuite/23_containers/mdspan/accessors/default.cc: Delete. >> * testsuite/23_containers/mdspan/accessors/generic.cc: Slightly >> generalize the test code previously in default.cc. >> >> Signed-off-by: Luc Grosheintz <luc.groshei...@gmail.com> >> --- >> > .../23_containers/mdspan/accessors/default.cc | 99 -------------- >> .../23_containers/mdspan/accessors/generic.cc | 125 ++++++++++++++++++ >> 2 files changed, 125 insertions(+), 99 deletions(-) >> delete mode 100644 >> libstdc++-v3/testsuite/23_containers/mdspan/accessors/default.cc >> create mode 100644 >> libstdc++-v3/testsuite/23_containers/mdspan/accessors/generic.cc >> >> diff --git >> a/libstdc++-v3/testsuite/23_containers/mdspan/accessors/default.cc >> b/libstdc++-v3/testsuite/23_containers/mdspan/accessors/default.cc >> deleted file mode 100644 >> index c036f8ad10f..00000000000 >> --- a/libstdc++-v3/testsuite/23_containers/mdspan/accessors/default.cc >> +++ /dev/null >> @@ -1,99 +0,0 @@ >> -// { dg-do run { target c++23 } } >> -#include <mdspan> >> - >> -#include <testsuite_hooks.h> >> - >> -constexpr size_t dyn = std::dynamic_extent; >> - >> -template<typename Accessor> >> - constexpr void >> - test_accessor_policy() >> - { >> - static_assert(std::copyable<Accessor>); >> - static_assert(std::is_nothrow_move_constructible_v<Accessor>); >> - static_assert(std::is_nothrow_move_assignable_v<Accessor>); >> - static_assert(std::is_nothrow_swappable_v<Accessor>); >> - } >> - >> -constexpr bool >> -test_access() >> -{ >> - std::default_accessor<double> accessor; >> - std::array<double, 5> a{10, 11, 12, 13, 14}; >> - VERIFY(accessor.access(a.data(), 0) == 10); >> - VERIFY(accessor.access(a.data(), 4) == 14); >> - return true; >> -} >> - >> -constexpr bool >> -test_offset() >> -{ >> - std::default_accessor<double> accessor; >> - std::array<double, 5> a{10, 11, 12, 13, 14}; >> - VERIFY(accessor.offset(a.data(), 0) == a.data()); >> - VERIFY(accessor.offset(a.data(), 4) == a.data() + 4); >> - return true; >> -} >> - >> -class Base >> -{ }; >> - >> -class Derived : public Base >> -{ }; >> - >> -constexpr void >> -test_ctor() >> -{ >> - // T -> T >> - >> static_assert(std::is_nothrow_constructible_v<std::default_accessor<double>, >> - >> std::default_accessor<double>>); >> - static_assert(std::is_convertible_v<std::default_accessor<double>, >> - std::default_accessor<double>>); >> - >> - // T -> const T >> - static_assert(std::is_convertible_v<std::default_accessor<double>, >> - std::default_accessor<const >> double>>); >> - static_assert(std::is_convertible_v<std::default_accessor<Derived>, >> - std::default_accessor<const >> Derived>>); >> - >> - // const T -> T >> - static_assert(!std::is_constructible_v<std::default_accessor<double>, >> - std::default_accessor<const >> double>>); >> - static_assert(!std::is_constructible_v<std::default_accessor<Derived>, >> - std::default_accessor<const >> Derived>>); >> - >> - // T <-> volatile T >> - static_assert(std::is_convertible_v<std::default_accessor<int>, >> - std::default_accessor<volatile >> int>>); >> - static_assert(!std::is_constructible_v<std::default_accessor<int>, >> - std::default_accessor<volatile >> int>>); >> - >> - // size difference >> - static_assert(!std::is_constructible_v<std::default_accessor<char>, >> - std::default_accessor<int>>); >> - >> - // signedness >> - static_assert(!std::is_constructible_v<std::default_accessor<int>, >> - std::default_accessor<unsigned >> int>>); >> - static_assert(!std::is_constructible_v<std::default_accessor<unsigned >> int>, >> - std::default_accessor<int>>); >> - >> - // Derived <-> Base >> - static_assert(!std::is_constructible_v<std::default_accessor<Base>, >> - std::default_accessor<Derived>>); >> - static_assert(!std::is_constructible_v<std::default_accessor<Derived>, >> - std::default_accessor<Base>>); >> - >> -} >> - >> -int >> -main() >> -{ >> - test_accessor_policy<std::default_accessor<double>>(); >> - test_access(); >> - static_assert(test_access()); >> - test_offset(); >> - static_assert(test_offset()); >> - test_ctor(); >> - return 0; >> -} >> diff --git >> a/libstdc++-v3/testsuite/23_containers/mdspan/accessors/generic.cc >> b/libstdc++-v3/testsuite/23_containers/mdspan/accessors/generic.cc >> new file mode 100644 >> index 00000000000..c3350353aae >> --- /dev/null >> +++ b/libstdc++-v3/testsuite/23_containers/mdspan/accessors/generic.cc >> @@ -0,0 +1,125 @@ >> +// { dg-do run { target c++23 } } >> +#include <mdspan> >> + >> +#include <testsuite_hooks.h> >> + >> +template<typename Accessor> >> + constexpr bool >> + test_class_properties() >> + { >> + static_assert(std::is_trivially_copyable_v<Accessor>); >> + static_assert(std::semiregular<Accessor>); >> + return true; >> + } >> + >> +template<typename Accessor> >> + constexpr bool >> + test_accessor_policy() >> + { >> + static_assert(std::copyable<Accessor>); >> + static_assert(std::is_nothrow_move_constructible_v<Accessor>); >> + static_assert(std::is_nothrow_move_assignable_v<Accessor>); >> + static_assert(std::is_nothrow_swappable_v<Accessor>); >> + return true; >> + } >> + >> +class Base >> +{ }; >> + >> +class Derived : public Base >> +{ }; >> + >> +template<template<typename T> typename Accessor> >> + constexpr bool >> + test_ctor() >> + { >> + // T -> T >> + static_assert(std::is_nothrow_constructible_v<Accessor<double>, >> + Accessor<double>>); >> + static_assert(std::is_convertible_v<Accessor<double>, >> Accessor<double>>); >> + >> + // T -> const T >> + static_assert(std::is_convertible_v<Accessor<double>, >> + Accessor<const double>>); >> + static_assert(std::is_convertible_v<Accessor<Derived>, >> + Accessor<const Derived>>); >> + >> + // const T -> T >> + static_assert(!std::is_constructible_v<Accessor<double>, >> + Accessor<const double>>); >> + static_assert(!std::is_constructible_v<Accessor<Derived>, >> + Accessor<const Derived>>); >> + >> + // T <-> volatile T >> + static_assert(std::is_convertible_v<Accessor<int>, Accessor<volatile >> int>>); >> + static_assert(!std::is_constructible_v<Accessor<int>, >> + Accessor<volatile int>>); >> + >> + // size difference >> + static_assert(!std::is_constructible_v<Accessor<char>, >> Accessor<int>>); >> + >> + // signedness >> + static_assert(!std::is_constructible_v<Accessor<int>, >> + Accessor<unsigned int>>); >> + static_assert(!std::is_constructible_v<Accessor<unsigned int>, >> + Accessor<int>>); >> + >> + // Derived <-> Base >> + static_assert(!std::is_constructible_v<Accessor<Base>, >> Accessor<Derived>>); >> + static_assert(!std::is_constructible_v<Accessor<Derived>, >> Accessor<Base>>); >> + return true; >> + } >> + >> +template<template<typename T> typename Accessor> >> + constexpr bool >> + test_properties() >> + { >> + test_class_properties<Accessor<double>>(); >> + test_accessor_policy<Accessor<double>>(); >> + test_ctor<Accessor>(); >> + return true; >> + } >> + >> +static_assert(test_properties<std::default_accessor>()); >> + >> +template<typename A> >> + constexpr size_t >> + accessor_alignment = alignof(typename A::element_type); >> + >> +template<typename Accessor> >> + constexpr void >> + test_access(Accessor accessor) >> + { >> + constexpr size_t N = accessor_alignment<Accessor>; >> + alignas(N) std::array<double, 5> a{10, 11, 12, 13, 14}; >> + for (size_t i = 0; i < a.size(); ++i) >> + VERIFY(accessor.access(a.data(), i) == 10 + i); >> + } >> + >> +template<typename Accessor> >> + constexpr void >> + test_offset(Accessor accessor) >> + { >> + constexpr size_t N = accessor_alignment<Accessor>; >> + alignas(N) std::array<double, 5> a{10, 11, 12, 13, 14}; >> + for (size_t i = 0; i < a.size(); ++i) >> + VERIFY(accessor.offset(a.data(), i) == a.data() + i); >> + } >> + >> +template<typename Accessor> >> + constexpr bool >> + test_all() >> + { >> + auto accessor = Accessor{}; >> + test_offset(accessor); >> + test_access(accessor); >> + return true; >> + } >> + >> +int >> +main() >> +{ >> + test_all<std::default_accessor<double>>(); >> + static_assert(test_all<std::default_accessor<double>>()); >> + return 0; >> +} >> -- >> 2.50.0 >> >>