From 3b9a252b48659a85c656dbbb8d7c7cda739d31d5 Mon Sep 17 00:00:00 2001 From: "Dr. Patrick Urbanke" Date: Sun, 8 Jun 2025 19:00:44 +0200 Subject: [PATCH 1/2] Improved support for string_views for TOML and XML --- include/rfl/toml/read.hpp | 11 +++-------- include/rfl/xml/read.hpp | 8 +++----- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/include/rfl/toml/read.hpp b/include/rfl/toml/read.hpp index e47e00e3..b9a26cb3 100644 --- a/include/rfl/toml/read.hpp +++ b/include/rfl/toml/read.hpp @@ -3,6 +3,7 @@ #include #include +#include #include #include "../Processors.hpp" @@ -25,18 +26,12 @@ auto read(InputVarType _var) { return Parser::read(r, _var); } -/// Reads a TOML string. -template -Result> read(const std::string& _toml_str) { - auto table = ::toml::parse(_toml_str); - return read(&table); -} - /// Reads a TOML string. template Result> read( const std::string_view _toml_str) { - return read(std::string(_toml_str)); + auto table = ::toml::parse(_toml_str); + return read(&table); } /// Parses an object from a stringstream. diff --git a/include/rfl/xml/read.hpp b/include/rfl/xml/read.hpp index b41878e6..ef2b0c9c 100644 --- a/include/rfl/xml/read.hpp +++ b/include/rfl/xml/read.hpp @@ -12,8 +12,7 @@ #include "Parser.hpp" #include "Reader.hpp" -namespace rfl { -namespace xml { +namespace rfl ::xml { using InputVarType = typename Reader::InputVarType; @@ -32,7 +31,7 @@ auto read(const InputVarType& _var) { template Result read(const std::string_view _xml_str) { pugi::xml_document doc; - const auto result = doc.load_string(_xml_str.data()); + const auto result = doc.load_buffer(_xml_str.data(), _xml_str.size()); if (!result) { return error("XML string could not be parsed: " + std::string(result.description())); @@ -49,7 +48,6 @@ auto read(std::istream& _stream) { return read(xml_str); } -} // namespace xml -} // namespace rfl +} // namespace rfl::xml #endif From b18d2fe9b39138efed83e0473e0dc94627748350 Mon Sep 17 00:00:00 2001 From: "Dr. Patrick Urbanke" Date: Sun, 8 Jun 2025 20:02:07 +0200 Subject: [PATCH 2/2] Upgrade to pugixml 1.15 in order to be able to use string views --- conanfile.py | 2 +- src/rfl/xml/Writer.cpp | 20 ++++++++++---------- vcpkg.json | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/conanfile.py b/conanfile.py index fd864362..17c89a6d 100644 --- a/conanfile.py +++ b/conanfile.py @@ -82,7 +82,7 @@ def requirements(self): if self.options.with_toml: self.requires("tomlplusplus/3.4.0", transitive_headers=True) if self.options.with_xml: - self.requires("pugixml/1.14", transitive_headers=True) + self.requires("pugixml/1.15", transitive_headers=True) if self.options.with_yaml: self.requires("yaml-cpp/0.8.0", transitive_headers=True) diff --git a/src/rfl/xml/Writer.cpp b/src/rfl/xml/Writer.cpp index 6667a8e9..8efbb4b2 100644 --- a/src/rfl/xml/Writer.cpp +++ b/src/rfl/xml/Writer.cpp @@ -78,8 +78,8 @@ Writer::OutputArrayType Writer::add_array_to_object( Writer::OutputVarType Writer::add_value_to_array_impl( const std::string& _str, OutputArrayType* _parent) const noexcept { - auto node_child = Ref::make( - _parent->node_->append_child(_parent->name_.data())); + auto node_child = + Ref::make(_parent->node_->append_child(_parent->name_)); node_child->append_child(pugi::node_pcdata).set_value(_str.c_str()); return OutputVarType(node_child); } @@ -88,14 +88,14 @@ Writer::OutputVarType Writer::add_value_to_object_impl( const std::string_view& _name, const std::string& _str, OutputObjectType* _parent, const bool _is_attribute) const noexcept { if (_is_attribute) { - _parent->node_->append_attribute(_name.data()) = _str.c_str(); + _parent->node_->append_attribute(_name) = _str.c_str(); return OutputVarType(_parent->node_); } else if (_name == XML_CONTENT) { _parent->node_->append_child(pugi::node_pcdata).set_value(_str.c_str()); return OutputVarType(_parent->node_); } else { auto node_child = - Ref::make(_parent->node_->append_child(_name.data())); + Ref::make(_parent->node_->append_child(_name)); node_child->append_child(pugi::node_pcdata).set_value(_str.c_str()); return OutputVarType(node_child); } @@ -103,8 +103,8 @@ Writer::OutputVarType Writer::add_value_to_object_impl( Writer::OutputObjectType Writer::add_object_to_array( const size_t _size, OutputArrayType* _parent) const noexcept { - auto node_child = Ref::make( - _parent->node_->append_child(_parent->name_.data())); + auto node_child = + Ref::make(_parent->node_->append_child(_parent->name_)); return OutputObjectType(node_child); } @@ -112,14 +112,14 @@ Writer::OutputObjectType Writer::add_object_to_object( const std::string_view& _name, const size_t _size, OutputObjectType* _parent) const noexcept { auto node_child = - Ref::make(_parent->node_->append_child(_name.data())); + Ref::make(_parent->node_->append_child(_name)); return OutputObjectType(node_child); } Writer::OutputVarType Writer::add_null_to_array( OutputArrayType* _parent) const noexcept { - auto node_child = Ref::make( - _parent->node_->append_child(_parent->name_.data())); + auto node_child = + Ref::make(_parent->node_->append_child(_parent->name_)); return OutputVarType(node_child); } @@ -132,7 +132,7 @@ Writer::OutputVarType Writer::add_null_to_object( return OutputVarType(_parent->node_); } else { auto node_child = - Ref::make(_parent->node_->append_child(_name.data())); + Ref::make(_parent->node_->append_child(_name)); return OutputVarType(node_child); } } diff --git a/vcpkg.json b/vcpkg.json index f42e3521..b623c34b 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -142,7 +142,7 @@ "dependencies": [ { "name": "pugixml", - "version>=": "1.14" + "version>=": "1.15" } ] },