aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/kstd/kstd/ring_buffer.hpp6
-rw-r--r--libs/kstd/kstd/ring_buffer.tests.cpp50
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")