diff options
| author | Felix Morgner <felix.morgner@ost.ch> | 2026-10-01 22:14:48 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2026-10-01 22:14:48 +0200 |
| commit | bf7cfad29d6af61a3171136566990cb288e3f695 (patch) | |
| tree | 4a93b9556d05f16323ad3676c92d5616c88f8423 | |
| parent | 1b22cd5cced7ccdd829472b087f04c421cac2ff8 (diff) | |
| download | kernel-bf7cfad29d6af61a3171136566990cb288e3f695.tar.xz kernel-bf7cfad29d6af61a3171136566990cb288e3f695.zip | |
kstd: ring_buffer: implement copy ctor
| -rw-r--r-- | libs/kstd/kstd/ring_buffer.hpp | 9 | ||||
| -rw-r--r-- | libs/kstd/kstd/ring_buffer.tests.cpp | 27 |
2 files changed, 36 insertions, 0 deletions
diff --git a/libs/kstd/kstd/ring_buffer.hpp b/libs/kstd/kstd/ring_buffer.hpp index aa0b3a5c..2b97e0a9 100644 --- a/libs/kstd/kstd/ring_buffer.hpp +++ b/libs/kstd/kstd/ring_buffer.hpp @@ -175,6 +175,15 @@ namespace kstd //! Construct an empty ring buffer. constexpr ring_buffer() noexcept = default; + //! Construct a ring buffer by copying from an existing one. + constexpr ring_buffer(ring_buffer const & other) + : m_size{other.m_size} + , m_read_index{} + { + std::ranges::for_each(std::views::iota(0uz, other.size()), + [&](auto const i) { m_storage.construct(i, other[i]); }); + } + //! Destroy this ring buffer. constexpr ~ring_buffer() noexcept { diff --git a/libs/kstd/kstd/ring_buffer.tests.cpp b/libs/kstd/kstd/ring_buffer.tests.cpp index 2a2d23b0..4e34249b 100644 --- a/libs/kstd/kstd/ring_buffer.tests.cpp +++ b/libs/kstd/kstd/ring_buffer.tests.cpp @@ -6,9 +6,12 @@ #include <catch2/matchers/catch_matchers.hpp> #include <catch2/matchers/catch_matchers_exception.hpp> +#include <algorithm> #include <cstddef> +#include <functional> #include <iterator> #include <memory> +#include <string> #include <type_traits> #include <utility> @@ -303,6 +306,30 @@ SCENARIO("Ring Buffer initialization and construction", "[kstd][ring_buffer]") REQUIRE(buffer.size() == buffer.capacity()); } } + + GIVEN("A buffer with a capacity of 5 containing 3 elements") + { + auto buffer = kstd::ring_buffer<std::string, 5>{3, "test"}; + + WHEN("constructing a copy") + { + auto copy = buffer; + + THEN("the contents of both are identical") + { + REQUIRE(std::ranges::equal(buffer, copy)); + } + + THEN("their element addresses differ") + { + auto address_of = [](auto const & obj) { + return std::addressof(obj); + }; + + REQUIRE_FALSE(std::ranges::equal(buffer, copy, std::equal_to{}, address_of, address_of)); + } + } + } } SCENARIO("Ring Buffer destruction", "[kstd][ring_buffer]") |
