diff options
| author | vadim-xd <[email protected]> | 2025-05-13 13:41:15 +0300 |
|---|---|---|
| committer | vadim-xd <[email protected]> | 2025-05-13 13:56:22 +0300 |
| commit | f1acb483cbe1fb70149d442d3332f55380b0277f (patch) | |
| tree | a238848c8cbe7b132850f9bba75887552013625a /contrib/libs/yaml-cpp/src | |
| parent | 2e6db00392910b7c958aa0b210fe210ec26d5e3b (diff) | |
Add option to keep node marks in YAML::Clone
commit_hash:abbf0a3ab65e0cc6d9840a440e09f02209c19239
Diffstat (limited to 'contrib/libs/yaml-cpp/src')
| -rw-r--r-- | contrib/libs/yaml-cpp/src/node.cpp | 4 | ||||
| -rw-r--r-- | contrib/libs/yaml-cpp/src/nodeevents.cpp | 24 | ||||
| -rw-r--r-- | contrib/libs/yaml-cpp/src/nodeevents.h | 6 |
3 files changed, 19 insertions, 15 deletions
diff --git a/contrib/libs/yaml-cpp/src/node.cpp b/contrib/libs/yaml-cpp/src/node.cpp index badc3110ecc..432791481a4 100644 --- a/contrib/libs/yaml-cpp/src/node.cpp +++ b/contrib/libs/yaml-cpp/src/node.cpp @@ -3,10 +3,10 @@ #include "nodeevents.h" namespace YAML { -Node Clone(const Node& node) { +Node Clone(const Node& node, bool preserveMarks) { NodeEvents events(node); NodeBuilder builder; - events.Emit(builder); + events.Emit(builder, preserveMarks); return builder.Root(); } } // namespace YAML diff --git a/contrib/libs/yaml-cpp/src/nodeevents.cpp b/contrib/libs/yaml-cpp/src/nodeevents.cpp index b1774fef3e4..b6b48e3370a 100644 --- a/contrib/libs/yaml-cpp/src/nodeevents.cpp +++ b/contrib/libs/yaml-cpp/src/nodeevents.cpp @@ -42,17 +42,17 @@ void NodeEvents::Setup(const detail::node& node) { } } -void NodeEvents::Emit(EventHandler& handler) { +void NodeEvents::Emit(EventHandler& handler, bool preserveMarks) { AliasManager am; handler.OnDocumentStart(Mark()); if (m_root) - Emit(*m_root, handler, am); + Emit(*m_root, handler, am, preserveMarks); handler.OnDocumentEnd(); } void NodeEvents::Emit(const detail::node& node, EventHandler& handler, - AliasManager& am) const { + AliasManager& am, bool preserveMarks) const { anchor_t anchor = NullAnchor; if (IsAliased(node)) { anchor = am.LookupAnchor(node); @@ -65,26 +65,30 @@ void NodeEvents::Emit(const detail::node& node, EventHandler& handler, anchor = am.LookupAnchor(node); } + auto getMark = [preserveMarks, &node]() { + return preserveMarks ? node.mark() : Mark(); + }; + switch (node.type()) { case NodeType::Undefined: break; case NodeType::Null: - handler.OnNull(Mark(), anchor); + handler.OnNull(getMark(), anchor); break; case NodeType::Scalar: - handler.OnScalar(Mark(), node.tag(), anchor, node.scalar()); + handler.OnScalar(getMark(), node.tag(), anchor, node.scalar()); break; case NodeType::Sequence: - handler.OnSequenceStart(Mark(), node.tag(), anchor, node.style()); + handler.OnSequenceStart(getMark(), node.tag(), anchor, node.style()); for (auto element : node) - Emit(*element, handler, am); + Emit(*element, handler, am, preserveMarks); handler.OnSequenceEnd(); break; case NodeType::Map: - handler.OnMapStart(Mark(), node.tag(), anchor, node.style()); + handler.OnMapStart(getMark(), node.tag(), anchor, node.style()); for (auto element : node) { - Emit(*element.first, handler, am); - Emit(*element.second, handler, am); + Emit(*element.first, handler, am, preserveMarks); + Emit(*element.second, handler, am, preserveMarks); } handler.OnMapEnd(); break; diff --git a/contrib/libs/yaml-cpp/src/nodeevents.h b/contrib/libs/yaml-cpp/src/nodeevents.h index efca9149ed3..662a64f75bc 100644 --- a/contrib/libs/yaml-cpp/src/nodeevents.h +++ b/contrib/libs/yaml-cpp/src/nodeevents.h @@ -31,7 +31,7 @@ class NodeEvents { NodeEvents& operator=(const NodeEvents&) = delete; NodeEvents& operator=(NodeEvents&&) = delete; - void Emit(EventHandler& handler); + void Emit(EventHandler& handler, bool preserveMarks = false); private: class AliasManager { @@ -52,8 +52,8 @@ class NodeEvents { }; void Setup(const detail::node& node); - void Emit(const detail::node& node, EventHandler& handler, - AliasManager& am) const; + void Emit(const detail::node& node, EventHandler& handler, AliasManager& am, + bool preserveMarks) const; bool IsAliased(const detail::node& node) const; private: |
