Commit 774a4aa2 authored by miloyip's avatar miloyip

Fix VC2010 which don't have std::isnan() et al.

parent 86d63ff1
...@@ -31,6 +31,36 @@ RAPIDJSON_DIAG_PUSH ...@@ -31,6 +31,36 @@ RAPIDJSON_DIAG_PUSH
RAPIDJSON_DIAG_OFF(effc++) RAPIDJSON_DIAG_OFF(effc++)
#endif #endif
// Implement functions that may not be provided pre-C++11
bool IsNan(double x) {
union {
double x;
uint64_t u;
}u = { x };
// E == 0x7FF && M != 0
return (u.u & RAPIDJSON_UINT64_C2(0x7FF00000, 0x00000000)) == RAPIDJSON_UINT64_C2(0x7FF00000, 0x00000000) &&
(u.u & RAPIDJSON_UINT64_C2(0x000FFFFF, 0xFFFFFFFF)) != 0;
}
bool IsInf(double x) {
union {
double x;
uint64_t u;
}u = { x };
// E = 0x7FF and M == 0
return (u.u & RAPIDJSON_UINT64_C2(0x7FFFFFFF, 0xFFFFFFFF)) == RAPIDJSON_UINT64_C2(0x7FF00000, 0x00000000);
}
bool IsNormal(double x) {
union {
double x;
uint64_t u;
}u = { x };
// E != 0 || M == 0
return (u.u & RAPIDJSON_UINT64_C2(0x7FF00000, 0x00000000)) != 0 ||
(u.u & RAPIDJSON_UINT64_C2(0x000FFFFF, 0xFFFFFFFF)) == 0;
}
template<bool expect> template<bool expect>
struct ParseBoolHandler : BaseReaderHandler<UTF8<>, ParseBoolHandler<expect> > { struct ParseBoolHandler : BaseReaderHandler<UTF8<>, ParseBoolHandler<expect> > {
ParseBoolHandler() : step_(0) {} ParseBoolHandler() : step_(0) {}
...@@ -120,13 +150,13 @@ TEST(Reader, ParseNumber_Integer) { ...@@ -120,13 +150,13 @@ TEST(Reader, ParseNumber_Integer) {
TEST_INTEGER(ParseUintHandler, "4294967295", 4294967295u); TEST_INTEGER(ParseUintHandler, "4294967295", 4294967295u);
TEST_INTEGER(ParseIntHandler, "-123", -123); TEST_INTEGER(ParseIntHandler, "-123", -123);
TEST_INTEGER(ParseIntHandler, "-2147483648", -2147483648LL); // -2^31 (min of int) TEST_INTEGER(ParseIntHandler, "-2147483648", static_cast<int32_t>(0x80000000)); // -2^31 (min of int)
TEST_INTEGER(ParseUint64Handler, "4294967296", 4294967296ULL); // 2^32 (max of unsigned + 1, force to use uint64_t) TEST_INTEGER(ParseUint64Handler, "4294967296", RAPIDJSON_UINT64_C2(1, 0)); // 2^32 (max of unsigned + 1, force to use uint64_t)
TEST_INTEGER(ParseUint64Handler, "18446744073709551615", 18446744073709551615ULL); // 2^64 - 1 (max of uint64_t) TEST_INTEGER(ParseUint64Handler, "18446744073709551615", RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0xFFFFFFFF)); // 2^64 - 1 (max of uint64_t)
TEST_INTEGER(ParseInt64Handler, "-2147483649", -2147483649LL); // -2^31 -1 (min of int - 1, force to use int64_t) TEST_INTEGER(ParseInt64Handler, "-2147483649", static_cast<int64_t>(RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x7FFFFFFF))); // -2^31 -1 (min of int - 1, force to use int64_t)
TEST_INTEGER(ParseInt64Handler, "-9223372036854775808", (-9223372036854775807LL - 1)); // -2^63 (min of int64_t) TEST_INTEGER(ParseInt64Handler, "-9223372036854775808", static_cast<int64_t>(RAPIDJSON_UINT64_C2(0x80000000, 0x00000000))); // -2^63 (min of int64_t)
// Random test for uint32_t/int32_t // Random test for uint32_t/int32_t
{ {
...@@ -246,7 +276,7 @@ static void TestParseDouble() { ...@@ -246,7 +276,7 @@ static void TestParseDouble() {
// Need to call r() in two statements for cross-platform coherent sequence. // Need to call r() in two statements for cross-platform coherent sequence.
u.u = uint64_t(r()) << 32; u.u = uint64_t(r()) << 32;
u.u |= uint64_t(r()); u.u |= uint64_t(r());
} while (std::isnan(u.d) || std::isinf(u.d) || !std::isnormal(u.d)); } while (IsNan(u.d) || IsInf(u.d) || !IsNormal(u.d));
char buffer[32]; char buffer[32];
*internal::dtoa(u.d, buffer) = '\0'; *internal::dtoa(u.d, buffer) = '\0';
...@@ -290,7 +320,7 @@ TEST(Reader, ParseNumber_NormalPrecisionError) { ...@@ -290,7 +320,7 @@ TEST(Reader, ParseNumber_NormalPrecisionError) {
// Need to call r() in two statements for cross-platform coherent sequence. // Need to call r() in two statements for cross-platform coherent sequence.
u.u = uint64_t(r()) << 32; u.u = uint64_t(r()) << 32;
u.u |= uint64_t(r()); u.u |= uint64_t(r());
} while (std::isnan(u.d) || std::isinf(u.d) || !std::isnormal(u.d)); } while (IsNan(u.d) || IsInf(u.d) || !IsNormal(u.d));
char buffer[32]; char buffer[32];
*internal::dtoa(u.d, buffer) = '\0'; *internal::dtoa(u.d, buffer) = '\0';
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment