Skip to content

Commit 4ae4cb7

Browse files
authored
Support conversion for std::valarray (#956)
1 parent 97ebcf0 commit 4ae4cb7

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

include/yaml-cpp/node/convert.h

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <unordered_map>
1616
#include <sstream>
1717
#include <type_traits>
18+
#include <valarray>
1819
#include <vector>
1920

2021
#include "yaml-cpp/binary.h"
@@ -363,6 +364,37 @@ struct convert<std::array<T, N>> {
363364
}
364365
};
365366

367+
368+
// std::valarray
369+
template <typename T>
370+
struct convert<std::valarray<T>> {
371+
static Node encode(const std::valarray<T>& rhs) {
372+
Node node(NodeType::Sequence);
373+
for (const auto& element : rhs) {
374+
node.push_back(element);
375+
}
376+
return node;
377+
}
378+
379+
static bool decode(const Node& node, std::valarray<T>& rhs) {
380+
if (!node.IsSequence()) {
381+
return false;
382+
}
383+
384+
rhs.resize(node.size());
385+
for (auto i = 0u; i < node.size(); ++i) {
386+
#if defined(__GNUC__) && __GNUC__ < 4
387+
// workaround for GCC 3:
388+
rhs[i] = node[i].template as<T>();
389+
#else
390+
rhs[i] = node[i].as<T>();
391+
#endif
392+
}
393+
return true;
394+
}
395+
};
396+
397+
366398
// std::pair
367399
template <typename T, typename U>
368400
struct convert<std::pair<T, U>> {

test/node/node_test.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,16 @@ TEST(NodeTest, StdArrayWrongSize) {
352352
(node["evens"].as<std::array<int, 5>>()), ErrorMsg::BAD_CONVERSION);
353353
}
354354

355+
TEST(NodeTest, StdValrray) {
356+
std::valarray<int> evens{{2, 4, 6, 8, 10}};
357+
Node node;
358+
node["evens"] = evens;
359+
std::valarray<int> actualEvens = node["evens"].as<std::valarray<int>>();
360+
for (int i = 0; i < evens.size(); ++i) {
361+
EXPECT_EQ(evens[i], actualEvens[i]);
362+
}
363+
}
364+
355365
TEST(NodeTest, StdVector) {
356366
std::vector<int> primes;
357367
primes.push_back(2);

0 commit comments

Comments
 (0)