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 | |
| parent | 2e6db00392910b7c958aa0b210fe210ec26d5e3b (diff) | |
Add option to keep node marks in YAML::Clone
commit_hash:abbf0a3ab65e0cc6d9840a440e09f02209c19239
Diffstat (limited to 'contrib/libs/yaml-cpp')
| -rw-r--r-- | contrib/libs/yaml-cpp/include/yaml-cpp/node/node.h | 2 | ||||
| -rw-r--r-- | contrib/libs/yaml-cpp/patches/02-pr1337-clone-mark.patch | 111 | ||||
| -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 |
5 files changed, 131 insertions, 16 deletions
diff --git a/contrib/libs/yaml-cpp/include/yaml-cpp/node/node.h b/contrib/libs/yaml-cpp/include/yaml-cpp/node/node.h index c9e9a0a4bc1..beb860c27e4 100644 --- a/contrib/libs/yaml-cpp/include/yaml-cpp/node/node.h +++ b/contrib/libs/yaml-cpp/include/yaml-cpp/node/node.h @@ -139,7 +139,7 @@ class YAML_CPP_API Node { YAML_CPP_API bool operator==(const Node& lhs, const Node& rhs); -YAML_CPP_API Node Clone(const Node& node); +YAML_CPP_API Node Clone(const Node& node, bool preserveMarks = false); template <typename T> struct convert; diff --git a/contrib/libs/yaml-cpp/patches/02-pr1337-clone-mark.patch b/contrib/libs/yaml-cpp/patches/02-pr1337-clone-mark.patch new file mode 100644 index 00000000000..c9c78778a0d --- /dev/null +++ b/contrib/libs/yaml-cpp/patches/02-pr1337-clone-mark.patch @@ -0,0 +1,111 @@ +https://github.com/jbeder/yaml-cpp/pull/1337 + +--- contrib/libs/yaml-cpp/include/yaml-cpp/node/node.h ++++ contrib/libs/yaml-cpp/include/yaml-cpp/node/node.h +@@ -139,7 +139,7 @@ class YAML_CPP_API Node { + + YAML_CPP_API bool operator==(const Node& lhs, const Node& rhs); + +-YAML_CPP_API Node Clone(const Node& node); ++YAML_CPP_API Node Clone(const Node& node, bool preserveMarks = false); + + template <typename T> + struct convert; +--- contrib/libs/yaml-cpp/src/node.cpp ++++ 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 +--- contrib/libs/yaml-cpp/src/nodeevents.cpp ++++ 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; +--- contrib/libs/yaml-cpp/src/nodeevents.h ++++ 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: 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: |
