From 91505830992f73639e8c3223ce1e178e55830b7f Mon Sep 17 00:00:00 2001 From: "Dr. Patrick Urbanke" Date: Sat, 4 Apr 2026 15:48:31 +0200 Subject: [PATCH 1/3] Better handling of the writer --- include/rfl/boost_serialization/Writer.hpp | 151 ++++++++++---- src/rfl/boost_serialization/Writer.cpp | 226 --------------------- 2 files changed, 114 insertions(+), 263 deletions(-) diff --git a/include/rfl/boost_serialization/Writer.hpp b/include/rfl/boost_serialization/Writer.hpp index 13aac314..3a6b9b1d 100644 --- a/include/rfl/boost_serialization/Writer.hpp +++ b/include/rfl/boost_serialization/Writer.hpp @@ -30,19 +30,28 @@ class Writer { using OutputUnionType = BoostOutputUnion; using OutputVarType = BoostOutputVar; - Writer(OArchive* _ar); + Writer(OArchive* _ar) : ar_(_ar) {} ~Writer() = default; - OutputArrayType array_as_root(const size_t _size) const; + OutputArrayType array_as_root(const size_t _size) const { + write_size(_size); + return OutputArrayType{}; + } - OutputMapType map_as_root(const size_t _size) const; + OutputMapType map_as_root(const size_t _size) const { + write_size(_size); + return OutputMapType{}; + } - OutputObjectType object_as_root(const size_t _size) const; + OutputObjectType object_as_root(const size_t _size) const { + write_size(_size); + return OutputObjectType{}; + } - OutputVarType null_as_root() const; + OutputVarType null_as_root() const { return OutputVarType{}; } - OutputUnionType union_as_root() const; + OutputUnionType union_as_root() const { return OutputUnionType{}; } template OutputVarType value_as_root(const T& _var) const { @@ -51,57 +60,109 @@ class Writer { } OutputArrayType add_array_to_array(const size_t _size, - OutputArrayType* _parent) const; + OutputArrayType* /*_parent*/) const { + write_size(_size); + return OutputArrayType{}; + } OutputArrayType add_array_to_map(const std::string_view& _name, const size_t _size, - OutputMapType* _parent) const; + OutputMapType* /*_parent*/) const { + write_key(_name); + write_size(_size); + return OutputArrayType{}; + } - 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; + OutputObjectType* /*_parent*/) const { + write_size(_size); + return OutputArrayType{}; + } OutputArrayType add_array_to_union(const size_t _index, const size_t _size, - OutputUnionType* _parent) const; + OutputUnionType* /*_parent*/) const { + write_index(_index); + write_size(_size); + return OutputArrayType{}; + } OutputMapType add_map_to_array(const size_t _size, - OutputArrayType* _parent) const; + OutputArrayType* /*_parent*/) const { + write_size(_size); + return OutputMapType{}; + } OutputMapType add_map_to_map(const std::string_view& _name, const size_t _size, - OutputMapType* _parent) const; + OutputMapType* /*_parent*/) const { + write_key(_name); + write_size(_size); + return OutputMapType{}; + } - 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; + OutputObjectType* /*_parent*/) const { + write_size(_size); + return OutputMapType{}; + } OutputMapType add_map_to_union(const size_t _index, const size_t _size, - OutputUnionType* _parent) const; + OutputUnionType* /*_parent*/) const { + write_index(_index); + write_size(_size); + return OutputMapType{}; + } OutputObjectType add_object_to_array(const size_t _size, - OutputArrayType* _parent) const; + OutputArrayType* /*_parent*/) const { + write_size(_size); + return OutputObjectType{}; + } OutputObjectType add_object_to_map(const std::string_view& _name, const size_t _size, - OutputMapType* _parent) const; + OutputMapType* /*_parent*/) const { + write_key(_name); + write_size(_size); + return OutputObjectType{}; + } - 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; + OutputObjectType* /*_parent*/) const { + write_size(_size); + return OutputObjectType{}; + } OutputObjectType add_object_to_union(const size_t _index, const size_t _size, - OutputUnionType* _parent) const; + OutputUnionType* /*_parent*/) const { + write_index(_index); + write_size(_size); + return OutputObjectType{}; + } - OutputUnionType add_union_to_array(OutputArrayType* _parent) const; + OutputUnionType add_union_to_array(OutputArrayType* /*_parent*/) const { + return OutputUnionType{}; + } OutputUnionType add_union_to_map(const std::string_view& _name, - OutputMapType* _parent) const; + OutputMapType* /*_parent*/) const { + write_key(_name); + return OutputUnionType{}; + } - OutputUnionType add_union_to_object(const std::string_view& _name, - OutputObjectType* _parent) const; + OutputUnionType add_union_to_object(const std::string_view& /*_name*/, + OutputObjectType* /*_parent*/) const { + return OutputUnionType{}; + } OutputUnionType add_union_to_union(const size_t _index, - OutputUnionType* _parent) const; + OutputUnionType* /*_parent*/) const { + write_index(_index); + return OutputUnionType{}; + } template OutputVarType add_value_to_array(const T& _var, @@ -134,29 +195,45 @@ class Writer { return OutputVarType{}; } - OutputVarType add_null_to_array(OutputArrayType* _parent) const; + OutputVarType add_null_to_array(OutputArrayType* /*_parent*/) const { + return OutputVarType{}; + } OutputVarType add_null_to_map(const std::string_view& _name, - OutputMapType* _parent) const; + OutputMapType* /*_parent*/) const { + write_key(_name); + return OutputVarType{}; + } - OutputVarType add_null_to_object(const std::string_view& _name, - OutputObjectType* _parent) const; + OutputVarType add_null_to_object(const std::string_view& /*_name*/, + OutputObjectType* /*_parent*/) const { + return OutputVarType{}; + } OutputVarType add_null_to_union(const size_t _index, - OutputUnionType* _parent) const; + OutputUnionType* /*_parent*/) const { + write_index(_index); + return OutputVarType{}; + } - 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_size(const size_t _size) const { + *ar_ << static_cast(_size); + } - void write_index(const size_t _index) const; + void write_index(const size_t _index) const { + *ar_ << static_cast(_index); + } - void write_key(const std::string_view& _name) const; + void write_key(const std::string_view& _name) const { + *ar_ << std::string(_name); + } template void new_value(const T& _var) const { diff --git a/src/rfl/boost_serialization/Writer.cpp b/src/rfl/boost_serialization/Writer.cpp index 703bb55b..d3ad3c0f 100644 --- a/src/rfl/boost_serialization/Writer.cpp +++ b/src/rfl/boost_serialization/Writer.cpp @@ -6,232 +6,6 @@ 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; From 5e50b77fd312b0042f3c13c51fb245026254d91e Mon Sep 17 00:00:00 2001 From: "Dr. Patrick Urbanke" Date: Sat, 4 Apr 2026 15:52:28 +0200 Subject: [PATCH 2/3] Added support for generic --- include/rfl/boost_serialization/Parser.hpp | 28 ------------------ tests/boost_serialization/test_generic.cpp | 33 ++++++++++++++++++++++ 2 files changed, 33 insertions(+), 28 deletions(-) create mode 100644 tests/boost_serialization/test_generic.cpp diff --git a/include/rfl/boost_serialization/Parser.hpp b/include/rfl/boost_serialization/Parser.hpp index 98b88450..71269b6f 100644 --- a/include/rfl/boost_serialization/Parser.hpp +++ b/include/rfl/boost_serialization/Parser.hpp @@ -57,34 +57,6 @@ struct Parser, /*_all_required=*/true, ProcessorsType, std::tuple> {}; -template - requires AreReaderAndWriter, - boost_serialization::Writer, Generic> -struct Parser, - boost_serialization::Writer, Generic, ProcessorsType> { - template - static Result read(const boost_serialization::Reader&, - const T&) noexcept { - static_assert(always_false_v, - "Generics are unsupported in Boost.Serialization."); - return error("Unsupported"); - } - - template - static void write(const boost_serialization::Writer&, - const Generic&, const P&) noexcept { - static_assert(always_false_v

, - "Generics are unsupported in Boost.Serialization."); - } - - template - static schema::Type to_schema(T*) { - static_assert(always_false_v, - "Generics are unsupported in Boost.Serialization."); - return schema::Type{}; - } -}; - template requires AreReaderAndWriter< diff --git a/tests/boost_serialization/test_generic.cpp b/tests/boost_serialization/test_generic.cpp new file mode 100644 index 00000000..5a11024b --- /dev/null +++ b/tests/boost_serialization/test_generic.cpp @@ -0,0 +1,33 @@ +#include +#include +#include + +#include "write_and_read.hpp" + +namespace test_generic { + +TEST(boost_serialization, test_generic) { + auto bart = rfl::Generic::Object(); + bart["first_name"] = "Bart"; + bart["last_name"] = "Simpson"; + bart["age"] = 10; + + auto lisa = rfl::Generic::Object(); + lisa["first_name"] = "Lisa"; + lisa["last_name"] = "Simpson"; + lisa["age"] = 8; + + auto maggie = rfl::Generic::Object(); + maggie["first_name"] = "Lisa"; + maggie["last_name"] = "Simpson"; + maggie["age"] = 0; + + auto homer = rfl::Generic::Object(); + homer["first_name"] = "Lisa"; + homer["last_name"] = "Simpson"; + homer["age"] = 45; + homer["children"] = rfl::Generic::Array({bart, lisa, maggie}); + + write_and_read(homer); +} +} // namespace test_generic From ee02138026c0d898b88c83b0eba1453c52e3d022 Mon Sep 17 00:00:00 2001 From: "Dr. Patrick Urbanke" Date: Sat, 4 Apr 2026 15:54:05 +0200 Subject: [PATCH 3/3] Added to mkdocs.yaml --- mkdocs.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mkdocs.yaml b/mkdocs.yaml index 00375ba2..81e36641 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -6,7 +6,7 @@ site_url: https://rfl.getml.com/ site_author: Code17 GmbH site_description: >- A C++20 library for fast serialization, deserialization and validation using reflection. - Supports JSON, AVRO, BSON, Cap'n Proto, CBOR, Cereal, CSV, flexbuffers, msgpack, parquet, TOML, UBJSON, XML, YAML + Supports JSON, AVRO, BSON, Boost Serialization, Cap'n Proto, CBOR, Cereal, CSV, flexbuffers, msgpack, parquet, TOML, UBJSON, XML, YAML theme: name: "material" @@ -93,6 +93,7 @@ nav: # # - Errors handling: concepts/errors.md - Supported Formats: - Avro: supported_formats/avro.md + - Boost Serialization: supported_formats/boost_serialization.md - BSON: supported_formats/bson.md - Cap'n Proto: supported_formats/capnproto.md - CBOR: supported_formats/cbor.md