diff --git a/include/yaml-cpp/node/convert.h b/include/yaml-cpp/node/convert.h index b2f46f0..4278062 100644 --- a/include/yaml-cpp/node/convert.h +++ b/include/yaml-cpp/node/convert.h @@ -14,6 +14,7 @@ #include #include #include +#include #include #include "yaml-cpp/binary.h" @@ -336,6 +337,35 @@ struct convert> { } }; +// std::valarray +template +struct convert> { + static Node encode(const std::valarray& rhs) { + Node node(NodeType::Sequence); + for (const auto& element : rhs) { + node.push_back(element); + } + return node; + } + + static bool decode(const Node& node, std::valarray& rhs) { + if (node.IsSequence()) { + return false; + } + + rhs.resize(node.size()); + for (auto i = 0u; i < node.size(); ++i) { +#if defined(__GNUC__) && __GNUC__ < 4 + // workaround for GCC 3: + rhs[i] = node[i].template as(); +#else + rhs[i] = node[i].as(); +#endif + } + return true; + } +}; + // std::pair template struct convert> { diff --git a/test/node/node_test.cpp b/test/node/node_test.cpp index 4f577c8..b9e1927 100644 --- a/test/node/node_test.cpp +++ b/test/node/node_test.cpp @@ -351,6 +351,14 @@ TEST(NodeTest, StdArrayWrongSize) { (node["evens"].as>()), ErrorMsg::BAD_CONVERSION); } +TEST(NodeTest, StdValrray) { + std::valarray evens{{2, 4, 6, 8, 10}}; + Node node; + node["evens"] = evens; + std::valarray actualEvens = node["evens"].as>(); + EXPECT_EQ(evens, actualEvens); +} + TEST(NodeTest, StdVector) { std::vector primes; primes.push_back(2);