diff --git a/include/yaml-cpp/node/convert.h b/include/yaml-cpp/node/convert.h index 596898d..21619a4 100644 --- a/include/yaml-cpp/node/convert.h +++ b/include/yaml-cpp/node/convert.h @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -251,6 +252,32 @@ struct convert> { } }; +// std::unordered_map +template +struct convert> { + static Node encode(const std::unordered_map& rhs) { + Node node(NodeType::Map); + for (const auto& element : rhs) + node.force_insert(element.first, element.second); + return node; + } + + static bool decode(const Node& node, std::unordered_map& rhs) { + if (!node.IsMap()) + return false; + + rhs.clear(); + for (const auto& element : node) +#if defined(__GNUC__) && __GNUC__ < 4 + // workaround for GCC 3: + rhs[element.first.template as()] = element.second.template as(); +#else + rhs[element.first.as()] = element.second.as(); +#endif + return true; + } +}; + // std::vector template struct convert> { diff --git a/test/node/node_test.cpp b/test/node/node_test.cpp index 4f577c8..d4367c5 100644 --- a/test/node/node_test.cpp +++ b/test/node/node_test.cpp @@ -40,6 +40,7 @@ class CustomAllocator : public std::allocator { template using CustomVector = std::vector>; template using CustomList = std::list>; template > using CustomMap = std::map>>; +template , class P=std::equal_to> using CustomUnorderedMap = std::unordered_map>>; } // anonymous namespace @@ -435,6 +436,34 @@ TEST(NodeTest, StdMapWithCustomAllocator) { EXPECT_EQ(squares, actualSquares); } +TEST(NodeTest, StdUnorderedMap) { + std::unordered_map squares; + squares[0] = 0; + squares[1] = 1; + squares[2] = 4; + squares[3] = 9; + squares[4] = 16; + + Node node; + node["squares"] = squares; + std::unordered_map actualSquares = node["squares"].as>(); + EXPECT_EQ(squares, actualSquares); +} + +TEST(NodeTest, StdUnorderedMapWithCustomAllocator) { + CustomUnorderedMap squares; + squares[0] = 0; + squares[1] = 1; + squares[2] = 4; + squares[3] = 9; + squares[4] = 16; + + Node node; + node["squares"] = squares; + CustomUnorderedMap actualSquares = node["squares"].as>(); + EXPECT_EQ(squares, actualSquares); +} + TEST(NodeTest, StdPair) { std::pair p; p.first = 5;