| diff -u a/googletest/include/gtest/gtest-printers.h b/googletest/include/gtest/gtest-printers.h |
| --- a/googletest/include/gtest/gtest-printers.h |
| +++ b/googletest/include/gtest/gtest-printers.h |
| @@ -479,6 +479,12 @@ inline void PrintTo(char8_t c, ::std::ostream* os) { |
| } |
| #endif |
| |
| +// gcc/clang __{u,}int128_t |
| +#if defined(__SIZEOF_INT128__) |
| +GTEST_API_ void PrintTo(__uint128_t v, ::std::ostream* os); |
| +GTEST_API_ void PrintTo(__int128_t v, ::std::ostream* os); |
| +#endif // __SIZEOF_INT128__ |
| + |
| // Overloads for C strings. |
| GTEST_API_ void PrintTo(const char* s, ::std::ostream* os); |
| inline void PrintTo(char* s, ::std::ostream* os) { |
| diff -u a/googletest/src/gtest-printers.cc b/googletest/src/gtest-printers.cc |
| --- a/googletest/src/gtest-printers.cc |
| +++ b/googletest/src/gtest-printers.cc |
| @@ -304,6 +304,51 @@ void PrintTo(char32_t c, ::std::ostream* os) { |
| << static_cast<uint32_t>(c); |
| } |
| |
| +// gcc/clang __{u,}int128_t |
| +#if defined(__SIZEOF_INT128__) |
| +void PrintTo(__uint128_t v, ::std::ostream* os) { |
| + if (v == 0) { |
| + *os << "0"; |
| + return; |
| + } |
| + |
| + // Buffer large enough for ceil(log10(2^128))==39 and the null terminator |
| + char buf[40]; |
| + char* p = buf + sizeof(buf); |
| + |
| + // Some configurations have a __uint128_t, but no support for built in |
| + // division. Do manual long division instead. |
| + |
| + uint64_t high = static_cast<uint64_t>(v >> 64); |
| + uint64_t low = static_cast<uint64_t>(v); |
| + |
| + *--p = 0; |
| + while (high != 0 || low != 0) { |
| + uint64_t high_mod = high % 10; |
| + high = high / 10; |
| + // This is the long division algorithm specialized for a divisor of 10 and |
| + // only two elements. |
| + // Notable values: |
| + // 2^64 / 10 == 1844674407370955161 |
| + // 2^64 % 10 == 6 |
| + const uint64_t carry = 6 * high_mod + low % 10; |
| + low = low / 10 + high_mod * 1844674407370955161 + carry / 10; |
| + |
| + char digit = static_cast<char>(carry % 10); |
| + *--p = '0' + digit; |
| + } |
| + *os << p; |
| +} |
| +void PrintTo(__int128_t v, ::std::ostream* os) { |
| + __uint128_t uv = static_cast<__uint128_t>(v); |
| + if (v < 0) { |
| + *os << "-"; |
| + uv = -uv; |
| + } |
| + PrintTo(uv, os); |
| +} |
| +#endif // __SIZEOF_INT128__ |
| + |
| // Prints the given array of characters to the ostream. CharType must be either |
| // char, char8_t, char16_t, char32_t, or wchar_t. |
| // The array starts at begin, the length is len, it may include '\0' characters |