From 12b864491fe9750e9fbe09e354374bb441941761 Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Thu, 2 Jan 2025 19:08:40 +0100 Subject: Optimize buffer move with compatible allocators --- asl/tests/buffer_tests.cpp | 93 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) (limited to 'asl/tests') diff --git a/asl/tests/buffer_tests.cpp b/asl/tests/buffer_tests.cpp index cc34420..1a08554 100644 --- a/asl/tests/buffer_tests.cpp +++ b/asl/tests/buffer_tests.cpp @@ -51,6 +51,27 @@ struct CounterAllocator }; static_assert(asl::allocator); +struct IncompatibleAllocator +{ + static void* alloc(const asl::layout& layout) + { + return asl::GlobalHeap::alloc(layout); + } + + static void* realloc(void* ptr, const asl::layout& old, const asl::layout& new_layout) + { + return asl::GlobalHeap::realloc(ptr, old, new_layout); + } + + static void dealloc(void* ptr, const asl::layout& layout) + { + asl::GlobalHeap::dealloc(ptr, layout); + } + + constexpr bool operator==(const IncompatibleAllocator&) const { return false; } +}; +static_assert(asl::allocator); + ASL_TEST(reserve_capacity) { isize_t count = 0; @@ -376,3 +397,75 @@ ASL_TEST(move_assign_trivial_inline_to_heap) ASL_TEST_EXPECT(buf2[0] == 1); ASL_TEST_EXPECT(buf2[1] == 2); } + +ASL_TEST(move_assign_inline_to_heap) +{ + bool d[6]{}; + + { + asl::buffer buf; + asl::buffer buf2; + + buf.push(&d[0]); + buf.push(&d[1]); + + buf2.push(&d[2]); + buf2.push(&d[3]); + buf2.push(&d[4]); + buf2.push(&d[5]); + + buf2 = ASL_MOVE(buf); + + ASL_TEST_EXPECT(buf.size() == 0); + ASL_TEST_EXPECT(buf2.size() == 2); + ASL_TEST_EXPECT(d[0] == false); + ASL_TEST_EXPECT(d[1] == false); + ASL_TEST_EXPECT(d[2] == false); // moved but not destroyed + ASL_TEST_EXPECT(d[3] == false); // moved but not destroyed + ASL_TEST_EXPECT(d[4] == true); + ASL_TEST_EXPECT(d[5] == true); + } + + ASL_TEST_EXPECT(d[0] == true); + ASL_TEST_EXPECT(d[1] == true); + ASL_TEST_EXPECT(d[2] == false); // moved but not destroyed + ASL_TEST_EXPECT(d[3] == false); // moved but not destroyed + ASL_TEST_EXPECT(d[4] == true); + ASL_TEST_EXPECT(d[5] == true); +} + +ASL_TEST(move_assign_from_inline_incompatible_allocator) +{ + bool d[6]{}; + + { + asl::buffer buf; + asl::buffer buf2; + + buf.push(&d[0]); + buf.push(&d[1]); + + buf2.push(&d[2]); + buf2.push(&d[3]); + buf2.push(&d[4]); + buf2.push(&d[5]); + + buf2 = ASL_MOVE(buf); + + ASL_TEST_EXPECT(buf.size() == 0); + ASL_TEST_EXPECT(buf2.size() == 2); + ASL_TEST_EXPECT(d[0] == false); + ASL_TEST_EXPECT(d[1] == false); + ASL_TEST_EXPECT(d[2] == true); + ASL_TEST_EXPECT(d[3] == true); + ASL_TEST_EXPECT(d[4] == true); + ASL_TEST_EXPECT(d[5] == true); + } + + ASL_TEST_EXPECT(d[0] == true); + ASL_TEST_EXPECT(d[1] == true); + ASL_TEST_EXPECT(d[2] == true); + ASL_TEST_EXPECT(d[3] == true); + ASL_TEST_EXPECT(d[4] == true); + ASL_TEST_EXPECT(d[5] == true); +} -- cgit