]> git.cworth.org Git - apitrace/blobdiff - retrace/json.hpp
Dump symbolic aliases for internalFormats 1..4.
[apitrace] / retrace / json.hpp
index 14ff501f5681777a19a56b8321643d2e68239388..4ad2ab35d2fd9f270fd4c53845b4ef0293b0b422 100644 (file)
 #include <stddef.h>
 #include <wchar.h>
 
+#ifdef _MSC_VER
+#  include <float.h>
+#  define isfinite _finite
+#  define isnan _isnan
+#else
+#  include <math.h> // isfinite, isnan
+#endif
+
 #include <iomanip>
+#include <limits>
 #include <ostream>
 #include <string>
 
@@ -327,15 +336,21 @@ public:
 
     template<class T>
     inline void writeNumber(T n) {
-        if (n != n) {
-            // NaN
-            writeNull();
+        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(9) << n;
-            value = true;
-            space = ' ';
+            os << std::dec << std::setprecision(std::numeric_limits<T>::digits10 + 1) << n;
         }
+        value = true;
+        space = ' ';
     }
     
     inline void writeStringMember(const char *name, const char *s) {