1a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant//===------------------------- string.cpp ---------------------------------===// 2a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant// 3a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant// The LLVM Compiler Infrastructure 4a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant// 5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 7a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant// 8a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant//===----------------------------------------------------------------------===// 9a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 1004a2c71d674a261e65d5afc603b7a3efa77e88efHoward Hinnant#define _LIBCPP_EXTERN_TEMPLATE(...) extern template __VA_ARGS__; 1104a2c71d674a261e65d5afc603b7a3efa77e88efHoward Hinnant 12a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant#include "string" 13a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant#include "cstdlib" 14a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant#include "cwchar" 15a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant#include "cerrno" 169e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant#include "limits" 179e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant#include "stdexcept" 18e9df0a5c6c864f1ea86486881a3ee559c56105e7Howard Hinnant#ifdef _LIBCPP_MSVCRT 196cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant#include "support/win32/support.h" 20e9df0a5c6c864f1ea86486881a3ee559c56105e7Howard Hinnant#endif // _LIBCPP_MSVCRT 21ed14a76beba8f2a0e30f5c66d327d60f87a75921Howard Hinnant#include <stdio.h> 22a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 23a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 24a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 25a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnanttemplate class __basic_string_common<true>; 26a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 27a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnanttemplate class basic_string<char>; 28a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnanttemplate class basic_string<wchar_t>; 29a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 30a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnanttemplate 31a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant string 32a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant operator+<char, char_traits<char>, allocator<char> >(char const*, string const&); 33a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 349e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantnamespace 359e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{ 369e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 379e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<typename T> 389e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline 399e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantvoid throw_helper( const string& msg ) 409e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{ 419e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 429e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant throw T( msg ); 439e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant#else 44ed14a76beba8f2a0e30f5c66d327d60f87a75921Howard Hinnant printf("%s\n", msg.c_str()); 459e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant abort(); 469e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant#endif 479e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant} 489e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 499e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline 509e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantvoid throw_from_string_out_of_range( const string& func ) 519e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{ 529e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant throw_helper<out_of_range>(func + ": out of range"); 539e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant} 549e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 559e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline 569e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantvoid throw_from_string_invalid_arg( const string& func ) 579e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{ 589e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant throw_helper<invalid_argument>(func + ": no conversion"); 599e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant} 609e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 619e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant// as_integer 629e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 639e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<typename V, typename S, typename F> 649e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline 659e98b34a8c03460dacab05068d900dd424e45e53Howard HinnantV 669e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_integer_helper(const string& func, const S& str, size_t* idx, int base, F f) 67a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{ 689e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant typename S::value_type* ptr; 699e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant const typename S::value_type* const p = str.c_str(); 7054e2fff2e1e3b2b4c317651bbbf1aadc27b1e378Howard Hinnant typename remove_reference<decltype(errno)>::type errno_save = errno; 713e3ae9ec4186fd968903ec94613bcea96ab31e56Howard Hinnant errno = 0; 729e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant V r = f(p, &ptr, base); 733e3ae9ec4186fd968903ec94613bcea96ab31e56Howard Hinnant swap(errno, errno_save); 749e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant if (errno_save == ERANGE) 759e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant throw_from_string_out_of_range(func); 763e3ae9ec4186fd968903ec94613bcea96ab31e56Howard Hinnant if (ptr == p) 779e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant throw_from_string_invalid_arg(func); 78a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant if (idx) 79a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant *idx = static_cast<size_t>(ptr - p); 809e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return r; 819e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant} 829e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 839e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<typename V, typename S> 849e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline 859e98b34a8c03460dacab05068d900dd424e45e53Howard HinnantV 869e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_integer(const string& func, const S& s, size_t* idx, int base); 879e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 889e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant// string 899e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<> 909e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline 919e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantint 929e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_integer(const string& func, const string& s, size_t* idx, int base ) 939e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{ 94bd64f140d4ebac5324a03d75c6d5d9b114dafc6bJoerg Sonnenberger // Use long as no Standard string to integer exists. 959e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant long r = as_integer_helper<long>( func, s, idx, base, strtol ); 969e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant if (r < numeric_limits<int>::min() || numeric_limits<int>::max() < r) 979e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant throw_from_string_out_of_range(func); 98a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant return static_cast<int>(r); 99a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant} 100a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 1019e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<> 1029e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline 1039e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantlong 1049e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_integer(const string& func, const string& s, size_t* idx, int base ) 1059e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{ 1069e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_integer_helper<long>( func, s, idx, base, strtol ); 1079e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant} 1089e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 1099e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<> 1109e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline 1119e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantunsigned long 1129e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_integer( const string& func, const string& s, size_t* idx, int base ) 1139e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{ 1149e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_integer_helper<unsigned long>( func, s, idx, base, strtoul ); 1159e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant} 1169e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 1179e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<> 1189e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline 1199e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantlong long 1209e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_integer( const string& func, const string& s, size_t* idx, int base ) 1219e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{ 1229e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_integer_helper<long long>( func, s, idx, base, strtoll ); 1239e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant} 1249e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 1259e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<> 1269e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline 1279e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantunsigned long long 1289e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_integer( const string& func, const string& s, size_t* idx, int base ) 1299e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{ 1309e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_integer_helper<unsigned long long>( func, s, idx, base, strtoull ); 1319e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant} 1329e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 1339e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant// wstring 1349e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<> 1359e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline 136a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantint 1379e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_integer( const string& func, const wstring& s, size_t* idx, int base ) 138a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{ 1399e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant // Use long as no Stantard string to integer exists. 1409e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant long r = as_integer_helper<long>( func, s, idx, base, wcstol ); 1419e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant if (r < numeric_limits<int>::min() || numeric_limits<int>::max() < r) 1429e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant throw_from_string_out_of_range(func); 143a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant return static_cast<int>(r); 144a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant} 145a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 1469e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<> 1479e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline 148a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantlong 1499e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_integer( const string& func, const wstring& s, size_t* idx, int base ) 1509e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{ 1519e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_integer_helper<long>( func, s, idx, base, wcstol ); 1529e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant} 1539e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 1549e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<> 1559e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline 1569e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantunsigned long 1579e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_integer( const string& func, const wstring& s, size_t* idx, int base ) 1589e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{ 1599e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_integer_helper<unsigned long>( func, s, idx, base, wcstoul ); 1609e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant} 1619e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 1629e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<> 1639e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline 1649e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantlong long 1659e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_integer( const string& func, const wstring& s, size_t* idx, int base ) 1669e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{ 1679e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_integer_helper<long long>( func, s, idx, base, wcstoll ); 1689e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant} 1699e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 1709e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<> 1719e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline 1729e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantunsigned long long 1739e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_integer( const string& func, const wstring& s, size_t* idx, int base ) 1749e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{ 1759e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_integer_helper<unsigned long long>( func, s, idx, base, wcstoull ); 1769e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant} 1779e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 1789e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant// as_float 1799e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 1809e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<typename V, typename S, typename F> 1819e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline 1829e98b34a8c03460dacab05068d900dd424e45e53Howard HinnantV 1839e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_float_helper(const string& func, const S& str, size_t* idx, F f ) 184a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{ 1859e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant typename S::value_type* ptr; 1869e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant const typename S::value_type* const p = str.c_str(); 18754e2fff2e1e3b2b4c317651bbbf1aadc27b1e378Howard Hinnant typename remove_reference<decltype(errno)>::type errno_save = errno; 1883e3ae9ec4186fd968903ec94613bcea96ab31e56Howard Hinnant errno = 0; 1899e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant V r = f(p, &ptr); 1903e3ae9ec4186fd968903ec94613bcea96ab31e56Howard Hinnant swap(errno, errno_save); 1913e3ae9ec4186fd968903ec94613bcea96ab31e56Howard Hinnant if (errno_save == ERANGE) 1929e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant throw_from_string_out_of_range(func); 1933e3ae9ec4186fd968903ec94613bcea96ab31e56Howard Hinnant if (ptr == p) 1949e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant throw_from_string_invalid_arg(func); 195a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant if (idx) 196a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant *idx = static_cast<size_t>(ptr - p); 197a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant return r; 198a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant} 199a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 2009e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<typename V, typename S> 2019e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline 2029e98b34a8c03460dacab05068d900dd424e45e53Howard HinnantV as_float( const string& func, const S& s, size_t* idx = nullptr ); 2039e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 2049e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<> 2059e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline 2069e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantfloat 2079e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_float( const string& func, const string& s, size_t* idx ) 2089e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{ 2099e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_float_helper<float>( func, s, idx, strtof ); 2109e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant} 2119e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 2129e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<> 2139e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline 2149e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantdouble 2159e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_float(const string& func, const string& s, size_t* idx ) 2169e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{ 2179e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_float_helper<double>( func, s, idx, strtod ); 2189e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant} 2199e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 2209e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<> 2219e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline 2229e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantlong double 2239e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_float( const string& func, const string& s, size_t* idx ) 2249e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{ 2259e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_float_helper<long double>( func, s, idx, strtold ); 2269e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant} 2279e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 2289e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<> 2299e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline 2309e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantfloat 2319e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_float( const string& func, const wstring& s, size_t* idx ) 2329e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{ 2339e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_float_helper<float>( func, s, idx, wcstof ); 2349e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant} 2359e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 2369e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<> 2379e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline 2389e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantdouble 2399e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_float( const string& func, const wstring& s, size_t* idx ) 2409e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{ 2419e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_float_helper<double>( func, s, idx, wcstod ); 2429e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant} 2439e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 2449e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<> 2459e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline 2469e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantlong double 2479e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_float( const string& func, const wstring& s, size_t* idx ) 2489e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{ 2499e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_float_helper<long double>( func, s, idx, wcstold ); 2509e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant} 2519e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 2529e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant} // unnamed namespace 2539e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 2549e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantint 2559e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantstoi(const string& str, size_t* idx, int base) 2569e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{ 2579e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_integer<int>( "stoi", str, idx, base ); 2589e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant} 2599e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 2609e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantint 2619e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantstoi(const wstring& str, size_t* idx, int base) 2629e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{ 2639e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_integer<int>( "stoi", str, idx, base ); 2649e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant} 2659e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 2669e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantlong 2679e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantstol(const string& str, size_t* idx, int base) 2689e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{ 2699e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_integer<long>( "stol", str, idx, base ); 2709e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant} 2719e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 272a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantlong 273a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstol(const wstring& str, size_t* idx, int base) 274a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{ 2759e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_integer<long>( "stol", str, idx, base ); 276a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant} 277a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 278a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantunsigned long 279a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstoul(const string& str, size_t* idx, int base) 280a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{ 2819e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_integer<unsigned long>( "stoul", str, idx, base ); 282a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant} 283a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 284a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantunsigned long 285a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstoul(const wstring& str, size_t* idx, int base) 286a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{ 2879e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_integer<unsigned long>( "stoul", str, idx, base ); 288a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant} 289a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 290a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantlong long 291a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstoll(const string& str, size_t* idx, int base) 292a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{ 2939e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_integer<long long>( "stoll", str, idx, base ); 294a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant} 295a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 296a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantlong long 297a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstoll(const wstring& str, size_t* idx, int base) 298a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{ 2999e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_integer<long long>( "stoll", str, idx, base ); 300a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant} 301a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 302a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantunsigned long long 303a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstoull(const string& str, size_t* idx, int base) 304a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{ 3059e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_integer<unsigned long long>( "stoull", str, idx, base ); 306a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant} 307a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 308a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantunsigned long long 309a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstoull(const wstring& str, size_t* idx, int base) 310a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{ 3119e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_integer<unsigned long long>( "stoull", str, idx, base ); 312a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant} 313a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 314a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantfloat 315a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstof(const string& str, size_t* idx) 316a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{ 3179e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_float<float>( "stof", str, idx ); 318a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant} 319a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 320a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantfloat 321a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstof(const wstring& str, size_t* idx) 322a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{ 3239e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_float<float>( "stof", str, idx ); 324a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant} 325a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 326a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantdouble 327a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstod(const string& str, size_t* idx) 328a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{ 3299e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_float<double>( "stod", str, idx ); 330a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant} 331a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 332a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantdouble 333a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstod(const wstring& str, size_t* idx) 334a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{ 3359e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_float<double>( "stod", str, idx ); 336a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant} 337a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 338a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantlong double 339a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstold(const string& str, size_t* idx) 340a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{ 3419e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_float<long double>( "stold", str, idx ); 342a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant} 343a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 344a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantlong double 345a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstold(const wstring& str, size_t* idx) 346a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{ 3479e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_float<long double>( "stold", str, idx ); 348a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant} 349a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 3509e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant// to_string 3519e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 3529e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantnamespace 3539e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{ 3549e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 3559e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant// as_string 3569e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 3579e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate<typename S, typename P, typename V > 3589e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline 3599e98b34a8c03460dacab05068d900dd424e45e53Howard HinnantS 3609e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantas_string(P sprintf_like, S s, const typename S::value_type* fmt, V a) 361a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{ 3629e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant typedef typename S::size_type size_type; 3639e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant size_type available = s.size(); 364a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant while (true) 365a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant { 3669e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant int status = sprintf_like(&s[0], available + 1, fmt, a); 3679e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant if ( status >= 0 ) 368a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant { 3699e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant size_type used = static_cast<size_type>(status); 3709e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant if ( used <= available ) 3719e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant { 3729e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant s.resize( used ); 3739e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant break; 3749e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant } 3759e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant available = used; // Assume this is advice of how much space we need. 376a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant } 3779e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant else 3789e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant available = available * 2 + 1; 3799e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant s.resize(available); 380a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant } 381a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant return s; 382a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant} 383a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 3849e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate <class S, class V, bool = is_floating_point<V>::value> 3859e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantstruct initial_string; 3869e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 3879e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate <class V, bool b> 3889e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantstruct initial_string<string, V, b> 389a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{ 3909e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant string 3919e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant operator()() const 392a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant { 3939e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant string s; 3949e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant s.resize(s.capacity()); 3959e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return s; 396a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant } 3979e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant}; 398a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 3999e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate <class V> 4009e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantstruct initial_string<wstring, V, false> 401a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{ 4029e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant wstring 4039e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant operator()() const 404a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant { 4059e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant const size_t n = (numeric_limits<unsigned long long>::digits / 3) 4069e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant + ((numeric_limits<unsigned long long>::digits % 3) != 0) 4079e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant + 1; 4089e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant wstring s(n, wchar_t()); 4099e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant s.resize(s.capacity()); 4109e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return s; 411a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant } 4129e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant}; 413a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 4149e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttemplate <class V> 4159e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantstruct initial_string<wstring, V, true> 416a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{ 4179e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant wstring 4189e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant operator()() const 419a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant { 4209e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant wstring s(20, wchar_t()); 4219e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant s.resize(s.capacity()); 4229e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return s; 423a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant } 4249e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant}; 4259e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 4269e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnanttypedef int (*wide_printf)(wchar_t* __restrict, size_t, const wchar_t*__restrict, ...); 4279e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 4289e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantinline 4299e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantwide_printf 4309e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantget_swprintf() 4319e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{ 432e9df0a5c6c864f1ea86486881a3ee559c56105e7Howard Hinnant#ifndef _LIBCPP_MSVCRT 4339e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return swprintf; 4349e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant#else 4359e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return static_cast<int (__cdecl*)(wchar_t* __restrict, size_t, const wchar_t*__restrict, ...)>(swprintf); 4369e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant#endif 4379e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant} 4389e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 4399e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant} // unnamed namespace 4409e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 4419e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantstring to_string(int val) 4429e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{ 4439e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_string(snprintf, initial_string<string, int>()(), "%d", val); 4449e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant} 4459e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 4469e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantstring to_string(unsigned val) 4479e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{ 4489e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_string(snprintf, initial_string<string, unsigned>()(), "%u", val); 4499e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant} 4509e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 4519e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantstring to_string(long val) 4529e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{ 4539e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_string(snprintf, initial_string<string, long>()(), "%ld", val); 4549e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant} 4559e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant 4569e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantstring to_string(unsigned long val) 4579e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant{ 4589e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_string(snprintf, initial_string<string, unsigned long>()(), "%lu", val); 459a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant} 460a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 461a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstring to_string(long long val) 462a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{ 4639e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_string(snprintf, initial_string<string, long long>()(), "%lld", val); 464a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant} 465a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 466a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstring to_string(unsigned long long val) 467a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{ 4689e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_string(snprintf, initial_string<string, unsigned long long>()(), "%llu", val); 469a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant} 470a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 471a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstring to_string(float val) 472a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{ 4739e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_string(snprintf, initial_string<string, float>()(), "%f", val); 474a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant} 475a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 476a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstring to_string(double val) 477a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{ 4789e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_string(snprintf, initial_string<string, double>()(), "%f", val); 479a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant} 480a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 481a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantstring to_string(long double val) 482a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{ 4839e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_string(snprintf, initial_string<string, long double>()(), "%Lf", val); 484a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant} 485a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 486a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantwstring to_wstring(int val) 487a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{ 4889e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_string(get_swprintf(), initial_string<wstring, int>()(), L"%d", val); 489a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant} 490a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 491a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantwstring to_wstring(unsigned val) 492a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{ 4939e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_string(get_swprintf(), initial_string<wstring, unsigned>()(), L"%u", val); 494a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant} 495a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 496a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantwstring to_wstring(long val) 497a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{ 4989e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_string(get_swprintf(), initial_string<wstring, long>()(), L"%ld", val); 499a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant} 500a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 501a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantwstring to_wstring(unsigned long val) 502a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{ 5039e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_string(get_swprintf(), initial_string<wstring, unsigned long>()(), L"%lu", val); 504a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant} 505a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 506a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantwstring to_wstring(long long val) 507a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{ 5089e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_string(get_swprintf(), initial_string<wstring, long long>()(), L"%lld", val); 509a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant} 510a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 511a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantwstring to_wstring(unsigned long long val) 512a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{ 5139e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_string(get_swprintf(), initial_string<wstring, unsigned long long>()(), L"%llu", val); 514a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant} 515a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 516a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantwstring to_wstring(float val) 517a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{ 5189e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_string(get_swprintf(), initial_string<wstring, float>()(), L"%f", val); 519a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant} 520a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 521a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantwstring to_wstring(double val) 522a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{ 5239e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_string(get_swprintf(), initial_string<wstring, double>()(), L"%f", val); 524a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant} 525a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant 526a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnantwstring to_wstring(long double val) 527a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant{ 5289e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant return as_string(get_swprintf(), initial_string<wstring, long double>()(), L"%Lf", val); 529a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant} 530a6a062df66fe49704bd074464af30bf8c3db6ea5Howard Hinnant_LIBCPP_END_NAMESPACE_STD 531