Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions include/yaml-cpp/node/detail/node.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ namespace YAML {
namespace detail {
class node {
public:
friend struct std::hash<node>;

node() : m_pRef(new node_ref), m_dependencies{} {}
node(const node&) = delete;
node& operator=(const node&) = delete;
Expand Down
23 changes: 23 additions & 0 deletions include/yaml-cpp/node/hash.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#ifndef NODE_HASH_H_62B23520_7C8E_11DE_8A39_0800200C9A66
#define NODE_HASH_H_62B23520_7C8E_11DE_8A39_0800200C9A66

#include "yaml-cpp/node/detail/node.h"
#include "yaml-cpp/node/node.h"

namespace std {
template <>
struct hash<YAML::detail::node> {
size_t operator()(const YAML::detail::node& key) const noexcept {
return hash<YAML::detail::shared_node_ref>()(key.m_pRef);
}
};

template <>
struct hash<YAML::Node> {
size_t operator()(const YAML::Node& key) const noexcept {
return hash<YAML::detail::node>()(*key.m_pNode);
}
};
} // namespace std

#endif // NODE_HASH_H_62B23520_7C8E_11DE_8A39_0800200C9A66
1 change: 1 addition & 0 deletions include/yaml-cpp/node/node.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ class YAML_CPP_API Node {
friend class detail::iterator_base;
template <typename T, typename S>
friend struct as_if;
friend struct std::hash<Node>;

typedef YAML::iterator iterator;
typedef YAML::const_iterator const_iterator;
Expand Down
1 change: 1 addition & 0 deletions include/yaml-cpp/yaml.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,6 @@
#include "yaml-cpp/node/detail/impl.h"
#include "yaml-cpp/node/parse.h"
#include "yaml-cpp/node/emit.h"
#include "yaml-cpp/node/hash.h"

#endif // YAML_H_62B23520_7C8E_11DE_8A39_0800200C9A66
12 changes: 12 additions & 0 deletions test/node/node_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include "yaml-cpp/node/convert.h"
#include "yaml-cpp/node/detail/impl.h"
#include "yaml-cpp/node/emit.h"
#include "yaml-cpp/node/hash.h"
#include "yaml-cpp/node/impl.h"
#include "yaml-cpp/node/iterator.h"

Expand Down Expand Up @@ -437,6 +438,17 @@ TEST(NodeTest, AccessNonexistentKeyOnConstNode) {
ASSERT_FALSE(other["5"]);
}

TEST(NodeTest, NodeIsHashable) {
YAML::Node node1(YAML::NodeType::value::Null);
YAML::Node node2(YAML::NodeType::value::Null);
YAML::Node node3 = node1;
std::hash<YAML::Node> hash_func;
auto node1_digest = hash_func(node1);
ASSERT_EQ(hash_func(node1), node1_digest);
ASSERT_NE(hash_func(node2), node1_digest);
ASSERT_EQ(hash_func(node3), node1_digest);
}

class NodeEmitterTest : public ::testing::Test {
protected:
void ExpectOutput(const std::string& output, const Node& node) {
Expand Down