From 4ae4cb7309c07b2d8623d7e4f01efa6321441366 Mon Sep 17 00:00:00 2001 From: sfalmo <52037539+sfalmo@users.noreply.github.com> Date: Tue, 20 Sep 2022 07:31:51 +0200 Subject: [PATCH] Support conversion for std::valarray (#956) --- include/yaml-cpp/node/convert.h | 32 ++++++++++++++++++++++++++++++++ test/node/node_test.cpp | 10 ++++++++++ 2 files changed, 42 insertions(+) diff --git a/include/yaml-cpp/node/convert.h b/include/yaml-cpp/node/convert.h index 8ab0cd4..292c5d3 100644 --- a/include/yaml-cpp/node/convert.h +++ b/include/yaml-cpp/node/convert.h @@ -15,6 +15,7 @@ #include #include #include +#include #include #include "yaml-cpp/binary.h" @@ -363,6 +364,37 @@ 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 d4367c5..b501005 100644 --- a/test/node/node_test.cpp +++ b/test/node/node_test.cpp @@ -352,6 +352,16 @@ 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>(); + for (int i = 0; i < evens.size(); ++i) { + EXPECT_EQ(evens[i], actualEvens[i]); + } +} + TEST(NodeTest, StdVector) { std::vector primes; primes.push_back(2);