aboutsummaryrefslogtreecommitdiff
path: root/zencore/compactbinary.cpp
diff options
context:
space:
mode:
authorMartin Ridgers <[email protected]>2021-10-07 08:29:50 +0200
committerMartin Ridgers <[email protected]>2021-10-07 08:29:50 +0200
commit03232621d183f22e12e798a753e4a606763e63d6 (patch)
tree5701d202392dd4ab947139e4046a44ab9bc6cdf7 /zencore/compactbinary.cpp
parentMerged main (diff)
parentOnly enable the MSVC debug output sink for sessions when the --debug mode is ... (diff)
downloadzen-03232621d183f22e12e798a753e4a606763e63d6.tar.xz
zen-03232621d183f22e12e798a753e4a606763e63d6.zip
Merged main
Diffstat (limited to 'zencore/compactbinary.cpp')
-rw-r--r--zencore/compactbinary.cpp51
1 files changed, 48 insertions, 3 deletions
diff --git a/zencore/compactbinary.cpp b/zencore/compactbinary.cpp
index f3fbf312c..2ce6987d2 100644
--- a/zencore/compactbinary.cpp
+++ b/zencore/compactbinary.cpp
@@ -1474,10 +1474,30 @@ public:
Builder << Accessor.AsIntegerNegative();
break;
case CbFieldType::Float32:
- Builder.Append("{:.9g}"_format(Accessor.AsFloat32()));
+ {
+ const float Value = Accessor.AsFloat32();
+ if (std::isfinite(Value))
+ {
+ Builder.Append("{:.9g}"_format(Value));
+ }
+ else
+ {
+ Builder << "null"sv;
+ }
+ }
break;
case CbFieldType::Float64:
- Builder.Append("{:.17g}"_format(Accessor.AsFloat64()));
+ {
+ const double Value = Accessor.AsFloat64();
+ if (std::isfinite(Value))
+ {
+ Builder.Append("{:.17g}"_format(Value));
+ }
+ else
+ {
+ Builder << "null"sv;
+ }
+ }
break;
case CbFieldType::BoolFalse:
Builder << "false"sv;
@@ -1834,7 +1854,7 @@ TEST_CASE("uson.json")
SUBCASE("number")
{
- const double ExpectedFloatValue = 21.21f;
+ const float ExpectedFloatValue = 21.21f;
const double ExpectedDoubleValue = 42.42;
CbObjectWriter Writer;
@@ -1856,6 +1876,31 @@ TEST_CASE("uson.json")
CHECK(FloatValue == doctest::Approx(ExpectedFloatValue));
CHECK(DoubleValue == doctest::Approx(ExpectedDoubleValue));
}
+
+ SUBCASE("number.nan")
+ {
+ const float FloatNan = std::numeric_limits<float>::quiet_NaN();
+ const double DoubleNan = std::numeric_limits<double>::quiet_NaN();
+
+ CbObjectWriter Writer;
+ Writer << "FloatNan" << FloatNan;
+ Writer << "DoubleNan" << DoubleNan;
+
+ CbObject Obj = Writer.Save();
+
+ StringBuilder<128> Sb;
+ const std::string_view JsonText = Obj.ToJson(Sb).ToView();
+
+ std::string JsonError;
+ json11::Json Json = json11::Json::parse(JsonText.data(), JsonError);
+
+ const double FloatValue = Json["FloatNan"].number_value();
+ const double DoubleValue = Json["DoubleNan"].number_value();
+
+ CHECK(JsonError.empty());
+ CHECK(FloatValue == 0);
+ CHECK(DoubleValue == 0);
+ }
}
#endif