From 3bf981d5130ba745df5b279af211caf5cc68d8a1 Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Sat, 18 Jan 2025 23:42:56 +0100 Subject: Add buffer resize --- asl/buffer.hpp | 30 ++++++++++++++++++++++++++++++ asl/tests/buffer_tests.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) diff --git a/asl/buffer.hpp b/asl/buffer.hpp index 9fd8162..aea1cb6 100644 --- a/asl/buffer.hpp +++ b/asl/buffer.hpp @@ -190,6 +190,25 @@ private: } } + template + void resize_inner(isize_t new_size, Args&&... args) + requires constructible_from + { + ASL_ASSERT(new_size >= 0); + + isize_t old_size = size(); + resize_uninit(new_size); + + T* data_ptr = data(); + T* end = data_ptr + new_size; + + // NOLINTNEXTLINE(*-pointer-arithmetic) + for (T* it = data_ptr + old_size; it < end; ++it) + { + construct_at(it, ASL_FWD(args)...); + } + } + public: constexpr buffer() requires default_constructible = default; @@ -324,6 +343,17 @@ public: store_size_encoded(encode_size_heap(current_size)); } + void resize(isize_t new_size) + requires default_constructible + { + resize_inner(new_size); + } + + void resize(isize_t new_size, const T& value) + { + resize_inner(new_size, value); + } + constexpr T& push(auto&&... args) requires constructible_from { diff --git a/asl/tests/buffer_tests.cpp b/asl/tests/buffer_tests.cpp index 4c18461..20acad5 100644 --- a/asl/tests/buffer_tests.cpp +++ b/asl/tests/buffer_tests.cpp @@ -542,3 +542,44 @@ ASL_TEST(copy_assign_into_larger) ASL_TEST_EXPECT(buf[0] == 4); ASL_TEST_EXPECT(buf2[0] == 4); } + +ASL_TEST(resize_default) +{ + asl::buffer buf; + + buf.push(5); + buf.resize(4); + + ASL_TEST_ASSERT(buf.size() == 4); + ASL_TEST_EXPECT(buf[0] == 5); + ASL_TEST_EXPECT(buf[1] == 0); + ASL_TEST_EXPECT(buf[2] == 0); + ASL_TEST_EXPECT(buf[3] == 0); + + buf.resize(2); + + ASL_TEST_ASSERT(buf.size() == 2); + ASL_TEST_EXPECT(buf[0] == 5); + ASL_TEST_EXPECT(buf[1] == 0); +} + +ASL_TEST(resize) +{ + asl::buffer buf; + + buf.push(5); + buf.resize(4, 6); + + ASL_TEST_ASSERT(buf.size() == 4); + ASL_TEST_EXPECT(buf[0] == 5); + ASL_TEST_EXPECT(buf[1] == 6); + ASL_TEST_EXPECT(buf[2] == 6); + ASL_TEST_EXPECT(buf[3] == 6); + + buf.resize(2, 7); + + ASL_TEST_ASSERT(buf.size() == 2); + ASL_TEST_EXPECT(buf[0] == 5); + ASL_TEST_EXPECT(buf[1] == 6); +} + -- cgit