diff --git a/include/yaml-cpp/node/convert.h b/include/yaml-cpp/node/convert.h index 51f7d4c..902b9cd 100644 --- a/include/yaml-cpp/node/convert.h +++ b/include/yaml-cpp/node/convert.h @@ -8,10 +8,12 @@ #endif #include +#include #include #include #include #include +#include #include #include "yaml-cpp/binary.h" @@ -94,7 +96,21 @@ struct convert<_Null> { static Node encode(const type& rhs) { \ std::stringstream stream; \ stream.precision(std::numeric_limits::max_digits10); \ - stream << rhs; \ + if (std::is_floating_point::value) { \ + if (std::isnan(rhs)) { \ + stream << ".nan"; \ + } else if (std::isinf(rhs)) { \ + if (std::signbit(rhs)) { \ + stream << "-.inf"; \ + } else { \ + stream << ".inf"; \ + } \ + } else { \ + stream << rhs; \ + } \ + } else { \ + stream << rhs; \ + } \ return Node(stream.str()); \ } \ \ diff --git a/test/node/node_test.cpp b/test/node/node_test.cpp index d13a4bb..4b0e236 100644 --- a/test/node/node_test.cpp +++ b/test/node/node_test.cpp @@ -461,12 +461,66 @@ TEST(NodeTest, FloatingPrecisionFloat) { EXPECT_EQ(x, node.as()); } +TEST(NodeTest, FloatingPrecisionPositiveInfinityFloat) { + if (!std::numeric_limits::has_infinity) { + return; + } + const float x = std::numeric_limits::infinity(); + Node node = Node(x); + EXPECT_EQ(x, node.as()); +} + +TEST(NodeTest, FloatingPrecisionNegativeInfinityFloat) { + if (!std::numeric_limits::has_infinity) { + return; + } + const float x = -std::numeric_limits::infinity(); + Node node = Node(x); + EXPECT_EQ(x, node.as()); +} + +TEST(NodeTest, FloatingPrecisionNanFloat) { + if (!std::numeric_limits::has_quiet_NaN) { + return; + } + const float x = std::numeric_limits::quiet_NaN(); + Node node = Node(x); + EXPECT_TRUE(std::isnan(node.as())); +} + TEST(NodeTest, FloatingPrecisionDouble) { const double x = 0.123456789; Node node = Node(x); EXPECT_EQ(x, node.as()); } +TEST(NodeTest, FloatingPrecisionPositiveInfinityDouble) { + if (!std::numeric_limits::has_infinity) { + return; + } + const double x = std::numeric_limits::infinity(); + Node node = Node(x); + EXPECT_EQ(x, node.as()); +} + +TEST(NodeTest, FloatingPrecisionNegativeInfinityDouble) { + if (!std::numeric_limits::has_infinity) { + return; + } + const double x = -std::numeric_limits::infinity(); + Node node = Node(x); + EXPECT_EQ(x, node.as()); +} + +TEST(NodeTest, FloatingPrecisionNanDouble) { + if (!std::numeric_limits::has_quiet_NaN) { + return; + } + const double x = std::numeric_limits::quiet_NaN(); + Node node = Node(x); + EXPECT_TRUE(std::isnan(node.as())); +} + TEST(NodeTest, SpaceChar) { Node node = Node(' '); EXPECT_EQ(' ', node.as());