diff options
| author | Felix Morgner <felix.morgner@ost.ch> | 2026-10-02 13:34:49 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2026-10-02 13:34:49 +0200 |
| commit | fb9b0f01f023973a9544ab758dfaf13ddc0a9de1 (patch) | |
| tree | 5dc4ecf99c5f99112bc1a3124747631a8435ccad | |
| parent | 058136e4e99b99dfa932941fc632b776ff1b590b (diff) | |
| download | kernel-fb9b0f01f023973a9544ab758dfaf13ddc0a9de1.tar.xz kernel-fb9b0f01f023973a9544ab758dfaf13ddc0a9de1.zip | |
kstd: ring_buffer: implement pop_front()
| -rw-r--r-- | libs/kstd/kstd/ring_buffer.hpp | 15 | ||||
| -rw-r--r-- | libs/kstd/kstd/ring_buffer.tests.cpp | 38 |
2 files changed, 53 insertions, 0 deletions
diff --git a/libs/kstd/kstd/ring_buffer.hpp b/libs/kstd/kstd/ring_buffer.hpp index af70e991..5039c7b4 100644 --- a/libs/kstd/kstd/ring_buffer.hpp +++ b/libs/kstd/kstd/ring_buffer.hpp @@ -534,6 +534,21 @@ namespace kstd return true; } + //! Remove the first element in the buffer. + //! + //! @warning This function will panic if the buffer is empty. + constexpr auto pop_front() -> void + { + if (empty()) + { + os::panic("[KSTD] Tried to pop an element from an empty ring_buffer!"); + } + + std::destroy_at(element_at(0)); + m_read_index = (m_read_index + 1) % capacity(); + --m_size; + } + //! @} private: diff --git a/libs/kstd/kstd/ring_buffer.tests.cpp b/libs/kstd/kstd/ring_buffer.tests.cpp index 0b332494..479283ed 100644 --- a/libs/kstd/kstd/ring_buffer.tests.cpp +++ b/libs/kstd/kstd/ring_buffer.tests.cpp @@ -1105,6 +1105,12 @@ SCENARIO("Ring Buffer modifiers", "[kstd][ring_buffer]") { REQUIRE(buffer.try_push_back(1)); } + + THEN("popping an element panics") + { + REQUIRE_THROWS_MATCHES(buffer.pop_front(), kstd::tests::os_panic, + Catch::Matchers::Message("[KSTD] Tried to pop an element from an empty ring_buffer!")); + } } GIVEN("A ring buffer with a capacity of 5 containing 3 elements") @@ -1242,6 +1248,38 @@ SCENARIO("Ring Buffer modifiers", "[kstd][ring_buffer]") } } } + + WHEN("popping an element") + { + buffer.pop_front(); + + THEN("the size is 2") + { + REQUIRE(buffer.size() == 2); + } + + THEN("the buffer is not empty") + { + REQUIRE_FALSE(buffer.empty()); + } + } + + WHEN("popping 3 elements") + { + buffer.pop_front(); + buffer.pop_front(); + buffer.pop_front(); + + THEN("the size is 0") + { + REQUIRE(buffer.size() == 0); + } + + THEN("the buffer is empty") + { + REQUIRE(buffer.empty()); + } + } } GIVEN("A full ring buffer of static operation trackers") |
