diff --git a/libstdc++-v3/include/bits/basic_string.h b/libstdc++-v3/include/bits/basic_string.h index b61fe05efcf..e1fd42aea1a 100644 --- a/libstdc++-v3/include/bits/basic_string.h +++ b/libstdc++-v3/include/bits/basic_string.h @@ -3716,41 +3716,82 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 // DR 1261. Insufficent overloads for to_string / to_wstring + namespace __detail + { + template + inline unsigned + __to_string_len(_Tp __val) noexcept + { +#if _GLIBCXX_USE_CXX11_ABI + // Any 32-bit integer value fits in the 15-byte SSO buffer, + // so don't bother counting how many chars are needed. + if _GLIBCXX17_CONSTEXPR (sizeof(_Tp) * __CHAR_BIT_ <= 32) + return 9; // std::numeric_limits::digits10 + else +#endif + return __detail::__to_chars_len(__uval); + } + + inline void + __to_string_trim(string& __s) noexcept + { +#if _GLIBCXX_USE_CXX11_ABI + ??? +#endif + } + } + inline string to_string(int __val) +#if _GLIBCXX_USE_CXX11_ABI + noexcept +#endif { const bool __neg = __val < 0; const unsigned __uval = __neg ? (unsigned)~__val + 1u : __val; - const auto __len = __detail::__to_chars_len(__uval); + const auto __len = __detail::__to_string_len(__uval); string __str(__neg + __len, '-'); __detail::__to_chars_10_impl(&__str[__neg], __len, __uval); + __detail::__to_string_trim(__str); return __str; } inline string to_string(unsigned __val) +#if _GLIBCXX_USE_CXX11_ABI + noexcept +#endif { - string __str(__detail::__to_chars_len(__val), '\0'); + string __str(__detail::__to_string_len(__val), '\0'); __detail::__to_chars_10_impl(&__str[0], __str.size(), __val); + __detail::__to_string_trim(__str); return __str; } inline string to_string(long __val) +#if _GLIBCXX_USE_CXX11_ABI && __SIZEOF_LONG__ == __SIZEOF_INT__ + noexcept +#endif { const bool __neg = __val < 0; const unsigned long __uval = __neg ? (unsigned long)~__val + 1ul : __val; - const auto __len = __detail::__to_chars_len(__uval); + const auto __len = __detail::__to_string_len(__uval); string __str(__neg + __len, '-'); __detail::__to_chars_10_impl(&__str[__neg], __len, __uval); + __detail::__to_string_trim(__str); return __str; } inline string to_string(unsigned long __val) +#if _GLIBCXX_USE_CXX11_ABI && __SIZEOF_LONG__ == __SIZEOF_INT__ + noexcept +#endif { - string __str(__detail::__to_chars_len(__val), '\0'); + string __str(__detail::__to_string_len(__val), '\0'); __detail::__to_chars_10_impl(&__str[0], __str.size(), __val); + __detail::__to_string_trim(__str); return __str; }