From 21823a9066b2f54c30987d684298e32fa0b5e96c Mon Sep 17 00:00:00 2001 From: AndreaRigoni Date: Thu, 16 Apr 2026 11:30:50 +0000 Subject: [PATCH] feat: add Boost serialization support for SmartPointer and include standard smart pointer headers --- src/Core/SmartPointer.h | 45 ++++++++++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/src/Core/SmartPointer.h b/src/Core/SmartPointer.h index b1f03a7..b3be458 100644 --- a/src/Core/SmartPointer.h +++ b/src/Core/SmartPointer.h @@ -29,10 +29,10 @@ #include #include #include +#include #include #include -#include namespace uLib { @@ -219,18 +219,49 @@ public: } private: - template friend class SmartPointer; friend class boost::serialization::access; + template + void serialize(Archive &ar, const unsigned int /*version*/) { + if (Archive::is_loading::value) { + release(); + } + ar &boost::serialization::make_nvp("counter", m_counter); + if (Archive::is_loading::value && m_counter) { + m_counter->count.fetch_add(1, std::memory_order_relaxed); + } + } + + struct ReferenceCounter { + T *ptr; + std::atomic count; + std::function deleter; + + ReferenceCounter(T *p, uint32_t initial_count = 1) + : ptr(p), count(initial_count), + deleter([](T *ptr_to_del) { delete ptr_to_del; }) {} + + template + ReferenceCounter(T *p, D d, uint32_t initial_count = 1) + : ptr(p), count(initial_count), deleter(d) {} + + ReferenceCounter() + : ptr(nullptr), count(0), deleter([](T *p) { delete p; }) {} + + private: + friend class boost::serialization::access; + template + void serialize(Archive &ar, const unsigned int /*version*/) { + ar &boost::serialization::make_nvp("ptr", ptr); + } + }; + ReferenceCounter *m_counter; void acquire(ReferenceCounter *c) noexcept { + m_counter = c; if (c) { - m_counter = new ReferenceCounter(); - m_counter->ptr = c->ptr; - m_counter->cb = c->cb; - if (m_counter->cb) - m_counter->cb->count.fetch_add(1, std::memory_order_relaxed); + c->count.fetch_add(1, std::memory_order_relaxed); } }