diff --git a/include/yaml-cpp/node/convert.h b/include/yaml-cpp/node/convert.h index 146067b..1010d7e 100644 --- a/include/yaml-cpp/node/convert.h +++ b/include/yaml-cpp/node/convert.h @@ -223,6 +223,38 @@ namespace YAML } }; + // std::pair + template + struct convert > { + static Node encode(const std::pair& rhs) { + Node node(NodeType::Sequence); + node.push_back(rhs.first); + node.push_back(rhs.second); + return node; + } + + static bool decode(const Node& node, std::pair& rhs) { + if(!node.IsSequence()) + return false; + if (node.size() != 2) + return false; + +#if defined(__GNUC__) && __GNUC__ < 4 +//workaround for GCC 3: + rhs.first = node[0].template as(); +#else + rhs.first = node[0].as(); +#endif +#if defined(__GNUC__) && __GNUC__ < 4 +//workaround for GCC 3: + rhs.second = node[1].template as(); +#else + rhs.second = node[1].as(); +#endif + return true; + } + }; + // binary template<> struct convert { diff --git a/test/new-api/nodetests.cpp b/test/new-api/nodetests.cpp index 394a04a..455709a 100644 --- a/test/new-api/nodetests.cpp +++ b/test/new-api/nodetests.cpp @@ -168,7 +168,19 @@ namespace Test return true; } - TEST SimpleAlias() + TEST StdPair() + { + std::pair p; + p.first = 5; + p.second = "five"; + + YAML::Node node; + node["pair"] = p; + YAML_ASSERT((node["pair"].as >() == p)); + return true; + } + + TEST SimpleAlias() { YAML::Node node; node["foo"] = "value"; @@ -463,8 +475,9 @@ namespace Test TEST ret; try { ret = test(); - } catch(...) { + } catch(const std::exception& e) { ret.ok = false; + ret.error = e.what(); } if(ret.ok) { passed++; @@ -492,6 +505,7 @@ namespace Test RunNodeTest(&Node::StdVector, "std::vector", passed, total); RunNodeTest(&Node::StdList, "std::list", passed, total); RunNodeTest(&Node::StdMap, "std::map", passed, total); + RunNodeTest(&Node::StdPair, "std::pair", passed, total); RunNodeTest(&Node::SimpleAlias, "simple alias", passed, total); RunNodeTest(&Node::AliasAsKey, "alias as key", passed, total); RunNodeTest(&Node::SelfReferenceSequence, "self reference sequence", passed, total);