summaryrefslogtreecommitdiffstats
path: root/contrib/libs/yaml-cpp
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
parent2e6db00392910b7c958aa0b210fe210ec26d5e3b (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.h2
-rw-r--r--contrib/libs/yaml-cpp/patches/02-pr1337-clone-mark.patch111
-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
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: