From 3bf981d5130ba745df5b279af211caf5cc68d8a1 Mon Sep 17 00:00:00 2001
From: Steven Le Rouzic <steven.lerouzic@gmail.com>
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(+)

(limited to 'asl')

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<typename... Args>
+    void resize_inner(isize_t new_size, Args&&... args)
+        requires constructible_from<T, Args&&...>
+    {
+        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<T>(it, ASL_FWD(args)...);
+        }
+    }
+
 public:
     constexpr buffer() requires default_constructible<Allocator> = default;
     
@@ -324,6 +343,17 @@ public:
         store_size_encoded(encode_size_heap(current_size));
     }
 
+    void resize(isize_t new_size)
+        requires default_constructible<T>
+    {
+        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<T, decltype(args)&&...>
     {
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<int> 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<int> 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