From d729d8dc9966fe4af04cf1661649e57888bb41b2 Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Mon, 4 Nov 2024 22:23:34 +0100 Subject: Add span::first/last --- asl/tests/span_tests.cpp | 280 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 244 insertions(+), 36 deletions(-) (limited to 'asl/tests') diff --git a/asl/tests/span_tests.cpp b/asl/tests/span_tests.cpp index 3ede397..aca0fb3 100644 --- a/asl/tests/span_tests.cpp +++ b/asl/tests/span_tests.cpp @@ -144,24 +144,24 @@ ASL_TEST(subspan_static_from_static) asl::span span{array}; auto s1 = span.subspan<0>(); - ASL_TEST_EXPECT(s1.size() == 4); - ASL_TEST_ASSERT(s1[0] == 1); - ASL_TEST_ASSERT(s1[1] == 2); - ASL_TEST_ASSERT(s1[2] == 3); - ASL_TEST_ASSERT(s1[3] == 4); + ASL_TEST_ASSERT(s1.size() == 4); + ASL_TEST_EXPECT(s1[0] == 1); + ASL_TEST_EXPECT(s1[1] == 2); + ASL_TEST_EXPECT(s1[2] == 3); + ASL_TEST_EXPECT(s1[3] == 4); auto s2 = span.subspan<2>(); - ASL_TEST_EXPECT(s2.size() == 2); - ASL_TEST_ASSERT(s2[0] == 3); - ASL_TEST_ASSERT(s2[1] == 4); + ASL_TEST_ASSERT(s2.size() == 2); + ASL_TEST_EXPECT(s2[0] == 3); + ASL_TEST_EXPECT(s2[1] == 4); auto s3 = span.subspan<4>(); - ASL_TEST_EXPECT(s3.size() == 0); + ASL_TEST_ASSERT(s3.size() == 0); auto s4 = span.subspan<1, 2>(); - ASL_TEST_EXPECT(s4.size() == 2); - ASL_TEST_ASSERT(s4[0] == 2); - ASL_TEST_ASSERT(s4[1] == 3); + ASL_TEST_ASSERT(s4.size() == 2); + ASL_TEST_EXPECT(s4[0] == 2); + ASL_TEST_EXPECT(s4[1] == 3); } ASL_TEST(subspan_static_from_dynamic) @@ -170,24 +170,24 @@ ASL_TEST(subspan_static_from_dynamic) asl::span span{array}; auto s1 = span.subspan<0>(); - ASL_TEST_EXPECT(s1.size() == 4); - ASL_TEST_ASSERT(s1[0] == 1); - ASL_TEST_ASSERT(s1[1] == 2); - ASL_TEST_ASSERT(s1[2] == 3); - ASL_TEST_ASSERT(s1[3] == 4); + ASL_TEST_ASSERT(s1.size() == 4); + ASL_TEST_EXPECT(s1[0] == 1); + ASL_TEST_EXPECT(s1[1] == 2); + ASL_TEST_EXPECT(s1[2] == 3); + ASL_TEST_EXPECT(s1[3] == 4); auto s2 = span.subspan<2>(); - ASL_TEST_EXPECT(s2.size() == 2); - ASL_TEST_ASSERT(s2[0] == 3); - ASL_TEST_ASSERT(s2[1] == 4); + ASL_TEST_ASSERT(s2.size() == 2); + ASL_TEST_EXPECT(s2[0] == 3); + ASL_TEST_EXPECT(s2[1] == 4); auto s3 = span.subspan<4>(); - ASL_TEST_EXPECT(s3.size() == 0); + ASL_TEST_ASSERT(s3.size() == 0); auto s4 = span.subspan<1, 2>(); - ASL_TEST_EXPECT(s4.size() == 2); - ASL_TEST_ASSERT(s4[0] == 2); - ASL_TEST_ASSERT(s4[1] == 3); + ASL_TEST_ASSERT(s4.size() == 2); + ASL_TEST_EXPECT(s4[0] == 2); + ASL_TEST_EXPECT(s4[1] == 3); } ASL_TEST(subspan_dynamic) @@ -196,22 +196,230 @@ ASL_TEST(subspan_dynamic) asl::span span{array}; auto s1 = span.subspan(0); - ASL_TEST_EXPECT(s1.size() == 4); - ASL_TEST_ASSERT(s1[0] == 1); - ASL_TEST_ASSERT(s1[1] == 2); - ASL_TEST_ASSERT(s1[2] == 3); - ASL_TEST_ASSERT(s1[3] == 4); + ASL_TEST_ASSERT(s1.size() == 4); + ASL_TEST_EXPECT(s1[0] == 1); + ASL_TEST_EXPECT(s1[1] == 2); + ASL_TEST_EXPECT(s1[2] == 3); + ASL_TEST_EXPECT(s1[3] == 4); auto s2 = span.subspan(2); - ASL_TEST_EXPECT(s2.size() == 2); - ASL_TEST_ASSERT(s2[0] == 3); - ASL_TEST_ASSERT(s2[1] == 4); + ASL_TEST_ASSERT(s2.size() == 2); + ASL_TEST_EXPECT(s2[0] == 3); + ASL_TEST_EXPECT(s2[1] == 4); auto s3 = span.subspan(4); - ASL_TEST_EXPECT(s3.size() == 0); + ASL_TEST_ASSERT(s3.size() == 0); auto s4 = span.subspan(1, 2); - ASL_TEST_EXPECT(s4.size() == 2); - ASL_TEST_ASSERT(s4[0] == 2); - ASL_TEST_ASSERT(s4[1] == 3); + ASL_TEST_ASSERT(s4.size() == 2); + ASL_TEST_EXPECT(s4[0] == 2); + ASL_TEST_EXPECT(s4[1] == 3); +} + +template +[[maybe_unused]] static auto try_static_first(int) + -> decltype(asl::declval().template first()); + +template +[[maybe_unused]] static auto try_static_first(...) -> asl::empty; + +template +concept invalid_first = asl::same_as(0)), asl::empty>; + +static_assert(asl::same_as, + decltype(asl::declval>().first<0>())>); + +static_assert(asl::same_as, + decltype(asl::declval>().first<1>())>); + +static_assert(asl::same_as, + decltype(asl::declval>().first<2>())>); + +static_assert(asl::same_as, + decltype(asl::declval>().first<3>())>); + +static_assert(asl::same_as, + decltype(asl::declval>().first<0>())>); + +static_assert(asl::same_as, + decltype(asl::declval>().first<1>())>); + +static_assert(asl::same_as, + decltype(asl::declval>().first<2>())>); + +static_assert(asl::same_as, + decltype(asl::declval>().first<3>())>); + +static_assert(asl::same_as, + decltype(asl::declval>().first<4>())>); + +static_assert(invalid_first, 5>); + +static_assert(invalid_first, asl::dynamic_size>); + +ASL_TEST(first_static_from_static) +{ + int array[] = {1, 2, 3, 4}; + asl::span span{array}; + + auto s1 = span.first<0>(); + ASL_TEST_ASSERT(s1.size() == 0); + + auto s2 = span.first<2>(); + ASL_TEST_ASSERT(s2.size() == 2); + ASL_TEST_EXPECT(s2[0] == 1); + ASL_TEST_EXPECT(s2[1] == 2); + + auto s3 = span.first<4>(); + ASL_TEST_ASSERT(s3.size() == 4); + ASL_TEST_EXPECT(s3[0] == 1); + ASL_TEST_EXPECT(s3[1] == 2); + ASL_TEST_EXPECT(s3[2] == 3); + ASL_TEST_EXPECT(s3[3] == 4); +} + +ASL_TEST(first_static_from_dynamic) +{ + int array[] = {1, 2, 3, 4}; + asl::span span{array}; + + auto s1 = span.first<0>(); + ASL_TEST_ASSERT(s1.size() == 0); + + auto s2 = span.first<2>(); + ASL_TEST_ASSERT(s2.size() == 2); + ASL_TEST_EXPECT(s2[0] == 1); + ASL_TEST_EXPECT(s2[1] == 2); + + auto s3 = span.first<4>(); + ASL_TEST_ASSERT(s3.size() == 4); + ASL_TEST_EXPECT(s3[0] == 1); + ASL_TEST_EXPECT(s3[1] == 2); + ASL_TEST_EXPECT(s3[2] == 3); + ASL_TEST_EXPECT(s3[3] == 4); +} + +ASL_TEST(first_dynamic) +{ + int array[] = {1, 2, 3, 4}; + asl::span span{array}; + + auto s1 = span.first(0); + ASL_TEST_ASSERT(s1.size() == 0); + + auto s2 = span.first(2); + ASL_TEST_ASSERT(s2.size() == 2); + ASL_TEST_EXPECT(s2[0] == 1); + ASL_TEST_EXPECT(s2[1] == 2); + + auto s3 = span.first(4); + ASL_TEST_ASSERT(s3.size() == 4); + ASL_TEST_EXPECT(s3[0] == 1); + ASL_TEST_EXPECT(s3[1] == 2); + ASL_TEST_EXPECT(s3[2] == 3); + ASL_TEST_EXPECT(s3[3] == 4); +} + +template +[[maybe_unused]] static auto try_static_last(int) + -> decltype(asl::declval().template last()); + +template +[[maybe_unused]] static auto try_static_last(...) -> asl::empty; + +template +concept invalid_last = asl::same_as(0)), asl::empty>; + +static_assert(asl::same_as, + decltype(asl::declval>().last<0>())>); + +static_assert(asl::same_as, + decltype(asl::declval>().last<1>())>); + +static_assert(asl::same_as, + decltype(asl::declval>().last<2>())>); + +static_assert(asl::same_as, + decltype(asl::declval>().last<3>())>); + +static_assert(asl::same_as, + decltype(asl::declval>().last<0>())>); + +static_assert(asl::same_as, + decltype(asl::declval>().last<1>())>); + +static_assert(asl::same_as, + decltype(asl::declval>().last<2>())>); + +static_assert(asl::same_as, + decltype(asl::declval>().last<3>())>); + +static_assert(asl::same_as, + decltype(asl::declval>().last<4>())>); + +static_assert(invalid_last, 5>); + +static_assert(invalid_last, asl::dynamic_size>); + +ASL_TEST(last_static_from_static) +{ + int array[] = {1, 2, 3, 4}; + asl::span span{array}; + + auto s1 = span.last<0>(); + ASL_TEST_ASSERT(s1.size() == 0); + + auto s2 = span.last<2>(); + ASL_TEST_ASSERT(s2.size() == 2); + ASL_TEST_EXPECT(s2[0] == 3); + ASL_TEST_EXPECT(s2[1] == 4); + + auto s3 = span.last<4>(); + ASL_TEST_ASSERT(s3.size() == 4); + ASL_TEST_EXPECT(s3[0] == 1); + ASL_TEST_EXPECT(s3[1] == 2); + ASL_TEST_EXPECT(s3[2] == 3); + ASL_TEST_EXPECT(s3[3] == 4); +} + +ASL_TEST(last_static_from_dynamic) +{ + int array[] = {1, 2, 3, 4}; + asl::span span{array}; + + auto s1 = span.last<0>(); + ASL_TEST_ASSERT(s1.size() == 0); + + auto s2 = span.last<2>(); + ASL_TEST_ASSERT(s2.size() == 2); + ASL_TEST_EXPECT(s2[0] == 3); + ASL_TEST_EXPECT(s2[1] == 4); + + auto s3 = span.last<4>(); + ASL_TEST_ASSERT(s3.size() == 4); + ASL_TEST_EXPECT(s3[0] == 1); + ASL_TEST_EXPECT(s3[1] == 2); + ASL_TEST_EXPECT(s3[2] == 3); + ASL_TEST_EXPECT(s3[3] == 4); +} + +ASL_TEST(last_dynamic) +{ + int array[] = {1, 2, 3, 4}; + asl::span span{array}; + + auto s1 = span.last(0); + ASL_TEST_ASSERT(s1.size() == 0); + + auto s2 = span.last(2); + ASL_TEST_ASSERT(s2.size() == 2); + ASL_TEST_EXPECT(s2[0] == 3); + ASL_TEST_EXPECT(s2[1] == 4); + + auto s3 = span.last(4); + ASL_TEST_ASSERT(s3.size() == 4); + ASL_TEST_EXPECT(s3[0] == 1); + ASL_TEST_EXPECT(s3[1] == 2); + ASL_TEST_EXPECT(s3[2] == 3); + ASL_TEST_EXPECT(s3[3] == 4); } -- cgit