Skip to content

Commit

Permalink
Merge pull request #10 from swift-nav/woodfell/deep_clone
Browse files Browse the repository at this point in the history
API extension to do deep clone, remove alises
  • Loading branch information
woodfell authored Jul 1, 2024
2 parents 7e1bc5f + 6340962 commit 3de9fe4
Show file tree
Hide file tree
Showing 5 changed files with 14 additions and 14 deletions.
4 changes: 2 additions & 2 deletions include/yaml-cpp/node/node.h
Original file line number Diff line number Diff line change
Expand Up @@ -139,10 +139,10 @@ 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 preserve_aliases = true);

template <typename T>
struct convert;
}
} // namespace YAML

#endif // NODE_NODE_H_62B23520_7C8E_11DE_8A39_0800200C9A66
2 changes: 1 addition & 1 deletion src/emit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ namespace YAML {
Emitter& operator<<(Emitter& out, const Node& node) {
EmitFromEvents emitFromEvents(out);
NodeEvents events(node);
events.Emit(emitFromEvents);
events.Emit(emitFromEvents, true);
return out;
}

Expand Down
4 changes: 2 additions & 2 deletions src/node.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
#include "nodeevents.h"

namespace YAML {
Node Clone(const Node& node) {
Node Clone(const Node& node, bool preserve_aliases) {
NodeEvents events(node);
NodeBuilder builder;
events.Emit(builder);
events.Emit(builder, preserve_aliases);
return builder.Root();
}
} // namespace YAML
14 changes: 7 additions & 7 deletions src/nodeevents.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,19 +42,19 @@ void NodeEvents::Setup(const detail::node& node) {
}
}

void NodeEvents::Emit(EventHandler& handler) {
void NodeEvents::Emit(EventHandler& handler, bool preserve_aliases) {
AliasManager am;

handler.OnDocumentStart(Mark());
if (m_root)
Emit(*m_root, handler, am);
Emit(*m_root, handler, am, preserve_aliases);
handler.OnDocumentEnd();
}

void NodeEvents::Emit(const detail::node& node, EventHandler& handler,
AliasManager& am) const {
AliasManager& am, bool preserve_aliases) const {
anchor_t anchor = NullAnchor;
if (IsAliased(node)) {
if (preserve_aliases && IsAliased(node)) {
anchor = am.LookupAnchor(node);
if (anchor) {
handler.OnAlias(Mark(), anchor);
Expand All @@ -77,14 +77,14 @@ void NodeEvents::Emit(const detail::node& node, EventHandler& handler,
case NodeType::Sequence:
handler.OnSequenceStart(Mark(), node.tag(), anchor, node.style());
for (auto element : node)
Emit(*element, handler, am);
Emit(*element, handler, am, preserve_aliases);
handler.OnSequenceEnd();
break;
case NodeType::Map:
handler.OnMapStart(Mark(), node.tag(), anchor, node.style());
for (auto element : node) {
Emit(*element.first, handler, am);
Emit(*element.second, handler, am);
Emit(*element.first, handler, am, preserve_aliases);
Emit(*element.second, handler, am, preserve_aliases);
}
handler.OnMapEnd();
break;
Expand Down
4 changes: 2 additions & 2 deletions src/nodeevents.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ class NodeEvents {
NodeEvents& operator=(const NodeEvents&) = delete;
NodeEvents& operator=(NodeEvents&&) = delete;

void Emit(EventHandler& handler);
void Emit(EventHandler& handler, bool preserve_aliases);

private:
class AliasManager {
Expand All @@ -53,7 +53,7 @@ class NodeEvents {

void Setup(const detail::node& node);
void Emit(const detail::node& node, EventHandler& handler,
AliasManager& am) const;
AliasManager& am, bool preserve_aliases) const;
bool IsAliased(const detail::node& node) const;

private:
Expand Down

0 comments on commit 3de9fe4

Please sign in to comment.