X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=retrace%2Fjson.hpp;h=0431cf775189d4a6a85fc68d8373a431cd88ac4c;hb=45080ce539648a3fc073375cd9212b031a611f10;hp=2f50a8c55aedc28fccad91c1493031289113cc2b;hpb=c748fbcb434374ec13e14cc837ade7c581789e0c;p=apitrace diff --git a/retrace/json.hpp b/retrace/json.hpp index 2f50a8c..0431cf7 100644 --- a/retrace/json.hpp +++ b/retrace/json.hpp @@ -37,8 +37,9 @@ #ifdef _MSC_VER # include # define isfinite _finite +# define isnan _isnan #else -# include // isfinite +# include // isfinite, isnan #endif #include @@ -319,14 +320,14 @@ public: * Special case for char to prevent it to be written as a literal * character. */ - inline void writeNumber(char n) { + inline void writeInt(signed char n) { separator(); os << std::dec << static_cast(n); value = true; space = ' '; } - inline void writeNumber(unsigned char n) { + inline void writeInt(unsigned char n) { separator(); os << std::dec << static_cast(n); value = true; @@ -334,16 +335,29 @@ public: } template - inline void writeNumber(T n) { - if (!isfinite(n)) { - // NaN/Inf - writeNull(); + inline void writeInt(T n) { + separator(); + os << std::dec << n; + value = true; + space = ' '; + } + template + inline void writeFloat(T n) { + separator(); + if (isnan(n)) { + // NaN is non-standard but widely supported + os << "NaN"; + } else if (!isfinite(n)) { + // Infinite is non-standard but widely supported + if (n < 0) { + os << '-'; + } + os << "Infinity"; } else { - separator(); os << std::dec << std::setprecision(std::numeric_limits::digits10 + 1) << n; - value = true; - space = ' '; } + value = true; + space = ' '; } inline void writeStringMember(const char *name, const char *s) { @@ -359,9 +373,9 @@ public: } template - inline void writeNumberMember(const char *name, T n) { + inline void writeIntMember(const char *name, T n) { beginMember(name); - writeNumber(n); + writeInt(n); endMember(); } };