From 7f9aa35edb56cb752e6fd84dbb68d4c5dc0d370d Mon Sep 17 00:00:00 2001 From: jbeder Date: Sun, 10 Jul 2011 18:29:44 +0000 Subject: [PATCH] Fixed negative infinity parsing --- include/yaml-cpp/conversion.h | 19 +++++++++++++------ test/parsertests.cpp | 6 +++--- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/include/yaml-cpp/conversion.h b/include/yaml-cpp/conversion.h index 6009fb7..adf72d8 100644 --- a/include/yaml-cpp/conversion.h +++ b/include/yaml-cpp/conversion.h @@ -23,9 +23,11 @@ namespace YAML YAML_CPP_API bool Convert(const std::string& input, _Null& output); inline bool IsInfinity(const std::string& input) { - return input == ".inf" || input == ".Inf" || input == ".INF" || - input == "+.inf" || input == "+.Inf" || input == "+.INF" || - input == "-.inf" || input == "-.Inf" || input == "-.INF"; + return input == ".inf" || input == ".Inf" || input == ".INF" || input == "+.inf" || input == "+.Inf" || input == "+.INF"; + } + + inline bool IsNegativeInfinity(const std::string& input) { + return input == "-.inf" || input == "-.Inf" || input == "-.INF"; } inline bool IsNaN(const std::string& input) { @@ -41,9 +43,14 @@ namespace YAML if(!!stream) return true; - if(std::numeric_limits::has_infinity && IsInfinity(input)) { - output = std::numeric_limits::infinity(); - return true; + if(std::numeric_limits::has_infinity) { + if(IsInfinity(input)) { + output = std::numeric_limits::infinity(); + return true; + } else if(IsNegativeInfinity(input)) { + output = -std::numeric_limits::infinity(); + return true; + } } if(std::numeric_limits::has_quiet_NaN && IsNaN(input)) { diff --git a/test/parsertests.cpp b/test/parsertests.cpp index c5e52b9..e7da3b7 100644 --- a/test/parsertests.cpp +++ b/test/parsertests.cpp @@ -822,13 +822,13 @@ namespace Test parser.GetNextDocument(doc); for(unsigned i=0;i() != std::numeric_limits::infinity()) + if(doc[i].to() != (i < 6 ? +1 : -1) * std::numeric_limits::infinity()) return false; for(unsigned i=0;i() != std::numeric_limits::infinity()) + if(doc[i].to() != (i < 6 ? +1 : -1) * std::numeric_limits::infinity()) return false; for(unsigned i=0;i() != std::numeric_limits::infinity()) + if(doc[i].to() != (i < 6 ? +1 : -1) * std::numeric_limits::infinity()) return false; return true; }