From 535f81a38775b56ad1e88cbb1369ae7d3f70d60d Mon Sep 17 00:00:00 2001 From: beder Date: Tue, 13 Sep 2011 02:03:56 -0500 Subject: [PATCH] Added a convert<> specialization for YAML::_Null (so you can say node[YAML::Null]) --- include/yaml-cpp/node/convert.h | 15 +++++++++++++++ include/yaml-cpp/node/detail/impl.h | 1 + test/new-api/spectests.cpp | 15 +++++---------- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/include/yaml-cpp/node/convert.h b/include/yaml-cpp/node/convert.h index d65e363..db3cb8c 100644 --- a/include/yaml-cpp/node/convert.h +++ b/include/yaml-cpp/node/convert.h @@ -8,6 +8,7 @@ #include "yaml-cpp/node/node.h" #include "yaml-cpp/node/iterator.h" +#include "yaml-cpp/null.h" #include #include #include @@ -30,6 +31,17 @@ namespace YAML } }; + template<> + struct convert<_Null> { + static Node encode(const _Null& /* rhs */) { + return Node(); + } + + static bool decode(const Node& node, _Null& /* rhs */) { + return node.Type() == NodeType::Null; + } + }; + #define YAML_DEFINE_CONVERT_STREAMABLE(type)\ template<>\ struct convert {\ @@ -66,6 +78,7 @@ namespace YAML #undef YAML_DEFINE_CONVERT_STREAMABLE + // std::map template struct convert > { static Node encode(const std::map& rhs) { @@ -86,6 +99,7 @@ namespace YAML } }; + // std::vector template struct convert > { static Node encode(const std::vector& rhs) { @@ -106,6 +120,7 @@ namespace YAML } }; + // std::list template struct convert > { static Node encode(const std::list& rhs) { diff --git a/include/yaml-cpp/node/detail/impl.h b/include/yaml-cpp/node/detail/impl.h index eded94b..63800ca 100644 --- a/include/yaml-cpp/node/detail/impl.h +++ b/include/yaml-cpp/node/detail/impl.h @@ -132,6 +132,7 @@ namespace YAML inline node& node_data::convert_to_node(const T& rhs, shared_memory_holder pMemory) { Node value = convert::encode(rhs); + value.EnsureNodeExists(); pMemory->merge(*value.m_pMemory); return *value.m_pNode; } diff --git a/test/new-api/spectests.cpp b/test/new-api/spectests.cpp index 48e0384..5488f39 100644 --- a/test/new-api/spectests.cpp +++ b/test/new-api/spectests.cpp @@ -558,8 +558,7 @@ namespace Test YAML::Node doc = YAML::Parse(ex7_3); YAML_ASSERT(doc.size() == 2); YAML_ASSERT(doc["foo"].Type() == YAML::NodeType::Null); -// YAML_ASSERT(doc[YAML::as<.as() == "bar"); - return " null as a key not implemented"; + YAML_ASSERT(doc[YAML::Null].as() == "bar"); return true; } @@ -692,8 +691,7 @@ namespace Test YAML_ASSERT(doc.size() == 3); YAML_ASSERT(doc["explicit"].as() == "entry"); YAML_ASSERT(doc["implicit"].as() == "entry"); -// YAML_ASSERT(doc[YAML::as<.Type() == YAML::NodeType::Null); - return " null as a key not implemented"; + YAML_ASSERT(doc[YAML::Null].Type() == YAML::NodeType::Null); return true; } @@ -704,8 +702,7 @@ namespace Test YAML_ASSERT(doc["unquoted"].as() == "separate"); YAML_ASSERT(doc["http://foo.com"].Type() == YAML::NodeType::Null); YAML_ASSERT(doc["omitted value"].Type() == YAML::NodeType::Null); -// YAML_ASSERT(doc[YAML::as<.as() == "omitted key"); - return " null as a key not implemented"; + YAML_ASSERT(doc[YAML::Null].as() == "omitted key"); return true; } @@ -746,8 +743,7 @@ namespace Test YAML_ASSERT(doc[0][0]["YAML"].as() == "separate"); YAML_ASSERT(doc[1].size() == 1); YAML_ASSERT(doc[1][0].size() == 1); -// YAML_ASSERT(doc[1][0][YAML::as<.as() == "empty key entry"); - return " null as a key not implemented"; + YAML_ASSERT(doc[1][0][YAML::Null].as() == "empty key entry"); YAML_ASSERT(doc[2].size() == 1); YAML_ASSERT(doc[2][0].size() == 1); @@ -989,8 +985,7 @@ namespace Test YAML::Node doc = YAML::Parse(ex8_18); YAML_ASSERT(doc.size() == 3); YAML_ASSERT(doc["plain key"].as() == "in-line value"); -// YAML_ASSERT(doc[YAML::Null].Type() == YAML::NodeType::Null); - return " null not implemented as key"; + YAML_ASSERT(doc[YAML::Null].Type() == YAML::NodeType::Null); YAML_ASSERT(doc["quoted key"].size() == 1); YAML_ASSERT(doc["quoted key"][0].as() == "entry"); return true;