diff options
| -rw-r--r-- | libs/kstd/kstd/ring_buffer.hpp | 6 | ||||
| -rw-r--r-- | libs/kstd/kstd/ring_buffer.tests.cpp | 50 |
2 files changed, 56 insertions, 0 deletions
diff --git a/libs/kstd/kstd/ring_buffer.hpp b/libs/kstd/kstd/ring_buffer.hpp index b015755d..aa0b3a5c 100644 --- a/libs/kstd/kstd/ring_buffer.hpp +++ b/libs/kstd/kstd/ring_buffer.hpp @@ -175,6 +175,12 @@ namespace kstd //! Construct an empty ring buffer. constexpr ring_buffer() noexcept = default; + //! Destroy this ring buffer. + constexpr ~ring_buffer() noexcept + { + std::ranges::for_each(std::views::reverse(*this), [](auto & element) { std::destroy_at(&element); }); + } + //! Construct a ring buffer with a given number of value initialized elements. //! //! @param count The number of value initialized elements to construct. diff --git a/libs/kstd/kstd/ring_buffer.tests.cpp b/libs/kstd/kstd/ring_buffer.tests.cpp index 32002d79..2a2d23b0 100644 --- a/libs/kstd/kstd/ring_buffer.tests.cpp +++ b/libs/kstd/kstd/ring_buffer.tests.cpp @@ -8,9 +8,24 @@ #include <cstddef> #include <iterator> +#include <memory> #include <type_traits> #include <utility> +namespace +{ + struct static_dtor_tracker + { + auto static inline dtor_call_count = 0uz; + + ~static_dtor_tracker() + { + ++dtor_call_count; + } + }; + +} // namespace + SCENARIO("Ring Buffer interface types", "[kstd][ring_buffer]") { GIVEN("A ring buffer of float") @@ -290,6 +305,41 @@ SCENARIO("Ring Buffer initialization and construction", "[kstd][ring_buffer]") } } +SCENARIO("Ring Buffer destruction", "[kstd][ring_buffer]") +{ + GIVEN("An empty buffer") + { + static_dtor_tracker::dtor_call_count = 0; + auto buffer = std::make_shared<kstd::ring_buffer<static_dtor_tracker, 5>>(); + + WHEN("the buffer is destroyed") + { + buffer.reset(); + + THEN("no dtors are invoked") + { + REQUIRE(static_dtor_tracker::dtor_call_count == 0); + } + } + } + + GIVEN("A buffer containing 3 elements") + { + static_dtor_tracker::dtor_call_count = 0; + auto buffer = std::make_shared<kstd::ring_buffer<static_dtor_tracker, 5>>(3); + + WHEN("the buffer is destroyed") + { + buffer.reset(); + + THEN("3 dtors are invoked") + { + REQUIRE(static_dtor_tracker::dtor_call_count == 3); + } + } + } +} + SCENARIO("Ring Buffer element access", "[kstd][ring_buffer]") { GIVEN("An empty ring buffer") |
