17a984708SDavid Chisnall //===------------------------- string.cpp ---------------------------------===//
27a984708SDavid Chisnall //
37a984708SDavid Chisnall // The LLVM Compiler Infrastructure
47a984708SDavid Chisnall //
57a984708SDavid Chisnall // This file is dual licensed under the MIT and the University of Illinois Open
67a984708SDavid Chisnall // Source Licenses. See LICENSE.TXT for details.
77a984708SDavid Chisnall //
87a984708SDavid Chisnall //===----------------------------------------------------------------------===//
97a984708SDavid Chisnall
107a984708SDavid Chisnall #include "string"
117a984708SDavid Chisnall #include "cstdlib"
127a984708SDavid Chisnall #include "cwchar"
137a984708SDavid Chisnall #include "cerrno"
144bab9fd9SDavid Chisnall #include "limits"
154bab9fd9SDavid Chisnall #include "stdexcept"
164f7ab58eSDimitry Andric #include <stdio.h>
177a984708SDavid Chisnall
187a984708SDavid Chisnall _LIBCPP_BEGIN_NAMESPACE_STD
197a984708SDavid Chisnall
20aed8d94eSDimitry Andric template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS __basic_string_common<true>;
217a984708SDavid Chisnall
22aed8d94eSDimitry Andric template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_string<char>;
23aed8d94eSDimitry Andric template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_string<wchar_t>;
247a984708SDavid Chisnall
257a984708SDavid Chisnall template
267a984708SDavid Chisnall string
277a984708SDavid Chisnall operator+<char, char_traits<char>, allocator<char> >(char const*, string const&);
287a984708SDavid Chisnall
294bab9fd9SDavid Chisnall namespace
304bab9fd9SDavid Chisnall {
314bab9fd9SDavid Chisnall
324bab9fd9SDavid Chisnall template<typename T>
334bab9fd9SDavid Chisnall inline
throw_helper(const string & msg)344bab9fd9SDavid Chisnall void throw_helper( const string& msg )
354bab9fd9SDavid Chisnall {
364bab9fd9SDavid Chisnall #ifndef _LIBCPP_NO_EXCEPTIONS
374bab9fd9SDavid Chisnall throw T( msg );
384bab9fd9SDavid Chisnall #else
39854fa44bSDimitry Andric fprintf(stderr, "%s\n", msg.c_str());
40aed8d94eSDimitry Andric _VSTD::abort();
414bab9fd9SDavid Chisnall #endif
424bab9fd9SDavid Chisnall }
434bab9fd9SDavid Chisnall
444bab9fd9SDavid Chisnall inline
throw_from_string_out_of_range(const string & func)454bab9fd9SDavid Chisnall void throw_from_string_out_of_range( const string& func )
464bab9fd9SDavid Chisnall {
474bab9fd9SDavid Chisnall throw_helper<out_of_range>(func + ": out of range");
484bab9fd9SDavid Chisnall }
494bab9fd9SDavid Chisnall
504bab9fd9SDavid Chisnall inline
throw_from_string_invalid_arg(const string & func)514bab9fd9SDavid Chisnall void throw_from_string_invalid_arg( const string& func )
524bab9fd9SDavid Chisnall {
534bab9fd9SDavid Chisnall throw_helper<invalid_argument>(func + ": no conversion");
544bab9fd9SDavid Chisnall }
554bab9fd9SDavid Chisnall
564bab9fd9SDavid Chisnall // as_integer
574bab9fd9SDavid Chisnall
584bab9fd9SDavid Chisnall template<typename V, typename S, typename F>
594bab9fd9SDavid Chisnall inline
604bab9fd9SDavid Chisnall V
as_integer_helper(const string & func,const S & str,size_t * idx,int base,F f)614bab9fd9SDavid Chisnall as_integer_helper(const string& func, const S& str, size_t* idx, int base, F f)
624bab9fd9SDavid Chisnall {
63d72607e9SDimitry Andric typename S::value_type* ptr = nullptr;
644bab9fd9SDavid Chisnall const typename S::value_type* const p = str.c_str();
654bab9fd9SDavid Chisnall typename remove_reference<decltype(errno)>::type errno_save = errno;
664bab9fd9SDavid Chisnall errno = 0;
674bab9fd9SDavid Chisnall V r = f(p, &ptr, base);
684bab9fd9SDavid Chisnall swap(errno, errno_save);
694bab9fd9SDavid Chisnall if (errno_save == ERANGE)
704bab9fd9SDavid Chisnall throw_from_string_out_of_range(func);
714bab9fd9SDavid Chisnall if (ptr == p)
724bab9fd9SDavid Chisnall throw_from_string_invalid_arg(func);
734bab9fd9SDavid Chisnall if (idx)
744bab9fd9SDavid Chisnall *idx = static_cast<size_t>(ptr - p);
754bab9fd9SDavid Chisnall return r;
764bab9fd9SDavid Chisnall }
774bab9fd9SDavid Chisnall
784bab9fd9SDavid Chisnall template<typename V, typename S>
794bab9fd9SDavid Chisnall inline
804bab9fd9SDavid Chisnall V
814bab9fd9SDavid Chisnall as_integer(const string& func, const S& s, size_t* idx, int base);
824bab9fd9SDavid Chisnall
834bab9fd9SDavid Chisnall // string
844bab9fd9SDavid Chisnall template<>
854bab9fd9SDavid Chisnall inline
864bab9fd9SDavid Chisnall int
as_integer(const string & func,const string & s,size_t * idx,int base)874bab9fd9SDavid Chisnall as_integer(const string& func, const string& s, size_t* idx, int base )
884bab9fd9SDavid Chisnall {
894f7ab58eSDimitry Andric // Use long as no Standard string to integer exists.
904bab9fd9SDavid Chisnall long r = as_integer_helper<long>( func, s, idx, base, strtol );
914bab9fd9SDavid Chisnall if (r < numeric_limits<int>::min() || numeric_limits<int>::max() < r)
924bab9fd9SDavid Chisnall throw_from_string_out_of_range(func);
934bab9fd9SDavid Chisnall return static_cast<int>(r);
944bab9fd9SDavid Chisnall }
954bab9fd9SDavid Chisnall
964bab9fd9SDavid Chisnall template<>
974bab9fd9SDavid Chisnall inline
984bab9fd9SDavid Chisnall long
as_integer(const string & func,const string & s,size_t * idx,int base)994bab9fd9SDavid Chisnall as_integer(const string& func, const string& s, size_t* idx, int base )
1004bab9fd9SDavid Chisnall {
1014bab9fd9SDavid Chisnall return as_integer_helper<long>( func, s, idx, base, strtol );
1024bab9fd9SDavid Chisnall }
1034bab9fd9SDavid Chisnall
1044bab9fd9SDavid Chisnall template<>
1054bab9fd9SDavid Chisnall inline
1064bab9fd9SDavid Chisnall unsigned long
as_integer(const string & func,const string & s,size_t * idx,int base)1074bab9fd9SDavid Chisnall as_integer( const string& func, const string& s, size_t* idx, int base )
1084bab9fd9SDavid Chisnall {
1094bab9fd9SDavid Chisnall return as_integer_helper<unsigned long>( func, s, idx, base, strtoul );
1104bab9fd9SDavid Chisnall }
1114bab9fd9SDavid Chisnall
1124bab9fd9SDavid Chisnall template<>
1134bab9fd9SDavid Chisnall inline
1144bab9fd9SDavid Chisnall long long
as_integer(const string & func,const string & s,size_t * idx,int base)1154bab9fd9SDavid Chisnall as_integer( const string& func, const string& s, size_t* idx, int base )
1164bab9fd9SDavid Chisnall {
1174bab9fd9SDavid Chisnall return as_integer_helper<long long>( func, s, idx, base, strtoll );
1184bab9fd9SDavid Chisnall }
1194bab9fd9SDavid Chisnall
1204bab9fd9SDavid Chisnall template<>
1214bab9fd9SDavid Chisnall inline
1224bab9fd9SDavid Chisnall unsigned long long
as_integer(const string & func,const string & s,size_t * idx,int base)1234bab9fd9SDavid Chisnall as_integer( const string& func, const string& s, size_t* idx, int base )
1244bab9fd9SDavid Chisnall {
1254bab9fd9SDavid Chisnall return as_integer_helper<unsigned long long>( func, s, idx, base, strtoull );
1264bab9fd9SDavid Chisnall }
1274bab9fd9SDavid Chisnall
1284bab9fd9SDavid Chisnall // wstring
1294bab9fd9SDavid Chisnall template<>
1304bab9fd9SDavid Chisnall inline
1314bab9fd9SDavid Chisnall int
as_integer(const string & func,const wstring & s,size_t * idx,int base)1324bab9fd9SDavid Chisnall as_integer( const string& func, const wstring& s, size_t* idx, int base )
1334bab9fd9SDavid Chisnall {
1344bab9fd9SDavid Chisnall // Use long as no Stantard string to integer exists.
1354bab9fd9SDavid Chisnall long r = as_integer_helper<long>( func, s, idx, base, wcstol );
1364bab9fd9SDavid Chisnall if (r < numeric_limits<int>::min() || numeric_limits<int>::max() < r)
1374bab9fd9SDavid Chisnall throw_from_string_out_of_range(func);
1384bab9fd9SDavid Chisnall return static_cast<int>(r);
1394bab9fd9SDavid Chisnall }
1404bab9fd9SDavid Chisnall
1414bab9fd9SDavid Chisnall template<>
1424bab9fd9SDavid Chisnall inline
1434bab9fd9SDavid Chisnall long
as_integer(const string & func,const wstring & s,size_t * idx,int base)1444bab9fd9SDavid Chisnall as_integer( const string& func, const wstring& s, size_t* idx, int base )
1454bab9fd9SDavid Chisnall {
1464bab9fd9SDavid Chisnall return as_integer_helper<long>( func, s, idx, base, wcstol );
1474bab9fd9SDavid Chisnall }
1484bab9fd9SDavid Chisnall
1494bab9fd9SDavid Chisnall template<>
1504bab9fd9SDavid Chisnall inline
1514bab9fd9SDavid Chisnall unsigned long
as_integer(const string & func,const wstring & s,size_t * idx,int base)1524bab9fd9SDavid Chisnall as_integer( const string& func, const wstring& s, size_t* idx, int base )
1534bab9fd9SDavid Chisnall {
1544bab9fd9SDavid Chisnall return as_integer_helper<unsigned long>( func, s, idx, base, wcstoul );
1554bab9fd9SDavid Chisnall }
1564bab9fd9SDavid Chisnall
1574bab9fd9SDavid Chisnall template<>
1584bab9fd9SDavid Chisnall inline
1594bab9fd9SDavid Chisnall long long
as_integer(const string & func,const wstring & s,size_t * idx,int base)1604bab9fd9SDavid Chisnall as_integer( const string& func, const wstring& s, size_t* idx, int base )
1614bab9fd9SDavid Chisnall {
1624bab9fd9SDavid Chisnall return as_integer_helper<long long>( func, s, idx, base, wcstoll );
1634bab9fd9SDavid Chisnall }
1644bab9fd9SDavid Chisnall
1654bab9fd9SDavid Chisnall template<>
1664bab9fd9SDavid Chisnall inline
1674bab9fd9SDavid Chisnall unsigned long long
as_integer(const string & func,const wstring & s,size_t * idx,int base)1684bab9fd9SDavid Chisnall as_integer( const string& func, const wstring& s, size_t* idx, int base )
1694bab9fd9SDavid Chisnall {
1704bab9fd9SDavid Chisnall return as_integer_helper<unsigned long long>( func, s, idx, base, wcstoull );
1714bab9fd9SDavid Chisnall }
1724bab9fd9SDavid Chisnall
1734bab9fd9SDavid Chisnall // as_float
1744bab9fd9SDavid Chisnall
1754bab9fd9SDavid Chisnall template<typename V, typename S, typename F>
1764bab9fd9SDavid Chisnall inline
1774bab9fd9SDavid Chisnall V
as_float_helper(const string & func,const S & str,size_t * idx,F f)1784bab9fd9SDavid Chisnall as_float_helper(const string& func, const S& str, size_t* idx, F f )
1794bab9fd9SDavid Chisnall {
180d72607e9SDimitry Andric typename S::value_type* ptr = nullptr;
1814bab9fd9SDavid Chisnall const typename S::value_type* const p = str.c_str();
1824bab9fd9SDavid Chisnall typename remove_reference<decltype(errno)>::type errno_save = errno;
1834bab9fd9SDavid Chisnall errno = 0;
1844bab9fd9SDavid Chisnall V r = f(p, &ptr);
1854bab9fd9SDavid Chisnall swap(errno, errno_save);
1864bab9fd9SDavid Chisnall if (errno_save == ERANGE)
1874bab9fd9SDavid Chisnall throw_from_string_out_of_range(func);
1884bab9fd9SDavid Chisnall if (ptr == p)
1894bab9fd9SDavid Chisnall throw_from_string_invalid_arg(func);
1904bab9fd9SDavid Chisnall if (idx)
1914bab9fd9SDavid Chisnall *idx = static_cast<size_t>(ptr - p);
1924bab9fd9SDavid Chisnall return r;
1934bab9fd9SDavid Chisnall }
1944bab9fd9SDavid Chisnall
1954bab9fd9SDavid Chisnall template<typename V, typename S>
1964bab9fd9SDavid Chisnall inline
1974bab9fd9SDavid Chisnall V as_float( const string& func, const S& s, size_t* idx = nullptr );
1984bab9fd9SDavid Chisnall
1994bab9fd9SDavid Chisnall template<>
2004bab9fd9SDavid Chisnall inline
2014bab9fd9SDavid Chisnall float
as_float(const string & func,const string & s,size_t * idx)2024bab9fd9SDavid Chisnall as_float( const string& func, const string& s, size_t* idx )
2034bab9fd9SDavid Chisnall {
2044bab9fd9SDavid Chisnall return as_float_helper<float>( func, s, idx, strtof );
2054bab9fd9SDavid Chisnall }
2064bab9fd9SDavid Chisnall
2074bab9fd9SDavid Chisnall template<>
2084bab9fd9SDavid Chisnall inline
2094bab9fd9SDavid Chisnall double
as_float(const string & func,const string & s,size_t * idx)2104bab9fd9SDavid Chisnall as_float(const string& func, const string& s, size_t* idx )
2114bab9fd9SDavid Chisnall {
2124bab9fd9SDavid Chisnall return as_float_helper<double>( func, s, idx, strtod );
2134bab9fd9SDavid Chisnall }
2144bab9fd9SDavid Chisnall
2154bab9fd9SDavid Chisnall template<>
2164bab9fd9SDavid Chisnall inline
2174bab9fd9SDavid Chisnall long double
as_float(const string & func,const string & s,size_t * idx)2184bab9fd9SDavid Chisnall as_float( const string& func, const string& s, size_t* idx )
2194bab9fd9SDavid Chisnall {
2204bab9fd9SDavid Chisnall return as_float_helper<long double>( func, s, idx, strtold );
2214bab9fd9SDavid Chisnall }
2224bab9fd9SDavid Chisnall
2234bab9fd9SDavid Chisnall template<>
2244bab9fd9SDavid Chisnall inline
2254bab9fd9SDavid Chisnall float
as_float(const string & func,const wstring & s,size_t * idx)2264bab9fd9SDavid Chisnall as_float( const string& func, const wstring& s, size_t* idx )
2274bab9fd9SDavid Chisnall {
2284bab9fd9SDavid Chisnall return as_float_helper<float>( func, s, idx, wcstof );
2294bab9fd9SDavid Chisnall }
2304bab9fd9SDavid Chisnall
2314bab9fd9SDavid Chisnall template<>
2324bab9fd9SDavid Chisnall inline
2334bab9fd9SDavid Chisnall double
as_float(const string & func,const wstring & s,size_t * idx)2344bab9fd9SDavid Chisnall as_float( const string& func, const wstring& s, size_t* idx )
2354bab9fd9SDavid Chisnall {
2364bab9fd9SDavid Chisnall return as_float_helper<double>( func, s, idx, wcstod );
2374bab9fd9SDavid Chisnall }
2384bab9fd9SDavid Chisnall
2394bab9fd9SDavid Chisnall template<>
2404bab9fd9SDavid Chisnall inline
2414bab9fd9SDavid Chisnall long double
as_float(const string & func,const wstring & s,size_t * idx)2424bab9fd9SDavid Chisnall as_float( const string& func, const wstring& s, size_t* idx )
2434bab9fd9SDavid Chisnall {
2444bab9fd9SDavid Chisnall return as_float_helper<long double>( func, s, idx, wcstold );
2454bab9fd9SDavid Chisnall }
2464bab9fd9SDavid Chisnall
2474bab9fd9SDavid Chisnall } // unnamed namespace
2484bab9fd9SDavid Chisnall
2497a984708SDavid Chisnall int
stoi(const string & str,size_t * idx,int base)2507a984708SDavid Chisnall stoi(const string& str, size_t* idx, int base)
2517a984708SDavid Chisnall {
2524bab9fd9SDavid Chisnall return as_integer<int>( "stoi", str, idx, base );
2537a984708SDavid Chisnall }
2547a984708SDavid Chisnall
2557a984708SDavid Chisnall int
stoi(const wstring & str,size_t * idx,int base)2567a984708SDavid Chisnall stoi(const wstring& str, size_t* idx, int base)
2577a984708SDavid Chisnall {
2584bab9fd9SDavid Chisnall return as_integer<int>( "stoi", str, idx, base );
2597a984708SDavid Chisnall }
2607a984708SDavid Chisnall
2617a984708SDavid Chisnall long
stol(const string & str,size_t * idx,int base)2627a984708SDavid Chisnall stol(const string& str, size_t* idx, int base)
2637a984708SDavid Chisnall {
2644bab9fd9SDavid Chisnall return as_integer<long>( "stol", str, idx, base );
2657a984708SDavid Chisnall }
2667a984708SDavid Chisnall
2677a984708SDavid Chisnall long
stol(const wstring & str,size_t * idx,int base)2687a984708SDavid Chisnall stol(const wstring& str, size_t* idx, int base)
2697a984708SDavid Chisnall {
2704bab9fd9SDavid Chisnall return as_integer<long>( "stol", str, idx, base );
2717a984708SDavid Chisnall }
2727a984708SDavid Chisnall
2737a984708SDavid Chisnall unsigned long
stoul(const string & str,size_t * idx,int base)2747a984708SDavid Chisnall stoul(const string& str, size_t* idx, int base)
2757a984708SDavid Chisnall {
2764bab9fd9SDavid Chisnall return as_integer<unsigned long>( "stoul", str, idx, base );
2777a984708SDavid Chisnall }
2787a984708SDavid Chisnall
2797a984708SDavid Chisnall unsigned long
stoul(const wstring & str,size_t * idx,int base)2807a984708SDavid Chisnall stoul(const wstring& str, size_t* idx, int base)
2817a984708SDavid Chisnall {
2824bab9fd9SDavid Chisnall return as_integer<unsigned long>( "stoul", str, idx, base );
2837a984708SDavid Chisnall }
2847a984708SDavid Chisnall
2857a984708SDavid Chisnall long long
stoll(const string & str,size_t * idx,int base)2867a984708SDavid Chisnall stoll(const string& str, size_t* idx, int base)
2877a984708SDavid Chisnall {
2884bab9fd9SDavid Chisnall return as_integer<long long>( "stoll", str, idx, base );
2897a984708SDavid Chisnall }
2907a984708SDavid Chisnall
2917a984708SDavid Chisnall long long
stoll(const wstring & str,size_t * idx,int base)2927a984708SDavid Chisnall stoll(const wstring& str, size_t* idx, int base)
2937a984708SDavid Chisnall {
2944bab9fd9SDavid Chisnall return as_integer<long long>( "stoll", str, idx, base );
2957a984708SDavid Chisnall }
2967a984708SDavid Chisnall
2977a984708SDavid Chisnall unsigned long long
stoull(const string & str,size_t * idx,int base)2987a984708SDavid Chisnall stoull(const string& str, size_t* idx, int base)
2997a984708SDavid Chisnall {
3004bab9fd9SDavid Chisnall return as_integer<unsigned long long>( "stoull", str, idx, base );
3017a984708SDavid Chisnall }
3027a984708SDavid Chisnall
3037a984708SDavid Chisnall unsigned long long
stoull(const wstring & str,size_t * idx,int base)3047a984708SDavid Chisnall stoull(const wstring& str, size_t* idx, int base)
3057a984708SDavid Chisnall {
3064bab9fd9SDavid Chisnall return as_integer<unsigned long long>( "stoull", str, idx, base );
3077a984708SDavid Chisnall }
3087a984708SDavid Chisnall
3097a984708SDavid Chisnall float
stof(const string & str,size_t * idx)3107a984708SDavid Chisnall stof(const string& str, size_t* idx)
3117a984708SDavid Chisnall {
3124bab9fd9SDavid Chisnall return as_float<float>( "stof", str, idx );
3137a984708SDavid Chisnall }
3147a984708SDavid Chisnall
3157a984708SDavid Chisnall float
stof(const wstring & str,size_t * idx)3167a984708SDavid Chisnall stof(const wstring& str, size_t* idx)
3177a984708SDavid Chisnall {
3184bab9fd9SDavid Chisnall return as_float<float>( "stof", str, idx );
3197a984708SDavid Chisnall }
3207a984708SDavid Chisnall
3217a984708SDavid Chisnall double
stod(const string & str,size_t * idx)3227a984708SDavid Chisnall stod(const string& str, size_t* idx)
3237a984708SDavid Chisnall {
3244bab9fd9SDavid Chisnall return as_float<double>( "stod", str, idx );
3257a984708SDavid Chisnall }
3267a984708SDavid Chisnall
3277a984708SDavid Chisnall double
stod(const wstring & str,size_t * idx)3287a984708SDavid Chisnall stod(const wstring& str, size_t* idx)
3297a984708SDavid Chisnall {
3304bab9fd9SDavid Chisnall return as_float<double>( "stod", str, idx );
3317a984708SDavid Chisnall }
3327a984708SDavid Chisnall
3337a984708SDavid Chisnall long double
stold(const string & str,size_t * idx)3347a984708SDavid Chisnall stold(const string& str, size_t* idx)
3357a984708SDavid Chisnall {
3364bab9fd9SDavid Chisnall return as_float<long double>( "stold", str, idx );
3377a984708SDavid Chisnall }
3387a984708SDavid Chisnall
3397a984708SDavid Chisnall long double
stold(const wstring & str,size_t * idx)3407a984708SDavid Chisnall stold(const wstring& str, size_t* idx)
3417a984708SDavid Chisnall {
3424bab9fd9SDavid Chisnall return as_float<long double>( "stold", str, idx );
3437a984708SDavid Chisnall }
3447a984708SDavid Chisnall
3454bab9fd9SDavid Chisnall // to_string
3464bab9fd9SDavid Chisnall
3474bab9fd9SDavid Chisnall namespace
3484bab9fd9SDavid Chisnall {
3494bab9fd9SDavid Chisnall
3504bab9fd9SDavid Chisnall // as_string
3514bab9fd9SDavid Chisnall
3524bab9fd9SDavid Chisnall template<typename S, typename P, typename V >
3534bab9fd9SDavid Chisnall inline
3544bab9fd9SDavid Chisnall S
as_string(P sprintf_like,S s,const typename S::value_type * fmt,V a)3554bab9fd9SDavid Chisnall as_string(P sprintf_like, S s, const typename S::value_type* fmt, V a)
3564bab9fd9SDavid Chisnall {
3574bab9fd9SDavid Chisnall typedef typename S::size_type size_type;
3584bab9fd9SDavid Chisnall size_type available = s.size();
3594bab9fd9SDavid Chisnall while (true)
3604bab9fd9SDavid Chisnall {
3614bab9fd9SDavid Chisnall int status = sprintf_like(&s[0], available + 1, fmt, a);
3624bab9fd9SDavid Chisnall if ( status >= 0 )
3634bab9fd9SDavid Chisnall {
3644bab9fd9SDavid Chisnall size_type used = static_cast<size_type>(status);
3654bab9fd9SDavid Chisnall if ( used <= available )
3664bab9fd9SDavid Chisnall {
3674bab9fd9SDavid Chisnall s.resize( used );
3684bab9fd9SDavid Chisnall break;
3694bab9fd9SDavid Chisnall }
3704bab9fd9SDavid Chisnall available = used; // Assume this is advice of how much space we need.
3714bab9fd9SDavid Chisnall }
3724bab9fd9SDavid Chisnall else
3734bab9fd9SDavid Chisnall available = available * 2 + 1;
3744bab9fd9SDavid Chisnall s.resize(available);
3754bab9fd9SDavid Chisnall }
3764bab9fd9SDavid Chisnall return s;
3774bab9fd9SDavid Chisnall }
3784bab9fd9SDavid Chisnall
3794bab9fd9SDavid Chisnall template <class S, class V, bool = is_floating_point<V>::value>
3804bab9fd9SDavid Chisnall struct initial_string;
3814bab9fd9SDavid Chisnall
3824bab9fd9SDavid Chisnall template <class V, bool b>
3834bab9fd9SDavid Chisnall struct initial_string<string, V, b>
3844bab9fd9SDavid Chisnall {
3854bab9fd9SDavid Chisnall string
operator ()__anon98f5c1520211::initial_string3864bab9fd9SDavid Chisnall operator()() const
3877a984708SDavid Chisnall {
3887a984708SDavid Chisnall string s;
3897a984708SDavid Chisnall s.resize(s.capacity());
3907a984708SDavid Chisnall return s;
3917a984708SDavid Chisnall }
3924bab9fd9SDavid Chisnall };
3937a984708SDavid Chisnall
3944bab9fd9SDavid Chisnall template <class V>
3954bab9fd9SDavid Chisnall struct initial_string<wstring, V, false>
3967a984708SDavid Chisnall {
3974bab9fd9SDavid Chisnall wstring
operator ()__anon98f5c1520211::initial_string3984bab9fd9SDavid Chisnall operator()() const
3997a984708SDavid Chisnall {
4007a984708SDavid Chisnall const size_t n = (numeric_limits<unsigned long long>::digits / 3)
4017a984708SDavid Chisnall + ((numeric_limits<unsigned long long>::digits % 3) != 0)
4027a984708SDavid Chisnall + 1;
4037a984708SDavid Chisnall wstring s(n, wchar_t());
4047a984708SDavid Chisnall s.resize(s.capacity());
4057a984708SDavid Chisnall return s;
4067a984708SDavid Chisnall }
4074bab9fd9SDavid Chisnall };
4084bab9fd9SDavid Chisnall
4094bab9fd9SDavid Chisnall template <class V>
4104bab9fd9SDavid Chisnall struct initial_string<wstring, V, true>
4114bab9fd9SDavid Chisnall {
4124bab9fd9SDavid Chisnall wstring
operator ()__anon98f5c1520211::initial_string4134bab9fd9SDavid Chisnall operator()() const
4144bab9fd9SDavid Chisnall {
4154bab9fd9SDavid Chisnall wstring s(20, wchar_t());
4164bab9fd9SDavid Chisnall s.resize(s.capacity());
4174bab9fd9SDavid Chisnall return s;
4184bab9fd9SDavid Chisnall }
4194bab9fd9SDavid Chisnall };
4204bab9fd9SDavid Chisnall
4214bab9fd9SDavid Chisnall typedef int (*wide_printf)(wchar_t* __restrict, size_t, const wchar_t*__restrict, ...);
4224bab9fd9SDavid Chisnall
4234bab9fd9SDavid Chisnall inline
4244bab9fd9SDavid Chisnall wide_printf
get_swprintf()4254bab9fd9SDavid Chisnall get_swprintf()
4264bab9fd9SDavid Chisnall {
4274f7ab58eSDimitry Andric #ifndef _LIBCPP_MSVCRT
4284bab9fd9SDavid Chisnall return swprintf;
4294bab9fd9SDavid Chisnall #else
430*5517e702SDimitry Andric return static_cast<int (__cdecl*)(wchar_t* __restrict, size_t, const wchar_t*__restrict, ...)>(_snwprintf);
4314bab9fd9SDavid Chisnall #endif
4324bab9fd9SDavid Chisnall }
4334bab9fd9SDavid Chisnall
4344bab9fd9SDavid Chisnall } // unnamed namespace
4354bab9fd9SDavid Chisnall
to_string(int val)4364bab9fd9SDavid Chisnall string to_string(int val)
4374bab9fd9SDavid Chisnall {
4384bab9fd9SDavid Chisnall return as_string(snprintf, initial_string<string, int>()(), "%d", val);
4394bab9fd9SDavid Chisnall }
4404bab9fd9SDavid Chisnall
to_string(unsigned val)4414bab9fd9SDavid Chisnall string to_string(unsigned val)
4424bab9fd9SDavid Chisnall {
4434bab9fd9SDavid Chisnall return as_string(snprintf, initial_string<string, unsigned>()(), "%u", val);
4444bab9fd9SDavid Chisnall }
4454bab9fd9SDavid Chisnall
to_string(long val)4464bab9fd9SDavid Chisnall string to_string(long val)
4474bab9fd9SDavid Chisnall {
4484bab9fd9SDavid Chisnall return as_string(snprintf, initial_string<string, long>()(), "%ld", val);
4494bab9fd9SDavid Chisnall }
4504bab9fd9SDavid Chisnall
to_string(unsigned long val)4514bab9fd9SDavid Chisnall string to_string(unsigned long val)
4524bab9fd9SDavid Chisnall {
4534bab9fd9SDavid Chisnall return as_string(snprintf, initial_string<string, unsigned long>()(), "%lu", val);
4544bab9fd9SDavid Chisnall }
4554bab9fd9SDavid Chisnall
to_string(long long val)4564bab9fd9SDavid Chisnall string to_string(long long val)
4574bab9fd9SDavid Chisnall {
4584bab9fd9SDavid Chisnall return as_string(snprintf, initial_string<string, long long>()(), "%lld", val);
4594bab9fd9SDavid Chisnall }
4604bab9fd9SDavid Chisnall
to_string(unsigned long long val)4614bab9fd9SDavid Chisnall string to_string(unsigned long long val)
4624bab9fd9SDavid Chisnall {
4634bab9fd9SDavid Chisnall return as_string(snprintf, initial_string<string, unsigned long long>()(), "%llu", val);
4644bab9fd9SDavid Chisnall }
4654bab9fd9SDavid Chisnall
to_string(float val)4664bab9fd9SDavid Chisnall string to_string(float val)
4674bab9fd9SDavid Chisnall {
4684bab9fd9SDavid Chisnall return as_string(snprintf, initial_string<string, float>()(), "%f", val);
4694bab9fd9SDavid Chisnall }
4704bab9fd9SDavid Chisnall
to_string(double val)4714bab9fd9SDavid Chisnall string to_string(double val)
4724bab9fd9SDavid Chisnall {
4734bab9fd9SDavid Chisnall return as_string(snprintf, initial_string<string, double>()(), "%f", val);
4744bab9fd9SDavid Chisnall }
4754bab9fd9SDavid Chisnall
to_string(long double val)4764bab9fd9SDavid Chisnall string to_string(long double val)
4774bab9fd9SDavid Chisnall {
4784bab9fd9SDavid Chisnall return as_string(snprintf, initial_string<string, long double>()(), "%Lf", val);
4794bab9fd9SDavid Chisnall }
4804bab9fd9SDavid Chisnall
to_wstring(int val)4814bab9fd9SDavid Chisnall wstring to_wstring(int val)
4824bab9fd9SDavid Chisnall {
4834bab9fd9SDavid Chisnall return as_string(get_swprintf(), initial_string<wstring, int>()(), L"%d", val);
4844bab9fd9SDavid Chisnall }
4854bab9fd9SDavid Chisnall
to_wstring(unsigned val)4864bab9fd9SDavid Chisnall wstring to_wstring(unsigned val)
4874bab9fd9SDavid Chisnall {
4884bab9fd9SDavid Chisnall return as_string(get_swprintf(), initial_string<wstring, unsigned>()(), L"%u", val);
4894bab9fd9SDavid Chisnall }
4904bab9fd9SDavid Chisnall
to_wstring(long val)4914bab9fd9SDavid Chisnall wstring to_wstring(long val)
4924bab9fd9SDavid Chisnall {
4934bab9fd9SDavid Chisnall return as_string(get_swprintf(), initial_string<wstring, long>()(), L"%ld", val);
4944bab9fd9SDavid Chisnall }
4954bab9fd9SDavid Chisnall
to_wstring(unsigned long val)4964bab9fd9SDavid Chisnall wstring to_wstring(unsigned long val)
4974bab9fd9SDavid Chisnall {
4984bab9fd9SDavid Chisnall return as_string(get_swprintf(), initial_string<wstring, unsigned long>()(), L"%lu", val);
4994bab9fd9SDavid Chisnall }
5004bab9fd9SDavid Chisnall
to_wstring(long long val)5014bab9fd9SDavid Chisnall wstring to_wstring(long long val)
5024bab9fd9SDavid Chisnall {
5034bab9fd9SDavid Chisnall return as_string(get_swprintf(), initial_string<wstring, long long>()(), L"%lld", val);
5044bab9fd9SDavid Chisnall }
5054bab9fd9SDavid Chisnall
to_wstring(unsigned long long val)5064bab9fd9SDavid Chisnall wstring to_wstring(unsigned long long val)
5074bab9fd9SDavid Chisnall {
5084bab9fd9SDavid Chisnall return as_string(get_swprintf(), initial_string<wstring, unsigned long long>()(), L"%llu", val);
5094bab9fd9SDavid Chisnall }
5107a984708SDavid Chisnall
to_wstring(float val)5117a984708SDavid Chisnall wstring to_wstring(float val)
5127a984708SDavid Chisnall {
5134bab9fd9SDavid Chisnall return as_string(get_swprintf(), initial_string<wstring, float>()(), L"%f", val);
5147a984708SDavid Chisnall }
5157a984708SDavid Chisnall
to_wstring(double val)5167a984708SDavid Chisnall wstring to_wstring(double val)
5177a984708SDavid Chisnall {
5184bab9fd9SDavid Chisnall return as_string(get_swprintf(), initial_string<wstring, double>()(), L"%f", val);
5197a984708SDavid Chisnall }
5207a984708SDavid Chisnall
to_wstring(long double val)5217a984708SDavid Chisnall wstring to_wstring(long double val)
5227a984708SDavid Chisnall {
5234bab9fd9SDavid Chisnall return as_string(get_swprintf(), initial_string<wstring, long double>()(), L"%Lf", val);
5247a984708SDavid Chisnall }
5257a984708SDavid Chisnall _LIBCPP_END_NAMESPACE_STD
526