summaryrefslogtreecommitdiffstats
path: root/contrib/libs/yaml-cpp/src
diff options
context:
space:
mode:
authorvadim-xd <[email protected]>2025-05-13 13:41:15 +0300
committervadim-xd <[email protected]>2025-05-13 13:56:22 +0300
commitf1acb483cbe1fb70149d442d3332f55380b0277f (patch)
treea238848c8cbe7b132850f9bba75887552013625a /contrib/libs/yaml-cpp/src
parent2e6db00392910b7c958aa0b210fe210ec26d5e3b (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.cpp4
-rw-r--r--contrib/libs/yaml-cpp/src/nodeevents.cpp24
-rw-r--r--contrib/libs/yaml-cpp/src/nodeevents.h6
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: