aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/yaml-cpp/patches/02-pr1337-clone-mark.patch
blob: c9c78778a0d65405cf13ef9fa1d3d17bbaa2ff4f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
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: