diff options
| author | Felix Morgner <felix.morgner@ost.ch> | 2026-10-01 15:01:08 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2026-10-01 15:01:08 +0200 |
| commit | ec7b93a75335372e75ea9d49cd943fa6aae4b33c (patch) | |
| tree | 2ec22ae1384691edd045a6218a4590863248633c | |
| parent | a23125b5c15685e962ee4d2f63ca108ead2aa2eb (diff) | |
| download | kernel-ec7b93a75335372e75ea9d49cd943fa6aae4b33c.tar.xz kernel-ec7b93a75335372e75ea9d49cd943fa6aae4b33c.zip | |
kstd: ring_buffer: add n-value-initialized ctor
| -rw-r--r-- | libs/kstd/kstd/ring_buffer.hpp | 17 | ||||
| -rw-r--r-- | libs/kstd/kstd/ring_buffer.tests.cpp | 35 |
2 files changed, 52 insertions, 0 deletions
diff --git a/libs/kstd/kstd/ring_buffer.hpp b/libs/kstd/kstd/ring_buffer.hpp index 44510e3e..3e85baae 100644 --- a/libs/kstd/kstd/ring_buffer.hpp +++ b/libs/kstd/kstd/ring_buffer.hpp @@ -31,7 +31,24 @@ namespace kstd //! Construct an empty ring buffer. constexpr ring_buffer() noexcept = default; + //! Construct a ring buffer with a given number of value initialized elements. + //! + //! @param count The number of value initialized elements to construct. + constexpr ring_buffer(size_type count) + { + if (count > capacity()) + { + os::panic("[KSTD] Tried to construct a ring buffer with more elements than it can support."); + } + + std::ranges::for_each(std::views::iota(0uz, count), [&](auto i) { m_storage.construct(i); }); + m_write_index = count % capacity(); + } + //! Construct a ring buffer with a given number of copies of a given value. + //! + //! @param count The number of copies to construct. + //! @param value The value to copy. constexpr ring_buffer(size_type count, ValueType const & value) { if (count > capacity()) diff --git a/libs/kstd/kstd/ring_buffer.tests.cpp b/libs/kstd/kstd/ring_buffer.tests.cpp index 2157b6c3..43ddafae 100644 --- a/libs/kstd/kstd/ring_buffer.tests.cpp +++ b/libs/kstd/kstd/ring_buffer.tests.cpp @@ -152,6 +152,41 @@ SCENARIO("Ring Buffer initialization and construction", "[kstd][ring_buffer]") } } } + + WHEN("constructing by n-value-initialized constructor using a capacity of 5") + { + auto buffer = kstd::ring_buffer<int, 5>{3}; + + THEN("the capacity is 5") + { + REQUIRE(buffer.capacity() == 5); + } + + THEN("the buffer is not empty") + { + REQUIRE_FALSE(buffer.empty()); + } + + THEN("the size is equal to the number of copies") + { + REQUIRE(buffer.size() == 3); + } + + THEN("the maximum size is equal to the capacity") + { + REQUIRE(buffer.max_size() == buffer.capacity()); + } + } + + WHEN("constructing by n-value-initialized constructor using a capacity of 5 and 6 copies") + { + THEN("the constructor panics") + { + REQUIRE_THROWS_MATCHES( + (kstd::ring_buffer<int, 5>{6}), kstd::tests::os_panic, + Catch::Matchers::Message("[KSTD] Tried to construct a ring buffer with more elements than it can support.")); + } + } } SCENARIO("Ring Buffer element access", "[kstd][ring_buffer]") |
