diff --git a/include/yaml-cpp/node/impl.h b/include/yaml-cpp/node/impl.h index 773847eab..4190b5343 100644 --- a/include/yaml-cpp/node/impl.h +++ b/include/yaml-cpp/node/impl.h @@ -394,6 +394,12 @@ inline void Node::force_insert(const Key& key, const Value& value) { m_pNode->force_insert(key, value, m_pMemory); } +template +inline bool Node::contains(const Key& key) const { + EnsureNodeExists(); + return ((const detail::node*)m_pNode)->get(key, m_pMemory) != nullptr; +} + // free functions inline bool operator==(const Node& lhs, const Node& rhs) { return lhs.is(rhs); } } // namespace YAML diff --git a/include/yaml-cpp/node/node.h b/include/yaml-cpp/node/node.h index df55f5846..93661209d 100644 --- a/include/yaml-cpp/node/node.h +++ b/include/yaml-cpp/node/node.h @@ -114,6 +114,9 @@ class YAML_CPP_API Node { template void force_insert(const Key& key, const Value& value); + template + bool contains(const Key& key) const; + private: enum Zombie { ZombieNode }; explicit Node(Zombie); diff --git a/test/node/node_test.cpp b/test/node/node_test.cpp index 6df7df1c9..b53c28566 100644 --- a/test/node/node_test.cpp +++ b/test/node/node_test.cpp @@ -199,6 +199,31 @@ TEST(NodeTest, MissingKey) { EXPECT_THROW(node["bar"].as(), InvalidNode); } +TEST(NodeTest, MapContains) { + Node node, key; + node["foo"] = "value"; + node["bar"] = "eulav"; + node[1] = "hello"; + key["test"] = "asdf"; + key["test2"] = "ghjkl"; + node[key] = 123; + EXPECT_TRUE(node.contains("foo")); + EXPECT_TRUE(node.contains("bar")); + EXPECT_TRUE(node.contains(1)); + EXPECT_TRUE(node.contains(key)); + EXPECT_TRUE(!node.contains("baz")); + EXPECT_TRUE(!node.contains(2)); + + node.remove("foo"); + node.remove(key); + EXPECT_TRUE(!node.contains("foo")); + EXPECT_TRUE(node.contains("bar")); + EXPECT_TRUE(node.contains(1)); + EXPECT_TRUE(!node.contains(key)); + EXPECT_TRUE(!node.contains("baz")); + EXPECT_TRUE(!node.contains(2)); +} + TEST(NodeTest, MapIntegerElementRemoval) { Node node; node[1] = "hello";