From 8b1110c61c9090e9535d106c9cdcee6e46db1dc8 Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Mon, 4 Nov 2024 22:09:50 +0100 Subject: Add span::subspan --- asl/tests/span_tests.cpp | 126 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) (limited to 'asl/tests') diff --git a/asl/tests/span_tests.cpp b/asl/tests/span_tests.cpp index 11510c6..3ede397 100644 --- a/asl/tests/span_tests.cpp +++ b/asl/tests/span_tests.cpp @@ -38,6 +38,10 @@ ASL_TEST(from_array_dynamic) ASL_TEST_EXPECT(span[2] == 3); } +static_assert(asl::default_constructible>); +static_assert(asl::default_constructible>); +static_assert(!asl::default_constructible>); + static_assert(asl::constructible_from, int32_t(&)[8]>); static_assert(!asl::constructible_from, const int32_t(&)[8]>); static_assert(asl::constructible_from, int32_t(&)[8]>); @@ -89,3 +93,125 @@ ASL_TEST(conversion) ASL_TEST_EXPECT(span4[1] == 2); ASL_TEST_EXPECT(span4[2] == 3); } + +template +[[maybe_unused]] static auto try_static_subspan(int) + -> decltype(asl::declval().template subspan()); + +template +[[maybe_unused]] static auto try_static_subspan(...) -> asl::empty; + +template +concept invalid_subspan = asl::same_as(0)), asl::empty>; + +static_assert(asl::same_as, + decltype(asl::declval>().subspan<0>())>); + +static_assert(asl::same_as, + decltype(asl::declval>().subspan<1>())>); + +static_assert(asl::same_as, + decltype(asl::declval>().subspan<2>())>); + +static_assert(asl::same_as, + decltype(asl::declval>().subspan<3>())>); + +static_assert(asl::same_as, + decltype(asl::declval>().subspan<4>())>); + +static_assert(invalid_subspan, 5>); + +static_assert(asl::same_as, + decltype(asl::declval>().subspan<0>())>); + +static_assert(asl::same_as, + decltype(asl::declval>().subspan<0, 4>())>); + +static_assert(asl::same_as, + decltype(asl::declval>().subspan<0, 4>())>); + +static_assert(asl::same_as, + decltype(asl::declval>().subspan<1, 2>())>); + +static_assert(asl::same_as, + decltype(asl::declval>().subspan<2, 2>())>); + +static_assert(invalid_subspan, 2, 3>); + +ASL_TEST(subspan_static_from_static) +{ + int array[] = {1, 2, 3, 4}; + 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); + + auto s2 = span.subspan<2>(); + ASL_TEST_EXPECT(s2.size() == 2); + ASL_TEST_ASSERT(s2[0] == 3); + ASL_TEST_ASSERT(s2[1] == 4); + + auto s3 = span.subspan<4>(); + ASL_TEST_EXPECT(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(subspan_static_from_dynamic) +{ + int array[] = {1, 2, 3, 4}; + 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); + + auto s2 = span.subspan<2>(); + ASL_TEST_EXPECT(s2.size() == 2); + ASL_TEST_ASSERT(s2[0] == 3); + ASL_TEST_ASSERT(s2[1] == 4); + + auto s3 = span.subspan<4>(); + ASL_TEST_EXPECT(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(subspan_dynamic) +{ + int array[] = {1, 2, 3, 4}; + 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); + + auto s2 = span.subspan(2); + ASL_TEST_EXPECT(s2.size() == 2); + ASL_TEST_ASSERT(s2[0] == 3); + ASL_TEST_ASSERT(s2[1] == 4); + + auto s3 = span.subspan(4); + ASL_TEST_EXPECT(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); +} -- cgit