string_conversions.cc (__to_xstring<>): New.
2008-06-17 Paolo Carlini <paolo.carlini@oracle.com> * src/string_conversions.cc (__to_xstring<>): New. (to_string, to_wstring): Use it. From-SVN: r136865
This commit is contained in:
parent
47aa9a3191
commit
c170493307
@ -1,3 +1,8 @@
|
|||||||
|
2008-06-17 Paolo Carlini <paolo.carlini@oracle.com>
|
||||||
|
|
||||||
|
* src/string_conversions.cc (__to_xstring<>): New.
|
||||||
|
(to_string, to_wstring): Use it.
|
||||||
|
|
||||||
2008-06-16 Paolo Carlini <paolo.carlini@oracle.com>
|
2008-06-16 Paolo Carlini <paolo.carlini@oracle.com>
|
||||||
|
|
||||||
* include/bits/basic_string.h (stod, stof, stoi, stol, stold, stoll,
|
* include/bits/basic_string.h (stod, stof, stoi, stol, stold, stoll,
|
||||||
|
@ -31,6 +31,7 @@
|
|||||||
#include <limits>
|
#include <limits>
|
||||||
#include <cerrno>
|
#include <cerrno>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
#include <cstdarg>
|
||||||
|
|
||||||
#ifdef _GLIBCXX_USE_C99
|
#ifdef _GLIBCXX_USE_C99
|
||||||
|
|
||||||
@ -66,6 +67,27 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
|
|||||||
return __ret;
|
return __ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Helper for the to_string / to_wstring functions.
|
||||||
|
template<typename _CharT>
|
||||||
|
inline basic_string<_CharT>
|
||||||
|
__to_xstring(int (*__convf) (_CharT*, size_t, const _CharT*, va_list),
|
||||||
|
size_t __n, const _CharT* __fmt, ...)
|
||||||
|
{
|
||||||
|
// XXX Eventually the result will be constructed in place in
|
||||||
|
// the C++0x string, likely with the help of internal hooks.
|
||||||
|
_CharT* __s = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT)
|
||||||
|
* __n));
|
||||||
|
|
||||||
|
va_list __args;
|
||||||
|
va_start(__args, __fmt);
|
||||||
|
|
||||||
|
const int __len = __convf(__s, __n, __fmt, __args);
|
||||||
|
|
||||||
|
va_end(__args);
|
||||||
|
|
||||||
|
return basic_string<_CharT>(__s, __s + __len);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
stoi(const string& __str, size_t* __idx, int __base)
|
stoi(const string& __str, size_t* __idx, int __base)
|
||||||
@ -101,30 +123,22 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
|
|||||||
stold(const string& __str, size_t* __idx)
|
stold(const string& __str, size_t* __idx)
|
||||||
{ return std::__stoa(&std::strtold, "stold", __str, __idx); }
|
{ return std::__stoa(&std::strtold, "stold", __str, __idx); }
|
||||||
|
|
||||||
|
// NB: (v)snprintf vs sprintf.
|
||||||
string
|
string
|
||||||
to_string(long long __val)
|
to_string(long long __val)
|
||||||
{
|
{ return std::__to_xstring(&std::vsnprintf, 4 * sizeof(long long),
|
||||||
// XXX Eventually the result will be constructed in place in
|
"%lld", __val); }
|
||||||
// the C++0x string, likely with the help of internal hooks.
|
|
||||||
const int __n = 4 * sizeof(long long);
|
|
||||||
char* __s = static_cast<char*>(__builtin_alloca(__n));
|
|
||||||
return string(__s, __s + std::snprintf(__s, __n, "%lld", __val));
|
|
||||||
}
|
|
||||||
|
|
||||||
string
|
string
|
||||||
to_string(unsigned long long __val)
|
to_string(unsigned long long __val)
|
||||||
{
|
{ return std::__to_xstring(&std::vsnprintf, 4 * sizeof(unsigned long long),
|
||||||
const int __n = 4 * sizeof(unsigned long long);
|
"%llu", __val); }
|
||||||
char* __s = static_cast<char*>(__builtin_alloca(__n));
|
|
||||||
return string(__s, __s + std::snprintf(__s, __n, "%llu", __val));
|
|
||||||
}
|
|
||||||
|
|
||||||
string
|
string
|
||||||
to_string(long double __val)
|
to_string(long double __val)
|
||||||
{
|
{
|
||||||
const int __n = numeric_limits<long double>::max_exponent10 + 20;
|
const int __n = numeric_limits<long double>::max_exponent10 + 20;
|
||||||
char* __s = static_cast<char*>(__builtin_alloca(__n));
|
return std::__to_xstring(&std::vsnprintf, __n, "%Lf", __val);
|
||||||
return string(__s, __s + std::snprintf(__s, __n, "%Lf", __val));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _GLIBCXX_USE_WCHAR_T
|
#ifdef _GLIBCXX_USE_WCHAR_T
|
||||||
@ -164,29 +178,19 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
|
|||||||
|
|
||||||
wstring
|
wstring
|
||||||
to_wstring(long long __val)
|
to_wstring(long long __val)
|
||||||
{
|
{ return std::__to_xstring(&std::vswprintf, 4 * sizeof(long long),
|
||||||
const int __n = 4 * sizeof(long long);
|
L"%lld", __val); }
|
||||||
wchar_t* __s = static_cast<wchar_t*>(__builtin_alloca(sizeof(wchar_t)
|
|
||||||
* __n));
|
|
||||||
return wstring(__s, __s + std::swprintf(__s, __n, L"%lld", __val));
|
|
||||||
}
|
|
||||||
|
|
||||||
wstring
|
wstring
|
||||||
to_wstring(unsigned long long __val)
|
to_wstring(unsigned long long __val)
|
||||||
{
|
{ return std::__to_xstring(&std::vswprintf, 4 * sizeof(unsigned long long),
|
||||||
const int __n = 4 * sizeof(unsigned long long);
|
L"%llu", __val); }
|
||||||
wchar_t* __s = static_cast<wchar_t*>(__builtin_alloca(sizeof(wchar_t)
|
|
||||||
* __n));
|
|
||||||
return wstring(__s, __s + std::swprintf(__s, __n, L"%llu", __val));
|
|
||||||
}
|
|
||||||
|
|
||||||
wstring
|
wstring
|
||||||
to_wstring(long double __val)
|
to_wstring(long double __val)
|
||||||
{
|
{
|
||||||
const int __n = numeric_limits<long double>::max_exponent10 + 20;
|
const int __n = numeric_limits<long double>::max_exponent10 + 20;
|
||||||
wchar_t* __s = static_cast<wchar_t*>(__builtin_alloca(sizeof(wchar_t)
|
return std::__to_xstring(&std::vswprintf, __n, L"%Lf", __val);
|
||||||
* __n));
|
|
||||||
return wstring(__s, __s + std::swprintf(__s, __n, L"%Lf", __val));
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user