Index: libcxx/src/string.cpp =================================================================== --- libcxx/src/string.cpp +++ libcxx/src/string.cpp @@ -348,10 +348,21 @@ // as_string +template +inline +S +i_to_string(P sprintf_like, const typename S::value_type* fmt, V a) +{ + constexpr size_t size = 4 * sizeof(V) + 1; // +1 for null char from swprintf + typename S::value_type buf[size] = {}; + const int len = sprintf_like(buf, size, fmt, a); + return S(buf, buf + len); +} + template inline S -as_string(P sprintf_like, S s, const typename S::value_type* fmt, V a) +f_to_string(P sprintf_like, S s, const typename S::value_type* fmt, V a) { typedef typename S::size_type size_type; size_type available = s.size(); @@ -375,47 +386,21 @@ return s; } -template ::value> -struct initial_string; - -template -struct initial_string -{ - string - operator()() const - { - string s; - s.resize(s.capacity()); - return s; - } -}; - -template -struct initial_string +inline +string initial_string() { - wstring - operator()() const - { - const size_t n = (numeric_limits::digits / 3) - + ((numeric_limits::digits % 3) != 0) - + 1; - wstring s(n, wchar_t()); - s.resize(s.capacity()); - return s; - } -}; + string s; + s.resize(s.capacity()); + return s; +} -template -struct initial_string +inline +wstring initial_wstring() { - wstring - operator()() const - { - wstring s(20, wchar_t()); - s.resize(s.capacity()); - return s; - } -}; + wstring s(20, wchar_t()); + s.resize(s.capacity()); + return s; +} typedef int (*wide_printf)(wchar_t* __restrict, size_t, const wchar_t*__restrict, ...); @@ -434,91 +419,91 @@ string to_string(int val) { - return as_string(snprintf, initial_string()(), "%d", val); + return i_to_string(snprintf, "%d", val); } string to_string(unsigned val) { - return as_string(snprintf, initial_string()(), "%u", val); + return i_to_string(snprintf, "%u", val); } string to_string(long val) { - return as_string(snprintf, initial_string()(), "%ld", val); + return i_to_string(snprintf, "%ld", val); } string to_string(unsigned long val) { - return as_string(snprintf, initial_string()(), "%lu", val); + return i_to_string(snprintf, "%lu", val); } string to_string(long long val) { - return as_string(snprintf, initial_string()(), "%lld", val); + return i_to_string(snprintf, "%lld", val); } string to_string(unsigned long long val) { - return as_string(snprintf, initial_string()(), "%llu", val); + return i_to_string(snprintf, "%llu", val); } string to_string(float val) { - return as_string(snprintf, initial_string()(), "%f", val); + return f_to_string(snprintf, initial_string(), "%f", val); } string to_string(double val) { - return as_string(snprintf, initial_string()(), "%f", val); + return f_to_string(snprintf, initial_string(), "%f", val); } string to_string(long double val) { - return as_string(snprintf, initial_string()(), "%Lf", val); + return f_to_string(snprintf, initial_string(), "%Lf", val); } wstring to_wstring(int val) { - return as_string(get_swprintf(), initial_string()(), L"%d", val); + return i_to_string(get_swprintf(), L"%d", val); } wstring to_wstring(unsigned val) { - return as_string(get_swprintf(), initial_string()(), L"%u", val); + return i_to_string(get_swprintf(), L"%u", val); } wstring to_wstring(long val) { - return as_string(get_swprintf(), initial_string()(), L"%ld", val); + return i_to_string(get_swprintf(), L"%ld", val); } wstring to_wstring(unsigned long val) { - return as_string(get_swprintf(), initial_string()(), L"%lu", val); + return i_to_string(get_swprintf(), L"%lu", val); } wstring to_wstring(long long val) { - return as_string(get_swprintf(), initial_string()(), L"%lld", val); + return i_to_string(get_swprintf(), L"%lld", val); } wstring to_wstring(unsigned long long val) { - return as_string(get_swprintf(), initial_string()(), L"%llu", val); + return i_to_string(get_swprintf(), L"%llu", val); } wstring to_wstring(float val) { - return as_string(get_swprintf(), initial_string()(), L"%f", val); + return f_to_string(get_swprintf(), initial_wstring(), L"%f", val); } wstring to_wstring(double val) { - return as_string(get_swprintf(), initial_string()(), L"%f", val); + return f_to_string(get_swprintf(), initial_wstring(), L"%f", val); } wstring to_wstring(long double val) { - return as_string(get_swprintf(), initial_string()(), L"%Lf", val); + return f_to_string(get_swprintf(), initial_wstring(), L"%Lf", val); } _LIBCPP_END_NAMESPACE_STD