#include "HTMLFormatter.h"
#include "common/escape.h"
+#include "common/StackStringStream.h"
#include "include/buffer.h"
#include <fmt/format.h>
}
}
+void JSONFormatter::add_value(std::string_view name, double val) {
+ CachedStackStringStream css;
+ if (!std::isfinite(val) || std::isnan(val)) {
+ *css << "null";
+ } else {
+ css->precision(std::numeric_limits<double>::max_digits10);
+ *css << val;
+ }
+ add_value(name, css->strv(), false);
+}
+
template <class T>
void JSONFormatter::add_value(std::string_view name, T val)
{
void print_name(std::string_view name);
void print_comma(json_formatter_stack_entry_d& entry);
void finish_pending_string();
+ void add_value(std::string_view name, double val);
template <class T>
void add_value(std::string_view name, T val);
#include "common/ceph_json.h"
#include "common/Clock.h"
+#include "common/StackStringStream.h"
#include <sstream>
EXPECT_EQ(input.sec(), output.sec());
EXPECT_EQ(input.nsec(), output.nsec());
}
+
+TEST(formatter, dump_inf_or_nan)
+{
+ JSONFormatter formatter;
+ formatter.open_object_section("inf_and_nan");
+ double inf = std::numeric_limits<double>::infinity();
+ formatter.dump_float("positive_infinity", inf);
+ formatter.dump_float("negative_infinity", -inf);
+ formatter.dump_float("nan_val", std::numeric_limits<double>::quiet_NaN());
+ formatter.dump_float("nan_val_alt", std::nan(""));
+ formatter.close_section();
+ bufferlist bl;
+ formatter.flush(bl);
+ std::cout << std::string(bl.c_str(), bl.length()) << std::endl;
+ JSONParser parser;
+ parser.parse(bl.c_str(), bl.length());
+ EXPECT_TRUE(parser.parse(bl.c_str(), bl.length()));
+ EXPECT_EQ(parser.find_obj("positive_infinity")->get_data(), "null");
+ EXPECT_EQ(parser.find_obj("negative_infinity")->get_data(), "null");
+ EXPECT_EQ(parser.find_obj("nan_val")->get_data(), "null");
+ EXPECT_EQ(parser.find_obj("nan_val_alt")->get_data(), "null");
+}