From 5642cba31b5f7610eddf552b1acd984cf718340d Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Fri, 27 Dec 2024 19:19:40 +0100 Subject: Rework some metaprogramming stuff --- asl/tests/buffer_tests.cpp | 88 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 75 insertions(+), 13 deletions(-) (limited to 'asl/tests/buffer_tests.cpp') diff --git a/asl/tests/buffer_tests.cpp b/asl/tests/buffer_tests.cpp index 5376dc1..b677402 100644 --- a/asl/tests/buffer_tests.cpp +++ b/asl/tests/buffer_tests.cpp @@ -1,4 +1,5 @@ #include "asl/buffer.hpp" +#include "asl/print.hpp" #include "asl/testing/testing.hpp" @@ -77,7 +78,6 @@ ASL_TEST(reserve_capacity) ASL_TEST_EXPECT(count == 2); } -// NOLINTBEGIN(*-pointer-arithmetic) ASL_TEST(push) { asl::buffer b; @@ -85,28 +85,90 @@ ASL_TEST(push) b.push(1); ASL_TEST_EXPECT(b.size() == 1); - ASL_TEST_EXPECT(b.data()[0] == 1); + ASL_TEST_EXPECT(b[0] == 1); b.push(2); b.push(3); ASL_TEST_EXPECT(b.size() == 3); - ASL_TEST_EXPECT(b.data()[0] == 1); - ASL_TEST_EXPECT(b.data()[1] == 2); - ASL_TEST_EXPECT(b.data()[2] == 3); + ASL_TEST_EXPECT(b[0] == 1); + ASL_TEST_EXPECT(b[1] == 2); + ASL_TEST_EXPECT(b[2] == 3); b.push(4); b.push(5); b.push(6); b.push(7); ASL_TEST_EXPECT(b.size() == 7); - ASL_TEST_EXPECT(b.data()[0] == 1); - ASL_TEST_EXPECT(b.data()[1] == 2); - ASL_TEST_EXPECT(b.data()[2] == 3); - ASL_TEST_EXPECT(b.data()[3] == 4); - ASL_TEST_EXPECT(b.data()[4] == 5); - ASL_TEST_EXPECT(b.data()[5] == 6); - ASL_TEST_EXPECT(b.data()[6] == 7); + ASL_TEST_EXPECT(b[0] == 1); + ASL_TEST_EXPECT(b[1] == 2); + ASL_TEST_EXPECT(b[2] == 3); + ASL_TEST_EXPECT(b[3] == 4); + ASL_TEST_EXPECT(b[4] == 5); + ASL_TEST_EXPECT(b[5] == 6); + ASL_TEST_EXPECT(b[6] == 7); +} + +struct MoveableType +{ + int moved{}; + int value; + + explicit MoveableType(int x) : value{x} {} + MoveableType(const MoveableType&) = delete; + MoveableType(MoveableType&& other) : moved{other.moved + 1}, value{other.value} {} + MoveableType& operator=(const MoveableType&) = delete; + MoveableType& operator=(MoveableType&&) = delete; +}; +static_assert(!asl::trivially_copy_constructible); +static_assert(!asl::trivially_move_constructible); +static_assert(!asl::copyable); +static_assert(asl::move_constructible); + +ASL_TEST(push_move) +{ + asl::buffer b; + + static_assert(asl::buffer::kInlineCapacity > 0); + + b.push(0); + ASL_TEST_EXPECT(b[0].value == 0); + ASL_TEST_EXPECT(b[0].moved == 0); + + b.push(1); + ASL_TEST_EXPECT(b[0].value == 0); + ASL_TEST_EXPECT(b[0].moved == 0); + ASL_TEST_EXPECT(b[1].value == 1); + ASL_TEST_EXPECT(b[1].moved == 0); + + b.push(2); + ASL_TEST_EXPECT(b[0].value == 0); + ASL_TEST_EXPECT(b[0].moved == 1); + ASL_TEST_EXPECT(b[1].value == 1); + ASL_TEST_EXPECT(b[1].moved == 1); + ASL_TEST_EXPECT(b[2].value == 2); + ASL_TEST_EXPECT(b[2].moved == 0); + + b.push(3); + ASL_TEST_EXPECT(b[0].value == 0); + ASL_TEST_EXPECT(b[0].moved == 1); + ASL_TEST_EXPECT(b[1].value == 1); + ASL_TEST_EXPECT(b[1].moved == 1); + ASL_TEST_EXPECT(b[2].value == 2); + ASL_TEST_EXPECT(b[2].moved == 0); + ASL_TEST_EXPECT(b[3].value == 3); + ASL_TEST_EXPECT(b[3].moved == 0); + + b.push(4); + ASL_TEST_EXPECT(b[0].value == 0); + ASL_TEST_EXPECT(b[0].moved == 2); + ASL_TEST_EXPECT(b[1].value == 1); + ASL_TEST_EXPECT(b[1].moved == 2); + ASL_TEST_EXPECT(b[2].value == 2); + ASL_TEST_EXPECT(b[2].moved == 1); + ASL_TEST_EXPECT(b[3].value == 3); + ASL_TEST_EXPECT(b[3].moved == 1); + ASL_TEST_EXPECT(b[4].value == 4); + ASL_TEST_EXPECT(b[4].moved == 0); } -// NOLINTEND(*-pointer-arithmetic) // @Todo Test push with non trivial move (non copy) types -- cgit