feat: add Boost serialization support for SmartPointer and include standard smart pointer headers

This commit is contained in:
AndreaRigoni
2026-04-16 11:30:50 +00:00
parent 0b553c0db7
commit cbb9aa1139
3 changed files with 47 additions and 1 deletions

View File

@@ -42,6 +42,8 @@ TODO:
#include <boost/mpl/for_each.hpp>
#include <boost/mpl/remove_if.hpp>
#include <boost/serialization/nvp.hpp>
#include <boost/serialization/shared_ptr.hpp>
#include <boost/serialization/unique_ptr.hpp>
// #include <boost/archive/xml_iarchive.hpp>
// #include <boost/archive/xml_oarchive.hpp>

View File

@@ -36,6 +36,9 @@
#include <boost/serialization/vector.hpp>
#include <boost/serialization/string.hpp>
#include <boost/serialization/access.hpp>
#include <boost/serialization/nvp.hpp>
namespace uLib {
/**
@@ -216,6 +219,7 @@ public:
private:
friend class boost::serialization::access;
struct ReferenceCounter {
T* ptr;
std::atomic<uint32_t> count;
@@ -228,7 +232,8 @@ private:
ReferenceCounter(T* p, D d, uint32_t initial_count = 1)
: ptr(p), count(initial_count), deleter(d) {}
ReferenceCounter() : ptr(nullptr), count(0) {}
ReferenceCounter()
: ptr(nullptr), count(0), deleter([](T* p) { delete p; }) {}
private:
friend class boost::serialization::access;

View File

@@ -172,6 +172,26 @@ ULIB_SERIALIZE_OBJECT(B, Object) {
class C : public virtual Object {
uLibTypeMacro(C, Object)
ULIB_SERIALIZE_ACCESS
public:
C() : m_c(1234566) {}
int m_c;
// reference to A (serializes through ID)
SmartPointer<A> m_a;
};
ULIB_SERIALIZABLE_OBJECT(C)
ULIB_SERIALIZE_OBJECT(C, Object) {
ar & "Object C : " & "--> m_c = " & AR(m_c) & "--> m_a = " & AR(m_a);
}
int test_referece_serialization() {
A a;
{
@@ -193,7 +213,25 @@ int test_referece_serialization() {
return (b.m_a->a() == a.a() && b2.m_a->a() == a.a());
}
int test_referece_smartpointer_serialization() {
SmartPointer<A> a;
a->init_properties();
{
C c, c2; c.m_a = a; c2.m_a = a;
std::ofstream file("test_ref_smartpointer.xml");
Archive::xml_oarchive(file) << NVP(c) << NVP(c2);
}
C c, c2;
{
std::ifstream file("test_ref_smartpointer.xml");
Archive::xml_iarchive(file) >> NVP(c) >> NVP(c2);
}
return (c.m_a->a() == a->a() && c2.m_a->a() == a->a());
}
int main() {
@@ -202,6 +240,7 @@ int main() {
TEST1(test_V3f());
TEST1(testing_xml_class());
TEST1(test_referece_serialization());
TEST1(test_referece_smartpointer_serialization());
// TEST1(testing_hrt_class());
END_TESTING;