From 41605b0f0267cd453b0c5fe0c1d4a49c6a2caa03 Mon Sep 17 00:00:00 2001 From: Ron0Studios Date: Fri, 3 Apr 2026 17:04:24 +0100 Subject: [PATCH] boost src offloading --- CMakeLists.txt | 3 + include/rfl/boost_serialization/Writer.hpp | 149 ++++--------- src/reflectcpp_boost_serialization.cpp | 1 + src/rfl/boost_serialization/Writer.cpp | 238 +++++++++++++++++++++ 4 files changed, 284 insertions(+), 107 deletions(-) create mode 100644 src/reflectcpp_boost_serialization.cpp create mode 100644 src/rfl/boost_serialization/Writer.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index a3d684a8..0798c37f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -432,6 +432,9 @@ if (REFLECTCPP_YAML OR REFLECTCPP_CHECK_HEADERS) endif () if (REFLECTCPP_BOOST_SERIALIZATION OR REFLECTCPP_CHECK_HEADERS) + list(APPEND REFLECT_CPP_SOURCES + src/reflectcpp_boost_serialization.cpp + ) if (NOT TARGET Boost::serialization) find_package(Boost REQUIRED COMPONENTS serialization) endif () diff --git a/include/rfl/boost_serialization/Writer.hpp b/include/rfl/boost_serialization/Writer.hpp index df8bf4e5..13aac314 100644 --- a/include/rfl/boost_serialization/Writer.hpp +++ b/include/rfl/boost_serialization/Writer.hpp @@ -30,28 +30,19 @@ class Writer { using OutputUnionType = BoostOutputUnion; using OutputVarType = BoostOutputVar; - Writer(OArchive* _ar) : ar_(_ar) {} + Writer(OArchive* _ar); ~Writer() = default; - OutputArrayType array_as_root(const size_t _size) const { - *ar_ << static_cast(_size); - return OutputArrayType{}; - } + OutputArrayType array_as_root(const size_t _size) const; - OutputMapType map_as_root(const size_t _size) const { - *ar_ << static_cast(_size); - return OutputMapType{}; - } + OutputMapType map_as_root(const size_t _size) const; - OutputObjectType object_as_root(const size_t _size) const { - *ar_ << static_cast(_size); - return OutputObjectType{}; - } + OutputObjectType object_as_root(const size_t _size) const; - OutputVarType null_as_root() const { return OutputVarType{}; } + OutputVarType null_as_root() const; - OutputUnionType union_as_root() const { return OutputUnionType{}; } + OutputUnionType union_as_root() const; template OutputVarType value_as_root(const T& _var) const { @@ -60,109 +51,57 @@ class Writer { } OutputArrayType add_array_to_array(const size_t _size, - OutputArrayType* /*_parent*/) const { - *ar_ << static_cast(_size); - return OutputArrayType{}; - } + OutputArrayType* _parent) const; OutputArrayType add_array_to_map(const std::string_view& _name, const size_t _size, - OutputMapType* /*_parent*/) const { - *ar_ << std::string(_name); - *ar_ << static_cast(_size); - return OutputArrayType{}; - } + OutputMapType* _parent) const; - OutputArrayType add_array_to_object(const std::string_view& /*_name*/, + OutputArrayType add_array_to_object(const std::string_view& _name, const size_t _size, - OutputObjectType* /*_parent*/) const { - *ar_ << static_cast(_size); - return OutputArrayType{}; - } + OutputObjectType* _parent) const; OutputArrayType add_array_to_union(const size_t _index, const size_t _size, - OutputUnionType* /*_parent*/) const { - *ar_ << static_cast(_index); - *ar_ << static_cast(_size); - return OutputArrayType{}; - } + OutputUnionType* _parent) const; OutputMapType add_map_to_array(const size_t _size, - OutputArrayType* /*_parent*/) const { - *ar_ << static_cast(_size); - return OutputMapType{}; - } + OutputArrayType* _parent) const; OutputMapType add_map_to_map(const std::string_view& _name, const size_t _size, - OutputMapType* /*_parent*/) const { - *ar_ << std::string(_name); - *ar_ << static_cast(_size); - return OutputMapType{}; - } + OutputMapType* _parent) const; - OutputMapType add_map_to_object(const std::string_view& /*_name*/, + OutputMapType add_map_to_object(const std::string_view& _name, const size_t _size, - OutputObjectType* /*_parent*/) const { - *ar_ << static_cast(_size); - return OutputMapType{}; - } + OutputObjectType* _parent) const; OutputMapType add_map_to_union(const size_t _index, const size_t _size, - OutputUnionType* /*_parent*/) const { - *ar_ << static_cast(_index); - *ar_ << static_cast(_size); - return OutputMapType{}; - } + OutputUnionType* _parent) const; OutputObjectType add_object_to_array(const size_t _size, - OutputArrayType* /*_parent*/) const { - *ar_ << static_cast(_size); - return OutputObjectType{}; - } + OutputArrayType* _parent) const; OutputObjectType add_object_to_map(const std::string_view& _name, const size_t _size, - OutputMapType* /*_parent*/) const { - *ar_ << std::string(_name); - *ar_ << static_cast(_size); - return OutputObjectType{}; - } + OutputMapType* _parent) const; - OutputObjectType add_object_to_object(const std::string_view& /*_name*/, + OutputObjectType add_object_to_object(const std::string_view& _name, const size_t _size, - OutputObjectType* /*_parent*/) const { - *ar_ << static_cast(_size); - return OutputObjectType{}; - } + OutputObjectType* _parent) const; OutputObjectType add_object_to_union(const size_t _index, const size_t _size, - OutputUnionType* /*_parent*/) const { - *ar_ << static_cast(_index); - *ar_ << static_cast(_size); - return OutputObjectType{}; - } + OutputUnionType* _parent) const; - OutputUnionType add_union_to_array(OutputArrayType* /*_parent*/) const { - return OutputUnionType{}; - } + OutputUnionType add_union_to_array(OutputArrayType* _parent) const; OutputUnionType add_union_to_map(const std::string_view& _name, - OutputMapType* /*_parent*/) const { - *ar_ << std::string(_name); - return OutputUnionType{}; - } + OutputMapType* _parent) const; - OutputUnionType add_union_to_object(const std::string_view& /*_name*/, - OutputObjectType* /*_parent*/) const { - return OutputUnionType{}; - } + OutputUnionType add_union_to_object(const std::string_view& _name, + OutputObjectType* _parent) const; OutputUnionType add_union_to_union(const size_t _index, - OutputUnionType* /*_parent*/) const { - *ar_ << static_cast(_index); - return OutputUnionType{}; - } + OutputUnionType* _parent) const; template OutputVarType add_value_to_array(const T& _var, @@ -174,7 +113,7 @@ class Writer { template OutputVarType add_value_to_map(const std::string_view& _name, const T& _var, OutputMapType* /*_parent*/) const { - *ar_ << std::string(_name); + write_key(_name); new_value(_var); return OutputVarType{}; } @@ -190,39 +129,35 @@ class Writer { template OutputVarType add_value_to_union(const size_t _index, const T& _var, OutputUnionType* /*_parent*/) const { - *ar_ << static_cast(_index); + write_index(_index); new_value(_var); return OutputVarType{}; } - OutputVarType add_null_to_array(OutputArrayType* /*_parent*/) const { - return OutputVarType{}; - } + OutputVarType add_null_to_array(OutputArrayType* _parent) const; OutputVarType add_null_to_map(const std::string_view& _name, - OutputMapType* /*_parent*/) const { - *ar_ << std::string(_name); - return OutputVarType{}; - } + OutputMapType* _parent) const; - OutputVarType add_null_to_object(const std::string_view& /*_name*/, - OutputObjectType* /*_parent*/) const { - return OutputVarType{}; - } + OutputVarType add_null_to_object(const std::string_view& _name, + OutputObjectType* _parent) const; OutputVarType add_null_to_union(const size_t _index, - OutputUnionType* /*_parent*/) const { - *ar_ << static_cast(_index); - return OutputVarType{}; - } + OutputUnionType* _parent) const; - void end_array(OutputArrayType* /*_arr*/) const {} + void end_array(OutputArrayType* _arr) const; - void end_map(OutputMapType* /*_obj*/) const {} + void end_map(OutputMapType* _obj) const; - void end_object(OutputObjectType* /*_obj*/) const {} + void end_object(OutputObjectType* _obj) const; private: + void write_size(const size_t _size) const; + + void write_index(const size_t _index) const; + + void write_key(const std::string_view& _name) const; + template void new_value(const T& _var) const { using Type = std::remove_cvref_t; diff --git a/src/reflectcpp_boost_serialization.cpp b/src/reflectcpp_boost_serialization.cpp new file mode 100644 index 00000000..2e35fdf4 --- /dev/null +++ b/src/reflectcpp_boost_serialization.cpp @@ -0,0 +1 @@ +#include "rfl/boost_serialization/Writer.cpp" diff --git a/src/rfl/boost_serialization/Writer.cpp b/src/rfl/boost_serialization/Writer.cpp new file mode 100644 index 00000000..703bb55b --- /dev/null +++ b/src/rfl/boost_serialization/Writer.cpp @@ -0,0 +1,238 @@ +#include "rfl/boost_serialization/Writer.hpp" + +#include +#include +#include + +namespace rfl::boost_serialization { + +template +Writer::Writer(OArchive* _ar) : ar_(_ar) {} + +template +auto Writer::array_as_root(const size_t _size) const + -> OutputArrayType { + write_size(_size); + return OutputArrayType{}; +} + +template +auto Writer::map_as_root(const size_t _size) const -> OutputMapType { + write_size(_size); + return OutputMapType{}; +} + +template +auto Writer::object_as_root(const size_t _size) const + -> OutputObjectType { + write_size(_size); + return OutputObjectType{}; +} + +template +auto Writer::null_as_root() const -> OutputVarType { + return OutputVarType{}; +} + +template +auto Writer::union_as_root() const -> OutputUnionType { + return OutputUnionType{}; +} + +template +auto Writer::add_array_to_array(const size_t _size, + OutputArrayType* /*_parent*/) const + -> OutputArrayType { + write_size(_size); + return OutputArrayType{}; +} + +template +auto Writer::add_array_to_map(const std::string_view& _name, + const size_t _size, + OutputMapType* /*_parent*/) const + -> OutputArrayType { + write_key(_name); + write_size(_size); + return OutputArrayType{}; +} + +template +auto Writer::add_array_to_object(const std::string_view& /*_name*/, + const size_t _size, + OutputObjectType* /*_parent*/) const + -> OutputArrayType { + write_size(_size); + return OutputArrayType{}; +} + +template +auto Writer::add_array_to_union(const size_t _index, + const size_t _size, + OutputUnionType* /*_parent*/) const + -> OutputArrayType { + write_index(_index); + write_size(_size); + return OutputArrayType{}; +} + +template +auto Writer::add_map_to_array(const size_t _size, + OutputArrayType* /*_parent*/) const + -> OutputMapType { + write_size(_size); + return OutputMapType{}; +} + +template +auto Writer::add_map_to_map(const std::string_view& _name, + const size_t _size, + OutputMapType* /*_parent*/) const + -> OutputMapType { + write_key(_name); + write_size(_size); + return OutputMapType{}; +} + +template +auto Writer::add_map_to_object(const std::string_view& /*_name*/, + const size_t _size, + OutputObjectType* /*_parent*/) const + -> OutputMapType { + write_size(_size); + return OutputMapType{}; +} + +template +auto Writer::add_map_to_union(const size_t _index, const size_t _size, + OutputUnionType* /*_parent*/) const + -> OutputMapType { + write_index(_index); + write_size(_size); + return OutputMapType{}; +} + +template +auto Writer::add_object_to_array(const size_t _size, + OutputArrayType* /*_parent*/) const + -> OutputObjectType { + write_size(_size); + return OutputObjectType{}; +} + +template +auto Writer::add_object_to_map(const std::string_view& _name, + const size_t _size, + OutputMapType* /*_parent*/) const + -> OutputObjectType { + write_key(_name); + write_size(_size); + return OutputObjectType{}; +} + +template +auto Writer::add_object_to_object(const std::string_view& /*_name*/, + const size_t _size, + OutputObjectType* /*_parent*/) const + -> OutputObjectType { + write_size(_size); + return OutputObjectType{}; +} + +template +auto Writer::add_object_to_union(const size_t _index, + const size_t _size, + OutputUnionType* /*_parent*/) const + -> OutputObjectType { + write_index(_index); + write_size(_size); + return OutputObjectType{}; +} + +template +auto Writer::add_union_to_array(OutputArrayType* /*_parent*/) const + -> OutputUnionType { + return OutputUnionType{}; +} + +template +auto Writer::add_union_to_map(const std::string_view& _name, + OutputMapType* /*_parent*/) const + -> OutputUnionType { + write_key(_name); + return OutputUnionType{}; +} + +template +auto Writer::add_union_to_object(const std::string_view& /*_name*/, + OutputObjectType* /*_parent*/) const + -> OutputUnionType { + return OutputUnionType{}; +} + +template +auto Writer::add_union_to_union(const size_t _index, + OutputUnionType* /*_parent*/) const + -> OutputUnionType { + write_index(_index); + return OutputUnionType{}; +} + +template +auto Writer::add_null_to_array(OutputArrayType* /*_parent*/) const + -> OutputVarType { + return OutputVarType{}; +} + +template +auto Writer::add_null_to_map(const std::string_view& _name, + OutputMapType* /*_parent*/) const + -> OutputVarType { + write_key(_name); + return OutputVarType{}; +} + +template +auto Writer::add_null_to_object(const std::string_view& /*_name*/, + OutputObjectType* /*_parent*/) const + -> OutputVarType { + return OutputVarType{}; +} + +template +auto Writer::add_null_to_union(const size_t _index, + OutputUnionType* /*_parent*/) const + -> OutputVarType { + write_index(_index); + return OutputVarType{}; +} + +template +void Writer::end_array(OutputArrayType* /*_arr*/) const {} + +template +void Writer::end_map(OutputMapType* /*_obj*/) const {} + +template +void Writer::end_object(OutputObjectType* /*_obj*/) const {} + +template +void Writer::write_size(const size_t _size) const { + *ar_ << static_cast(_size); +} + +template +void Writer::write_index(const size_t _index) const { + *ar_ << static_cast(_index); +} + +template +void Writer::write_key(const std::string_view& _name) const { + *ar_ << std::string(_name); +} + +// Explicit instantiations for common archive types. +template class Writer; +template class Writer; + +} // namespace rfl::boost_serialization