mirror of
https://github.com/gcc-mirror/gcc.git
synced 2026-05-06 14:59:39 +02:00
libstdc++: Prepare mapping layout tests for padded layouts.
Using the existing tests for padded layouts requires the following changes: * The padded layouts are template classes. In order to be able to use partially specialized templates, functions need to be converted to structs. * The layout mapping tests include a check that only applies if is_exhaustive is static. This commit introduces a concept to check if is_exhaustive is a static member function. * Fix a test to not use a hard-coded layout_left. The test empty.cc contains indentation mistakes that are fixed. libstdc++-v3/ChangeLog: * testsuite/23_containers/mdspan/layouts/empty.cc: Fix indent. * testsuite/23_containers/mdspan/layouts/mapping.cc (test_stride_1d): Fix test. (test_stride_2d): Rewrite using a struct. (test_stride_3d): Ditto. (has_static_is_exhaustive): New concept. (test_mapping_properties): Update test. Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com> Reviewed-by: Jonathan Wakely <jwakely@redhat.com> Signed-off-by: Luc Grosheintz <luc.grosheintz@gmail.com>
This commit is contained in:
committed by
Tomasz Kamiński
parent
4f9f1269f4
commit
181e7bea46
@@ -30,96 +30,96 @@ template<typename Mapping>
|
||||
}
|
||||
|
||||
template<typename Layout, typename Int>
|
||||
constexpr void
|
||||
test_static_overflow()
|
||||
{
|
||||
constexpr Int n1 = std::numeric_limits<Int>::max();
|
||||
constexpr size_t n2 = std::dynamic_extent - 1;
|
||||
constexpr size_t n = std::cmp_less(n1, n2) ? size_t(n1) : n2;
|
||||
constexpr void
|
||||
test_static_overflow()
|
||||
{
|
||||
constexpr Int n1 = std::numeric_limits<Int>::max();
|
||||
constexpr size_t n2 = std::dynamic_extent - 1;
|
||||
constexpr size_t n = std::cmp_less(n1, n2) ? size_t(n1) : n2;
|
||||
|
||||
verify_all(typename Layout::mapping<std::extents<Int, n, n, 0, n, n>>{});
|
||||
verify_all(typename Layout::mapping<std::extents<Int, 0, n, n, n>>{});
|
||||
verify_all(typename Layout::mapping<std::extents<Int, dyn, n, n, n>>{});
|
||||
verify_all(typename Layout::mapping<std::extents<Int, n, n, n, 0>>{});
|
||||
verify_all(typename Layout::mapping<std::extents<Int, n, n, n, dyn>>{});
|
||||
}
|
||||
verify_all(typename Layout::mapping<std::extents<Int, n, n, 0, n, n>>{});
|
||||
verify_all(typename Layout::mapping<std::extents<Int, 0, n, n, n>>{});
|
||||
verify_all(typename Layout::mapping<std::extents<Int, dyn, n, n, n>>{});
|
||||
verify_all(typename Layout::mapping<std::extents<Int, n, n, n, 0>>{});
|
||||
verify_all(typename Layout::mapping<std::extents<Int, n, n, n, dyn>>{});
|
||||
}
|
||||
|
||||
template<typename Int, size_t N>
|
||||
constexpr std::array<Int, N>
|
||||
make_strides()
|
||||
{
|
||||
std::array<Int, N> strides;
|
||||
std::ranges::fill(strides, Int(1));
|
||||
return strides;
|
||||
}
|
||||
constexpr std::array<Int, N>
|
||||
make_strides()
|
||||
{
|
||||
std::array<Int, N> strides;
|
||||
std::ranges::fill(strides, Int(1));
|
||||
return strides;
|
||||
}
|
||||
|
||||
template<typename Layout, typename Extents>
|
||||
constexpr typename Layout::mapping<Extents>
|
||||
make_mapping(Extents exts)
|
||||
{
|
||||
using IndexType = typename Extents::index_type;
|
||||
constexpr auto rank = Extents::rank();
|
||||
constexpr auto strides = make_strides<IndexType, rank>();
|
||||
constexpr typename Layout::mapping<Extents>
|
||||
make_mapping(Extents exts)
|
||||
{
|
||||
using IndexType = typename Extents::index_type;
|
||||
constexpr auto rank = Extents::rank();
|
||||
constexpr auto strides = make_strides<IndexType, rank>();
|
||||
|
||||
if constexpr (std::same_as<Layout, std::layout_stride>)
|
||||
return typename Layout::mapping(exts, strides);
|
||||
else
|
||||
return typename Layout::mapping(exts);
|
||||
}
|
||||
if constexpr (std::same_as<Layout, std::layout_stride>)
|
||||
return typename Layout::mapping(exts, strides);
|
||||
else
|
||||
return typename Layout::mapping(exts);
|
||||
}
|
||||
|
||||
template<typename Layout, typename Int>
|
||||
constexpr void
|
||||
test_dynamic_overflow()
|
||||
{
|
||||
constexpr Int n1 = std::numeric_limits<Int>::max();
|
||||
constexpr size_t n2 = std::dynamic_extent - 1;
|
||||
constexpr Int n = std::cmp_less(n1, n2) ? n1 : Int(n2);
|
||||
constexpr void
|
||||
test_dynamic_overflow()
|
||||
{
|
||||
constexpr Int n1 = std::numeric_limits<Int>::max();
|
||||
constexpr size_t n2 = std::dynamic_extent - 1;
|
||||
constexpr Int n = std::cmp_less(n1, n2) ? n1 : Int(n2);
|
||||
|
||||
verify_all(make_mapping<Layout>(
|
||||
std::extents<Int, dyn, dyn, 0, dyn, dyn>{n, n, n, n}));
|
||||
verify_all(make_mapping<Layout>(
|
||||
std::extents<Int, dyn, dyn, 0, dyn, dyn>{n, n, n, n}));
|
||||
|
||||
verify_all(make_mapping<Layout>(
|
||||
std::extents<Int, dyn, dyn, dyn, dyn, dyn>{n, n, 0, n, n}));
|
||||
verify_all(make_mapping<Layout>(
|
||||
std::extents<Int, dyn, dyn, dyn, dyn, dyn>{n, n, 0, n, n}));
|
||||
|
||||
verify_all(make_mapping<Layout>(
|
||||
std::extents<Int, dyn, dyn, dyn, 0>{n, n, n}));
|
||||
verify_all(make_mapping<Layout>(
|
||||
std::extents<Int, dyn, dyn, dyn, 0>{n, n, n}));
|
||||
|
||||
verify_all(make_mapping<Layout>(
|
||||
std::extents<Int, dyn, dyn, dyn, dyn>{n, n, n, 0}));
|
||||
verify_all(make_mapping<Layout>(
|
||||
std::extents<Int, dyn, dyn, dyn, dyn>{n, n, n, 0}));
|
||||
|
||||
verify_all(make_mapping<Layout>(
|
||||
std::extents<Int, 0, dyn, dyn, dyn>{n, n, n}));
|
||||
verify_all(make_mapping<Layout>(
|
||||
std::extents<Int, 0, dyn, dyn, dyn>{n, n, n}));
|
||||
|
||||
verify_all(make_mapping<Layout>(
|
||||
std::extents<Int, dyn, dyn, dyn, dyn>{0, n, n, n}));
|
||||
}
|
||||
verify_all(make_mapping<Layout>(
|
||||
std::extents<Int, dyn, dyn, dyn, dyn>{0, n, n, n}));
|
||||
}
|
||||
|
||||
template<typename Layout, typename Int>
|
||||
constexpr void
|
||||
test_overflow()
|
||||
{
|
||||
test_static_overflow<Layout, Int>();
|
||||
test_dynamic_overflow<Layout, Int>();
|
||||
}
|
||||
constexpr void
|
||||
test_overflow()
|
||||
{
|
||||
test_static_overflow<Layout, Int>();
|
||||
test_dynamic_overflow<Layout, Int>();
|
||||
}
|
||||
|
||||
template<typename Layout>
|
||||
constexpr bool
|
||||
test_all()
|
||||
{
|
||||
test_overflow<Layout, signed char>();
|
||||
test_overflow<Layout, short int>();
|
||||
test_overflow<Layout, int>();
|
||||
test_overflow<Layout, long int>();
|
||||
test_overflow<Layout, long long int>();
|
||||
constexpr bool
|
||||
test_all()
|
||||
{
|
||||
test_overflow<Layout, signed char>();
|
||||
test_overflow<Layout, short int>();
|
||||
test_overflow<Layout, int>();
|
||||
test_overflow<Layout, long int>();
|
||||
test_overflow<Layout, long long int>();
|
||||
|
||||
test_overflow<Layout, unsigned char>();
|
||||
test_overflow<Layout, unsigned short int>();
|
||||
test_overflow<Layout, unsigned int>();
|
||||
test_overflow<Layout, unsigned long int>();
|
||||
test_overflow<Layout, unsigned long long int>();
|
||||
test_overflow<Layout, size_t>();
|
||||
return true;
|
||||
}
|
||||
test_overflow<Layout, unsigned char>();
|
||||
test_overflow<Layout, unsigned short int>();
|
||||
test_overflow<Layout, unsigned int>();
|
||||
test_overflow<Layout, unsigned long int>();
|
||||
test_overflow<Layout, unsigned long long int>();
|
||||
test_overflow<Layout, size_t>();
|
||||
return true;
|
||||
}
|
||||
|
||||
int
|
||||
main()
|
||||
|
||||
@@ -7,6 +7,15 @@
|
||||
|
||||
constexpr size_t dyn = std::dynamic_extent;
|
||||
|
||||
template<typename Mapping>
|
||||
concept has_static_is_exhaustive = requires
|
||||
{
|
||||
{ Mapping::is_exhaustive() } -> std::same_as<bool>;
|
||||
};
|
||||
|
||||
static_assert(has_static_is_exhaustive<std::layout_right::mapping<std::extents<int>>>);
|
||||
static_assert(!has_static_is_exhaustive<std::layout_stride::mapping<std::extents<int>>>);
|
||||
|
||||
template<typename Layout, typename Extents>
|
||||
constexpr bool
|
||||
test_mapping_properties()
|
||||
@@ -32,7 +41,7 @@ template<typename Layout, typename Extents>
|
||||
|
||||
static_assert(M::is_always_unique() && M::is_unique());
|
||||
static_assert(M::is_always_strided() && M::is_strided());
|
||||
if constexpr (!std::is_same_v<Layout, std::layout_stride>)
|
||||
if constexpr (has_static_is_exhaustive<M>)
|
||||
static_assert(M::is_always_exhaustive() && M::is_exhaustive());
|
||||
return true;
|
||||
}
|
||||
@@ -306,7 +315,7 @@ template<typename Layout>
|
||||
constexpr void
|
||||
test_stride_1d()
|
||||
{
|
||||
std::layout_left::mapping<std::extents<int, 3>> m;
|
||||
typename Layout::mapping<std::extents<int, 3>> m;
|
||||
VERIFY(m.stride(0) == 1);
|
||||
}
|
||||
|
||||
@@ -321,73 +330,104 @@ template<>
|
||||
}
|
||||
|
||||
template<typename Layout>
|
||||
constexpr void
|
||||
test_stride_2d();
|
||||
struct TestStride2D;
|
||||
|
||||
template<>
|
||||
constexpr void
|
||||
test_stride_2d<std::layout_left>()
|
||||
struct TestStride2D<std::layout_left>
|
||||
{
|
||||
std::layout_left::mapping<std::extents<int, 3, 5>> m;
|
||||
VERIFY(m.stride(0) == 1);
|
||||
VERIFY(m.stride(1) == 3);
|
||||
}
|
||||
static constexpr void
|
||||
run()
|
||||
{
|
||||
std::layout_left::mapping<std::extents<int, 3, 5>> m;
|
||||
VERIFY(m.stride(0) == 1);
|
||||
VERIFY(m.stride(1) == 3);
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
constexpr void
|
||||
test_stride_2d<std::layout_right>()
|
||||
struct TestStride2D<std::layout_right>
|
||||
{
|
||||
std::layout_right::mapping<std::extents<int, 3, 5>> m;
|
||||
VERIFY(m.stride(0) == 5);
|
||||
VERIFY(m.stride(1) == 1);
|
||||
}
|
||||
static constexpr void
|
||||
run()
|
||||
{
|
||||
std::layout_right::mapping<std::extents<int, 3, 5>> m;
|
||||
VERIFY(m.stride(0) == 5);
|
||||
VERIFY(m.stride(1) == 1);
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
constexpr void
|
||||
test_stride_2d<std::layout_stride>()
|
||||
struct TestStride2D<std::layout_stride>
|
||||
{
|
||||
std::array<int, 2> strides{13, 2};
|
||||
std::layout_stride::mapping m(std::extents<int, 3, 5>{}, strides);
|
||||
VERIFY(m.stride(0) == strides[0]);
|
||||
VERIFY(m.stride(1) == strides[1]);
|
||||
VERIFY(m.strides() == strides);
|
||||
}
|
||||
static constexpr void
|
||||
run()
|
||||
{
|
||||
std::array<int, 2> strides{13, 2};
|
||||
std::layout_stride::mapping m(std::extents<int, 3, 5>{}, strides);
|
||||
VERIFY(m.stride(0) == strides[0]);
|
||||
VERIFY(m.stride(1) == strides[1]);
|
||||
VERIFY(m.strides() == strides);
|
||||
}
|
||||
};
|
||||
|
||||
template<typename Layout>
|
||||
constexpr void
|
||||
test_stride_3d();
|
||||
|
||||
template<>
|
||||
constexpr void
|
||||
test_stride_3d<std::layout_left>()
|
||||
test_stride_2d()
|
||||
{
|
||||
std::layout_left::mapping m(std::dextents<int, 3>(3, 5, 7));
|
||||
VERIFY(m.stride(0) == 1);
|
||||
VERIFY(m.stride(1) == 3);
|
||||
VERIFY(m.stride(2) == 3*5);
|
||||
TestStride2D<Layout>::run();
|
||||
}
|
||||
|
||||
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) == 5*7);
|
||||
VERIFY(m.stride(1) == 7);
|
||||
VERIFY(m.stride(2) == 1);
|
||||
}
|
||||
template<typename Layout>
|
||||
struct TestStride3D;
|
||||
|
||||
template<>
|
||||
constexpr void
|
||||
test_stride_3d<std::layout_stride>()
|
||||
struct TestStride3D<std::layout_left>
|
||||
{
|
||||
std::dextents<int, 3> exts(3, 5, 7);
|
||||
std::array<int, 3> strides{11, 2, 41};
|
||||
std::layout_stride::mapping<std::dextents<int, 3>> m(exts, strides);
|
||||
VERIFY(m.stride(0) == strides[0]);
|
||||
VERIFY(m.stride(1) == strides[1]);
|
||||
VERIFY(m.stride(2) == strides[2]);
|
||||
VERIFY(m.strides() == strides);
|
||||
static constexpr void
|
||||
run()
|
||||
{
|
||||
std::layout_left::mapping m(std::dextents<int, 3>(3, 5, 7));
|
||||
VERIFY(m.stride(0) == 1);
|
||||
VERIFY(m.stride(1) == 3);
|
||||
VERIFY(m.stride(2) == 3*5);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
template<>
|
||||
struct TestStride3D<std::layout_right>
|
||||
{
|
||||
static constexpr void
|
||||
run()
|
||||
{
|
||||
std::layout_right::mapping m(std::dextents<int, 3>(3, 5, 7));
|
||||
VERIFY(m.stride(0) == 5*7);
|
||||
VERIFY(m.stride(1) == 7);
|
||||
VERIFY(m.stride(2) == 1);
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
struct TestStride3D<std::layout_stride>
|
||||
{
|
||||
static constexpr void
|
||||
run()
|
||||
{
|
||||
std::dextents<int, 3> exts(3, 5, 7);
|
||||
std::array<int, 3> strides{11, 2, 41};
|
||||
std::layout_stride::mapping<std::dextents<int, 3>> m(exts, strides);
|
||||
VERIFY(m.stride(0) == strides[0]);
|
||||
VERIFY(m.stride(1) == strides[1]);
|
||||
VERIFY(m.stride(2) == strides[2]);
|
||||
VERIFY(m.strides() == strides);
|
||||
}
|
||||
};
|
||||
|
||||
template<typename Layout>
|
||||
constexpr void
|
||||
test_stride_3d()
|
||||
{
|
||||
TestStride3D<Layout>::run();
|
||||
}
|
||||
|
||||
template<typename Layout>
|
||||
|
||||
Reference in New Issue
Block a user