1cbbf633eSHoward Hinnant //===------------------------- string.cpp ---------------------------------===// 2cbbf633eSHoward Hinnant // 3cbbf633eSHoward Hinnant // The LLVM Compiler Infrastructure 4cbbf633eSHoward Hinnant // 5*412dbebeSHoward Hinnant // This file is dual licensed under the MIT and the University of Illinois Open 6*412dbebeSHoward Hinnant // Source Licenses. See LICENSE.TXT for details. 7cbbf633eSHoward Hinnant // 8cbbf633eSHoward Hinnant //===----------------------------------------------------------------------===// 9cbbf633eSHoward Hinnant 10cbbf633eSHoward Hinnant #include "string" 11cbbf633eSHoward Hinnant #include "cstdlib" 12cbbf633eSHoward Hinnant #include "cwchar" 13cbbf633eSHoward Hinnant #include "cerrno" 14cbbf633eSHoward Hinnant 15cbbf633eSHoward Hinnant _LIBCPP_BEGIN_NAMESPACE_STD 16cbbf633eSHoward Hinnant 17cbbf633eSHoward Hinnant template class __basic_string_common<true>; 18cbbf633eSHoward Hinnant 19cbbf633eSHoward Hinnant template class basic_string<char>; 20cbbf633eSHoward Hinnant template class basic_string<wchar_t>; 21cbbf633eSHoward Hinnant 22cbbf633eSHoward Hinnant template enable_if<__is_forward_iterator<char const*>::value, void>::type 23cbbf633eSHoward Hinnant basic_string<char, char_traits<char>, allocator<char> > 24cbbf633eSHoward Hinnant ::__init<char const*>(char const*, char const*); 25cbbf633eSHoward Hinnant 26cbbf633eSHoward Hinnant template enable_if<__is_forward_iterator<wchar_t const*>::value, void>::type 27cbbf633eSHoward Hinnant basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > 28cbbf633eSHoward Hinnant ::__init<wchar_t const*>(wchar_t const*, wchar_t const*); 29cbbf633eSHoward Hinnant 30cbbf633eSHoward Hinnant template 31cbbf633eSHoward Hinnant enable_if<__is_forward_iterator<char*>::value, 32cbbf633eSHoward Hinnant basic_string<char, char_traits<char>, allocator<char> >&>::type 33cbbf633eSHoward Hinnant basic_string<char, char_traits<char>, allocator<char> >:: 34cbbf633eSHoward Hinnant append<char*>(char*, char*); 35cbbf633eSHoward Hinnant 36cbbf633eSHoward Hinnant template 37cbbf633eSHoward Hinnant enable_if<__is_forward_iterator<wchar_t*>::value, 38cbbf633eSHoward Hinnant basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >&>::type 39cbbf633eSHoward Hinnant basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >:: 40cbbf633eSHoward Hinnant append<wchar_t*>(wchar_t*, wchar_t*); 41cbbf633eSHoward Hinnant 42cbbf633eSHoward Hinnant template 43cbbf633eSHoward Hinnant enable_if<__is_forward_iterator<char const*>::value, 44cbbf633eSHoward Hinnant string::iterator>::type 45cbbf633eSHoward Hinnant string:: 46cbbf633eSHoward Hinnant insert<char const*>(string::const_iterator, char const*, char const*); 47cbbf633eSHoward Hinnant 48cbbf633eSHoward Hinnant template 49cbbf633eSHoward Hinnant enable_if<__is_forward_iterator<wchar_t const*>::value, 50cbbf633eSHoward Hinnant wstring::iterator>::type 51cbbf633eSHoward Hinnant wstring:: 52cbbf633eSHoward Hinnant insert<wchar_t const*>(wstring::const_iterator, wchar_t const*, wchar_t const*); 53cbbf633eSHoward Hinnant 54cbbf633eSHoward Hinnant template 55cbbf633eSHoward Hinnant enable_if<__is_input_iterator<char const*>::value, string&>::type 56cbbf633eSHoward Hinnant string:: 57cbbf633eSHoward Hinnant replace<char const*>(string::iterator, string::iterator, char const*, char const*); 58cbbf633eSHoward Hinnant 59cbbf633eSHoward Hinnant template 60cbbf633eSHoward Hinnant enable_if<__is_input_iterator<wchar_t const*>::value, wstring&>::type 61cbbf633eSHoward Hinnant wstring:: 62cbbf633eSHoward Hinnant replace<wchar_t const*>(wstring::iterator, wstring::iterator, wchar_t const*, wchar_t const*); 63cbbf633eSHoward Hinnant 64cbbf633eSHoward Hinnant template 65cbbf633eSHoward Hinnant enable_if<__is_forward_iterator<wchar_t*>::value, wstring&>::type 66cbbf633eSHoward Hinnant wstring::assign<wchar_t*>(wchar_t*, wchar_t*); 67cbbf633eSHoward Hinnant 68cbbf633eSHoward Hinnant template 69cbbf633eSHoward Hinnant string 70cbbf633eSHoward Hinnant operator+<char, char_traits<char>, allocator<char> >(char const*, string const&); 71cbbf633eSHoward Hinnant 72cbbf633eSHoward Hinnant int 73cbbf633eSHoward Hinnant stoi(const string& str, size_t* idx, int base) 74cbbf633eSHoward Hinnant { 75cbbf633eSHoward Hinnant char* ptr; 76cbbf633eSHoward Hinnant const char* const p = str.c_str(); 77cbbf633eSHoward Hinnant long r = strtol(p, &ptr, base); 78cbbf633eSHoward Hinnant if (r < numeric_limits<int>::min() || numeric_limits<int>::max() < r) 79cbbf633eSHoward Hinnant ptr = const_cast<char*>(p); 80cbbf633eSHoward Hinnant if (ptr == p) 81cbbf633eSHoward Hinnant { 8254b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 83cbbf633eSHoward Hinnant if (r == 0) 84cbbf633eSHoward Hinnant throw invalid_argument("stoi: no conversion"); 85cbbf633eSHoward Hinnant throw out_of_range("stoi: out of range"); 86940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 87cbbf633eSHoward Hinnant } 88cbbf633eSHoward Hinnant if (idx) 89cbbf633eSHoward Hinnant *idx = static_cast<size_t>(ptr - p); 90cbbf633eSHoward Hinnant return static_cast<int>(r); 91cbbf633eSHoward Hinnant } 92cbbf633eSHoward Hinnant 93cbbf633eSHoward Hinnant int 94cbbf633eSHoward Hinnant stoi(const wstring& str, size_t* idx, int base) 95cbbf633eSHoward Hinnant { 96cbbf633eSHoward Hinnant wchar_t* ptr; 97cbbf633eSHoward Hinnant const wchar_t* const p = str.c_str(); 98cbbf633eSHoward Hinnant long r = wcstol(p, &ptr, base); 99cbbf633eSHoward Hinnant if (r < numeric_limits<int>::min() || numeric_limits<int>::max() < r) 100cbbf633eSHoward Hinnant ptr = const_cast<wchar_t*>(p); 101cbbf633eSHoward Hinnant if (ptr == p) 102cbbf633eSHoward Hinnant { 10354b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 104cbbf633eSHoward Hinnant if (r == 0) 105cbbf633eSHoward Hinnant throw invalid_argument("stoi: no conversion"); 106cbbf633eSHoward Hinnant throw out_of_range("stoi: out of range"); 107940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 108cbbf633eSHoward Hinnant } 109cbbf633eSHoward Hinnant if (idx) 110cbbf633eSHoward Hinnant *idx = static_cast<size_t>(ptr - p); 111cbbf633eSHoward Hinnant return static_cast<int>(r); 112cbbf633eSHoward Hinnant } 113cbbf633eSHoward Hinnant 114cbbf633eSHoward Hinnant long 115cbbf633eSHoward Hinnant stol(const string& str, size_t* idx, int base) 116cbbf633eSHoward Hinnant { 117cbbf633eSHoward Hinnant char* ptr; 118cbbf633eSHoward Hinnant const char* const p = str.c_str(); 119cbbf633eSHoward Hinnant long r = strtol(p, &ptr, base); 120cbbf633eSHoward Hinnant if (ptr == p) 121cbbf633eSHoward Hinnant { 12254b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 123cbbf633eSHoward Hinnant if (r == 0) 124cbbf633eSHoward Hinnant throw invalid_argument("stol: no conversion"); 125cbbf633eSHoward Hinnant throw out_of_range("stol: out of range"); 126940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 127cbbf633eSHoward Hinnant } 128cbbf633eSHoward Hinnant if (idx) 129cbbf633eSHoward Hinnant *idx = static_cast<size_t>(ptr - p); 130cbbf633eSHoward Hinnant return r; 131cbbf633eSHoward Hinnant } 132cbbf633eSHoward Hinnant 133cbbf633eSHoward Hinnant long 134cbbf633eSHoward Hinnant stol(const wstring& str, size_t* idx, int base) 135cbbf633eSHoward Hinnant { 136cbbf633eSHoward Hinnant wchar_t* ptr; 137cbbf633eSHoward Hinnant const wchar_t* const p = str.c_str(); 138cbbf633eSHoward Hinnant long r = wcstol(p, &ptr, base); 139cbbf633eSHoward Hinnant if (ptr == p) 140cbbf633eSHoward Hinnant { 14154b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 142cbbf633eSHoward Hinnant if (r == 0) 143cbbf633eSHoward Hinnant throw invalid_argument("stol: no conversion"); 144cbbf633eSHoward Hinnant throw out_of_range("stol: out of range"); 145940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 146cbbf633eSHoward Hinnant } 147cbbf633eSHoward Hinnant if (idx) 148cbbf633eSHoward Hinnant *idx = static_cast<size_t>(ptr - p); 149cbbf633eSHoward Hinnant return r; 150cbbf633eSHoward Hinnant } 151cbbf633eSHoward Hinnant 152cbbf633eSHoward Hinnant unsigned long 153cbbf633eSHoward Hinnant stoul(const string& str, size_t* idx, int base) 154cbbf633eSHoward Hinnant { 155cbbf633eSHoward Hinnant char* ptr; 156cbbf633eSHoward Hinnant const char* const p = str.c_str(); 157cbbf633eSHoward Hinnant unsigned long r = strtoul(p, &ptr, base); 158cbbf633eSHoward Hinnant if (ptr == p) 159cbbf633eSHoward Hinnant { 16054b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 161cbbf633eSHoward Hinnant if (r == 0) 162cbbf633eSHoward Hinnant throw invalid_argument("stoul: no conversion"); 163cbbf633eSHoward Hinnant throw out_of_range("stoul: out of range"); 164940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 165cbbf633eSHoward Hinnant } 166cbbf633eSHoward Hinnant if (idx) 167cbbf633eSHoward Hinnant *idx = static_cast<size_t>(ptr - p); 168cbbf633eSHoward Hinnant return r; 169cbbf633eSHoward Hinnant } 170cbbf633eSHoward Hinnant 171cbbf633eSHoward Hinnant unsigned long 172cbbf633eSHoward Hinnant stoul(const wstring& str, size_t* idx, int base) 173cbbf633eSHoward Hinnant { 174cbbf633eSHoward Hinnant wchar_t* ptr; 175cbbf633eSHoward Hinnant const wchar_t* const p = str.c_str(); 176cbbf633eSHoward Hinnant unsigned long r = wcstoul(p, &ptr, base); 177cbbf633eSHoward Hinnant if (ptr == p) 178cbbf633eSHoward Hinnant { 17954b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 180cbbf633eSHoward Hinnant if (r == 0) 181cbbf633eSHoward Hinnant throw invalid_argument("stoul: no conversion"); 182cbbf633eSHoward Hinnant throw out_of_range("stoul: out of range"); 183940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 184cbbf633eSHoward Hinnant } 185cbbf633eSHoward Hinnant if (idx) 186cbbf633eSHoward Hinnant *idx = static_cast<size_t>(ptr - p); 187cbbf633eSHoward Hinnant return r; 188cbbf633eSHoward Hinnant } 189cbbf633eSHoward Hinnant 190cbbf633eSHoward Hinnant long long 191cbbf633eSHoward Hinnant stoll(const string& str, size_t* idx, int base) 192cbbf633eSHoward Hinnant { 193cbbf633eSHoward Hinnant char* ptr; 194cbbf633eSHoward Hinnant const char* const p = str.c_str(); 195cbbf633eSHoward Hinnant long long r = strtoll(p, &ptr, base); 196cbbf633eSHoward Hinnant if (ptr == p) 197cbbf633eSHoward Hinnant { 19854b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 199cbbf633eSHoward Hinnant if (r == 0) 200cbbf633eSHoward Hinnant throw invalid_argument("stoll: no conversion"); 201cbbf633eSHoward Hinnant throw out_of_range("stoll: out of range"); 202940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 203cbbf633eSHoward Hinnant } 204cbbf633eSHoward Hinnant if (idx) 205cbbf633eSHoward Hinnant *idx = static_cast<size_t>(ptr - p); 206cbbf633eSHoward Hinnant return r; 207cbbf633eSHoward Hinnant } 208cbbf633eSHoward Hinnant 209cbbf633eSHoward Hinnant long long 210cbbf633eSHoward Hinnant stoll(const wstring& str, size_t* idx, int base) 211cbbf633eSHoward Hinnant { 212cbbf633eSHoward Hinnant wchar_t* ptr; 213cbbf633eSHoward Hinnant const wchar_t* const p = str.c_str(); 214cbbf633eSHoward Hinnant long long r = wcstoll(p, &ptr, base); 215cbbf633eSHoward Hinnant if (ptr == p) 216cbbf633eSHoward Hinnant { 21754b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 218cbbf633eSHoward Hinnant if (r == 0) 219cbbf633eSHoward Hinnant throw invalid_argument("stoll: no conversion"); 220cbbf633eSHoward Hinnant throw out_of_range("stoll: out of range"); 221940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 222cbbf633eSHoward Hinnant } 223cbbf633eSHoward Hinnant if (idx) 224cbbf633eSHoward Hinnant *idx = static_cast<size_t>(ptr - p); 225cbbf633eSHoward Hinnant return r; 226cbbf633eSHoward Hinnant } 227cbbf633eSHoward Hinnant 228cbbf633eSHoward Hinnant unsigned long long 229cbbf633eSHoward Hinnant stoull(const string& str, size_t* idx, int base) 230cbbf633eSHoward Hinnant { 231cbbf633eSHoward Hinnant char* ptr; 232cbbf633eSHoward Hinnant const char* const p = str.c_str(); 233cbbf633eSHoward Hinnant unsigned long long r = strtoull(p, &ptr, base); 234cbbf633eSHoward Hinnant if (ptr == p) 235cbbf633eSHoward Hinnant { 23654b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 237cbbf633eSHoward Hinnant if (r == 0) 238cbbf633eSHoward Hinnant throw invalid_argument("stoull: no conversion"); 239cbbf633eSHoward Hinnant throw out_of_range("stoull: out of range"); 240940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 241cbbf633eSHoward Hinnant } 242cbbf633eSHoward Hinnant if (idx) 243cbbf633eSHoward Hinnant *idx = static_cast<size_t>(ptr - p); 244cbbf633eSHoward Hinnant return r; 245cbbf633eSHoward Hinnant } 246cbbf633eSHoward Hinnant 247cbbf633eSHoward Hinnant unsigned long long 248cbbf633eSHoward Hinnant stoull(const wstring& str, size_t* idx, int base) 249cbbf633eSHoward Hinnant { 250cbbf633eSHoward Hinnant wchar_t* ptr; 251cbbf633eSHoward Hinnant const wchar_t* const p = str.c_str(); 252cbbf633eSHoward Hinnant unsigned long long r = wcstoull(p, &ptr, base); 253cbbf633eSHoward Hinnant if (ptr == p) 254cbbf633eSHoward Hinnant { 25554b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 256cbbf633eSHoward Hinnant if (r == 0) 257cbbf633eSHoward Hinnant throw invalid_argument("stoull: no conversion"); 258cbbf633eSHoward Hinnant throw out_of_range("stoull: out of range"); 259940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 260cbbf633eSHoward Hinnant } 261cbbf633eSHoward Hinnant if (idx) 262cbbf633eSHoward Hinnant *idx = static_cast<size_t>(ptr - p); 263cbbf633eSHoward Hinnant return r; 264cbbf633eSHoward Hinnant } 265cbbf633eSHoward Hinnant 266cbbf633eSHoward Hinnant float 267cbbf633eSHoward Hinnant stof(const string& str, size_t* idx) 268cbbf633eSHoward Hinnant { 269cbbf633eSHoward Hinnant char* ptr; 270cbbf633eSHoward Hinnant const char* const p = str.c_str(); 271cbbf633eSHoward Hinnant int errno_save = errno; 272cbbf633eSHoward Hinnant errno = 0; 273cbbf633eSHoward Hinnant double r = strtod(p, &ptr); 274cbbf633eSHoward Hinnant swap(errno, errno_save); 27554b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 276cbbf633eSHoward Hinnant if (errno_save == ERANGE) 277cbbf633eSHoward Hinnant throw out_of_range("stof: out of range"); 278cbbf633eSHoward Hinnant if (ptr == p) 279cbbf633eSHoward Hinnant throw invalid_argument("stof: no conversion"); 280940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 281cbbf633eSHoward Hinnant if (idx) 282cbbf633eSHoward Hinnant *idx = static_cast<size_t>(ptr - p); 283cbbf633eSHoward Hinnant return static_cast<float>(r); 284cbbf633eSHoward Hinnant } 285cbbf633eSHoward Hinnant 286cbbf633eSHoward Hinnant float 287cbbf633eSHoward Hinnant stof(const wstring& str, size_t* idx) 288cbbf633eSHoward Hinnant { 289cbbf633eSHoward Hinnant wchar_t* ptr; 290cbbf633eSHoward Hinnant const wchar_t* const p = str.c_str(); 291cbbf633eSHoward Hinnant int errno_save = errno; 292cbbf633eSHoward Hinnant errno = 0; 293cbbf633eSHoward Hinnant double r = wcstod(p, &ptr); 294cbbf633eSHoward Hinnant swap(errno, errno_save); 29554b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 296cbbf633eSHoward Hinnant if (errno_save == ERANGE) 297cbbf633eSHoward Hinnant throw out_of_range("stof: out of range"); 298cbbf633eSHoward Hinnant if (ptr == p) 299cbbf633eSHoward Hinnant throw invalid_argument("stof: no conversion"); 300940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 301cbbf633eSHoward Hinnant if (idx) 302cbbf633eSHoward Hinnant *idx = static_cast<size_t>(ptr - p); 303cbbf633eSHoward Hinnant return static_cast<float>(r); 304cbbf633eSHoward Hinnant } 305cbbf633eSHoward Hinnant 306cbbf633eSHoward Hinnant double 307cbbf633eSHoward Hinnant stod(const string& str, size_t* idx) 308cbbf633eSHoward Hinnant { 309cbbf633eSHoward Hinnant char* ptr; 310cbbf633eSHoward Hinnant const char* const p = str.c_str(); 311cbbf633eSHoward Hinnant int errno_save = errno; 312cbbf633eSHoward Hinnant errno = 0; 313cbbf633eSHoward Hinnant double r = strtod(p, &ptr); 314cbbf633eSHoward Hinnant swap(errno, errno_save); 31554b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 316cbbf633eSHoward Hinnant if (errno_save == ERANGE) 317cbbf633eSHoward Hinnant throw out_of_range("stod: out of range"); 318cbbf633eSHoward Hinnant if (ptr == p) 319cbbf633eSHoward Hinnant throw invalid_argument("stod: no conversion"); 320940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 321cbbf633eSHoward Hinnant if (idx) 322cbbf633eSHoward Hinnant *idx = static_cast<size_t>(ptr - p); 323cbbf633eSHoward Hinnant return r; 324cbbf633eSHoward Hinnant } 325cbbf633eSHoward Hinnant 326cbbf633eSHoward Hinnant double 327cbbf633eSHoward Hinnant stod(const wstring& str, size_t* idx) 328cbbf633eSHoward Hinnant { 329cbbf633eSHoward Hinnant wchar_t* ptr; 330cbbf633eSHoward Hinnant const wchar_t* const p = str.c_str(); 331cbbf633eSHoward Hinnant int errno_save = errno; 332cbbf633eSHoward Hinnant errno = 0; 333cbbf633eSHoward Hinnant double r = wcstod(p, &ptr); 334cbbf633eSHoward Hinnant swap(errno, errno_save); 33554b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 336cbbf633eSHoward Hinnant if (errno_save == ERANGE) 337cbbf633eSHoward Hinnant throw out_of_range("stod: out of range"); 338cbbf633eSHoward Hinnant if (ptr == p) 339cbbf633eSHoward Hinnant throw invalid_argument("stod: no conversion"); 340940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 341cbbf633eSHoward Hinnant if (idx) 342cbbf633eSHoward Hinnant *idx = static_cast<size_t>(ptr - p); 343cbbf633eSHoward Hinnant return r; 344cbbf633eSHoward Hinnant } 345cbbf633eSHoward Hinnant 346cbbf633eSHoward Hinnant long double 347cbbf633eSHoward Hinnant stold(const string& str, size_t* idx) 348cbbf633eSHoward Hinnant { 349cbbf633eSHoward Hinnant char* ptr; 350cbbf633eSHoward Hinnant const char* const p = str.c_str(); 351cbbf633eSHoward Hinnant int errno_save = errno; 352cbbf633eSHoward Hinnant errno = 0; 353cbbf633eSHoward Hinnant long double r = strtold(p, &ptr); 354cbbf633eSHoward Hinnant swap(errno, errno_save); 35554b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 356cbbf633eSHoward Hinnant if (errno_save == ERANGE) 357cbbf633eSHoward Hinnant throw out_of_range("stold: out of range"); 358cbbf633eSHoward Hinnant if (ptr == p) 359cbbf633eSHoward Hinnant throw invalid_argument("stold: no conversion"); 360940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 361cbbf633eSHoward Hinnant if (idx) 362cbbf633eSHoward Hinnant *idx = static_cast<size_t>(ptr - p); 363cbbf633eSHoward Hinnant return r; 364cbbf633eSHoward Hinnant } 365cbbf633eSHoward Hinnant 366cbbf633eSHoward Hinnant long double 367cbbf633eSHoward Hinnant stold(const wstring& str, size_t* idx) 368cbbf633eSHoward Hinnant { 369cbbf633eSHoward Hinnant wchar_t* ptr; 370cbbf633eSHoward Hinnant const wchar_t* const p = str.c_str(); 371cbbf633eSHoward Hinnant int errno_save = errno; 372cbbf633eSHoward Hinnant errno = 0; 373cbbf633eSHoward Hinnant long double r = wcstold(p, &ptr); 374cbbf633eSHoward Hinnant swap(errno, errno_save); 37554b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS 376cbbf633eSHoward Hinnant if (errno_save == ERANGE) 377cbbf633eSHoward Hinnant throw out_of_range("stold: out of range"); 378cbbf633eSHoward Hinnant if (ptr == p) 379cbbf633eSHoward Hinnant throw invalid_argument("stold: no conversion"); 380940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS 381cbbf633eSHoward Hinnant if (idx) 382cbbf633eSHoward Hinnant *idx = static_cast<size_t>(ptr - p); 383cbbf633eSHoward Hinnant return r; 384cbbf633eSHoward Hinnant } 385cbbf633eSHoward Hinnant 386cbbf633eSHoward Hinnant string to_string(int val) 387cbbf633eSHoward Hinnant { 388cbbf633eSHoward Hinnant string s; 389cbbf633eSHoward Hinnant s.resize(s.capacity()); 390cbbf633eSHoward Hinnant while (true) 391cbbf633eSHoward Hinnant { 392cbbf633eSHoward Hinnant int n2 = snprintf(&s[0], s.size()+1, "%d", val); 393cbbf633eSHoward Hinnant if (n2 <= s.size()) 394cbbf633eSHoward Hinnant { 395cbbf633eSHoward Hinnant s.resize(n2); 396cbbf633eSHoward Hinnant break; 397cbbf633eSHoward Hinnant } 398cbbf633eSHoward Hinnant s.resize(n2); 399cbbf633eSHoward Hinnant } 400cbbf633eSHoward Hinnant return s; 401cbbf633eSHoward Hinnant } 402cbbf633eSHoward Hinnant 403cbbf633eSHoward Hinnant string to_string(unsigned val) 404cbbf633eSHoward Hinnant { 405cbbf633eSHoward Hinnant string s; 406cbbf633eSHoward Hinnant s.resize(s.capacity()); 407cbbf633eSHoward Hinnant while (true) 408cbbf633eSHoward Hinnant { 409cbbf633eSHoward Hinnant int n2 = snprintf(&s[0], s.size()+1, "%u", val); 410cbbf633eSHoward Hinnant if (n2 <= s.size()) 411cbbf633eSHoward Hinnant { 412cbbf633eSHoward Hinnant s.resize(n2); 413cbbf633eSHoward Hinnant break; 414cbbf633eSHoward Hinnant } 415cbbf633eSHoward Hinnant s.resize(n2); 416cbbf633eSHoward Hinnant } 417cbbf633eSHoward Hinnant return s; 418cbbf633eSHoward Hinnant } 419cbbf633eSHoward Hinnant 420cbbf633eSHoward Hinnant string to_string(long val) 421cbbf633eSHoward Hinnant { 422cbbf633eSHoward Hinnant string s; 423cbbf633eSHoward Hinnant s.resize(s.capacity()); 424cbbf633eSHoward Hinnant while (true) 425cbbf633eSHoward Hinnant { 426cbbf633eSHoward Hinnant int n2 = snprintf(&s[0], s.size()+1, "%ld", val); 427cbbf633eSHoward Hinnant if (n2 <= s.size()) 428cbbf633eSHoward Hinnant { 429cbbf633eSHoward Hinnant s.resize(n2); 430cbbf633eSHoward Hinnant break; 431cbbf633eSHoward Hinnant } 432cbbf633eSHoward Hinnant s.resize(n2); 433cbbf633eSHoward Hinnant } 434cbbf633eSHoward Hinnant return s; 435cbbf633eSHoward Hinnant } 436cbbf633eSHoward Hinnant 437cbbf633eSHoward Hinnant string to_string(unsigned long val) 438cbbf633eSHoward Hinnant { 439cbbf633eSHoward Hinnant string s; 440cbbf633eSHoward Hinnant s.resize(s.capacity()); 441cbbf633eSHoward Hinnant while (true) 442cbbf633eSHoward Hinnant { 443cbbf633eSHoward Hinnant int n2 = snprintf(&s[0], s.size()+1, "%lu", val); 444cbbf633eSHoward Hinnant if (n2 <= s.size()) 445cbbf633eSHoward Hinnant { 446cbbf633eSHoward Hinnant s.resize(n2); 447cbbf633eSHoward Hinnant break; 448cbbf633eSHoward Hinnant } 449cbbf633eSHoward Hinnant s.resize(n2); 450cbbf633eSHoward Hinnant } 451cbbf633eSHoward Hinnant return s; 452cbbf633eSHoward Hinnant } 453cbbf633eSHoward Hinnant 454cbbf633eSHoward Hinnant string to_string(long long val) 455cbbf633eSHoward Hinnant { 456cbbf633eSHoward Hinnant string s; 457cbbf633eSHoward Hinnant s.resize(s.capacity()); 458cbbf633eSHoward Hinnant while (true) 459cbbf633eSHoward Hinnant { 460cbbf633eSHoward Hinnant int n2 = snprintf(&s[0], s.size()+1, "%lld", val); 461cbbf633eSHoward Hinnant if (n2 <= s.size()) 462cbbf633eSHoward Hinnant { 463cbbf633eSHoward Hinnant s.resize(n2); 464cbbf633eSHoward Hinnant break; 465cbbf633eSHoward Hinnant } 466cbbf633eSHoward Hinnant s.resize(n2); 467cbbf633eSHoward Hinnant } 468cbbf633eSHoward Hinnant return s; 469cbbf633eSHoward Hinnant } 470cbbf633eSHoward Hinnant 471cbbf633eSHoward Hinnant string to_string(unsigned long long val) 472cbbf633eSHoward Hinnant { 473cbbf633eSHoward Hinnant string s; 474cbbf633eSHoward Hinnant s.resize(s.capacity()); 475cbbf633eSHoward Hinnant while (true) 476cbbf633eSHoward Hinnant { 477cbbf633eSHoward Hinnant int n2 = snprintf(&s[0], s.size()+1, "%llu", val); 478cbbf633eSHoward Hinnant if (n2 <= s.size()) 479cbbf633eSHoward Hinnant { 480cbbf633eSHoward Hinnant s.resize(n2); 481cbbf633eSHoward Hinnant break; 482cbbf633eSHoward Hinnant } 483cbbf633eSHoward Hinnant s.resize(n2); 484cbbf633eSHoward Hinnant } 485cbbf633eSHoward Hinnant return s; 486cbbf633eSHoward Hinnant } 487cbbf633eSHoward Hinnant 488cbbf633eSHoward Hinnant string to_string(float val) 489cbbf633eSHoward Hinnant { 490cbbf633eSHoward Hinnant string s; 491cbbf633eSHoward Hinnant s.resize(s.capacity()); 492cbbf633eSHoward Hinnant while (true) 493cbbf633eSHoward Hinnant { 494cbbf633eSHoward Hinnant int n2 = snprintf(&s[0], s.size()+1, "%f", val); 495cbbf633eSHoward Hinnant if (n2 <= s.size()) 496cbbf633eSHoward Hinnant { 497cbbf633eSHoward Hinnant s.resize(n2); 498cbbf633eSHoward Hinnant break; 499cbbf633eSHoward Hinnant } 500cbbf633eSHoward Hinnant s.resize(n2); 501cbbf633eSHoward Hinnant } 502cbbf633eSHoward Hinnant return s; 503cbbf633eSHoward Hinnant } 504cbbf633eSHoward Hinnant 505cbbf633eSHoward Hinnant string to_string(double val) 506cbbf633eSHoward Hinnant { 507cbbf633eSHoward Hinnant string s; 508cbbf633eSHoward Hinnant s.resize(s.capacity()); 509cbbf633eSHoward Hinnant while (true) 510cbbf633eSHoward Hinnant { 511cbbf633eSHoward Hinnant int n2 = snprintf(&s[0], s.size()+1, "%f", val); 512cbbf633eSHoward Hinnant if (n2 <= s.size()) 513cbbf633eSHoward Hinnant { 514cbbf633eSHoward Hinnant s.resize(n2); 515cbbf633eSHoward Hinnant break; 516cbbf633eSHoward Hinnant } 517cbbf633eSHoward Hinnant s.resize(n2); 518cbbf633eSHoward Hinnant } 519cbbf633eSHoward Hinnant return s; 520cbbf633eSHoward Hinnant } 521cbbf633eSHoward Hinnant 522cbbf633eSHoward Hinnant string to_string(long double val) 523cbbf633eSHoward Hinnant { 524cbbf633eSHoward Hinnant string s; 525cbbf633eSHoward Hinnant s.resize(s.capacity()); 526cbbf633eSHoward Hinnant while (true) 527cbbf633eSHoward Hinnant { 528cbbf633eSHoward Hinnant int n2 = snprintf(&s[0], s.size()+1, "%Lf", val); 529cbbf633eSHoward Hinnant if (n2 <= s.size()) 530cbbf633eSHoward Hinnant { 531cbbf633eSHoward Hinnant s.resize(n2); 532cbbf633eSHoward Hinnant break; 533cbbf633eSHoward Hinnant } 534cbbf633eSHoward Hinnant s.resize(n2); 535cbbf633eSHoward Hinnant } 536cbbf633eSHoward Hinnant return s; 537cbbf633eSHoward Hinnant } 538cbbf633eSHoward Hinnant 539cbbf633eSHoward Hinnant wstring to_wstring(int val) 540cbbf633eSHoward Hinnant { 541cbbf633eSHoward Hinnant const size_t n = (numeric_limits<int>::digits / 3) 542cbbf633eSHoward Hinnant + ((numeric_limits<int>::digits % 3) != 0) 543cbbf633eSHoward Hinnant + 1; 544cbbf633eSHoward Hinnant wstring s(n, wchar_t()); 545cbbf633eSHoward Hinnant s.resize(s.capacity()); 546cbbf633eSHoward Hinnant while (true) 547cbbf633eSHoward Hinnant { 548cbbf633eSHoward Hinnant int n2 = swprintf(&s[0], s.size()+1, L"%d", val); 549cbbf633eSHoward Hinnant if (n2 > 0) 550cbbf633eSHoward Hinnant { 551cbbf633eSHoward Hinnant s.resize(n2); 552cbbf633eSHoward Hinnant break; 553cbbf633eSHoward Hinnant } 554cbbf633eSHoward Hinnant s.resize(2*s.size()); 555cbbf633eSHoward Hinnant s.resize(s.capacity()); 556cbbf633eSHoward Hinnant } 557cbbf633eSHoward Hinnant return s; 558cbbf633eSHoward Hinnant } 559cbbf633eSHoward Hinnant 560cbbf633eSHoward Hinnant wstring to_wstring(unsigned val) 561cbbf633eSHoward Hinnant { 562cbbf633eSHoward Hinnant const size_t n = (numeric_limits<unsigned>::digits / 3) 563cbbf633eSHoward Hinnant + ((numeric_limits<unsigned>::digits % 3) != 0) 564cbbf633eSHoward Hinnant + 1; 565cbbf633eSHoward Hinnant wstring s(n, wchar_t()); 566cbbf633eSHoward Hinnant s.resize(s.capacity()); 567cbbf633eSHoward Hinnant while (true) 568cbbf633eSHoward Hinnant { 569cbbf633eSHoward Hinnant int n2 = swprintf(&s[0], s.size()+1, L"%u", val); 570cbbf633eSHoward Hinnant if (n2 > 0) 571cbbf633eSHoward Hinnant { 572cbbf633eSHoward Hinnant s.resize(n2); 573cbbf633eSHoward Hinnant break; 574cbbf633eSHoward Hinnant } 575cbbf633eSHoward Hinnant s.resize(2*s.size()); 576cbbf633eSHoward Hinnant s.resize(s.capacity()); 577cbbf633eSHoward Hinnant } 578cbbf633eSHoward Hinnant return s; 579cbbf633eSHoward Hinnant } 580cbbf633eSHoward Hinnant 581cbbf633eSHoward Hinnant wstring to_wstring(long val) 582cbbf633eSHoward Hinnant { 583cbbf633eSHoward Hinnant const size_t n = (numeric_limits<long>::digits / 3) 584cbbf633eSHoward Hinnant + ((numeric_limits<long>::digits % 3) != 0) 585cbbf633eSHoward Hinnant + 1; 586cbbf633eSHoward Hinnant wstring s(n, wchar_t()); 587cbbf633eSHoward Hinnant s.resize(s.capacity()); 588cbbf633eSHoward Hinnant while (true) 589cbbf633eSHoward Hinnant { 590cbbf633eSHoward Hinnant int n2 = swprintf(&s[0], s.size()+1, L"%ld", val); 591cbbf633eSHoward Hinnant if (n2 > 0) 592cbbf633eSHoward Hinnant { 593cbbf633eSHoward Hinnant s.resize(n2); 594cbbf633eSHoward Hinnant break; 595cbbf633eSHoward Hinnant } 596cbbf633eSHoward Hinnant s.resize(2*s.size()); 597cbbf633eSHoward Hinnant s.resize(s.capacity()); 598cbbf633eSHoward Hinnant } 599cbbf633eSHoward Hinnant return s; 600cbbf633eSHoward Hinnant } 601cbbf633eSHoward Hinnant 602cbbf633eSHoward Hinnant wstring to_wstring(unsigned long val) 603cbbf633eSHoward Hinnant { 604cbbf633eSHoward Hinnant const size_t n = (numeric_limits<unsigned long>::digits / 3) 605cbbf633eSHoward Hinnant + ((numeric_limits<unsigned long>::digits % 3) != 0) 606cbbf633eSHoward Hinnant + 1; 607cbbf633eSHoward Hinnant wstring s(n, wchar_t()); 608cbbf633eSHoward Hinnant s.resize(s.capacity()); 609cbbf633eSHoward Hinnant while (true) 610cbbf633eSHoward Hinnant { 611cbbf633eSHoward Hinnant int n2 = swprintf(&s[0], s.size()+1, L"%lu", val); 612cbbf633eSHoward Hinnant if (n2 > 0) 613cbbf633eSHoward Hinnant { 614cbbf633eSHoward Hinnant s.resize(n2); 615cbbf633eSHoward Hinnant break; 616cbbf633eSHoward Hinnant } 617cbbf633eSHoward Hinnant s.resize(2*s.size()); 618cbbf633eSHoward Hinnant s.resize(s.capacity()); 619cbbf633eSHoward Hinnant } 620cbbf633eSHoward Hinnant return s; 621cbbf633eSHoward Hinnant } 622cbbf633eSHoward Hinnant 623cbbf633eSHoward Hinnant wstring to_wstring(long long val) 624cbbf633eSHoward Hinnant { 625cbbf633eSHoward Hinnant const size_t n = (numeric_limits<long long>::digits / 3) 626cbbf633eSHoward Hinnant + ((numeric_limits<long long>::digits % 3) != 0) 627cbbf633eSHoward Hinnant + 1; 628cbbf633eSHoward Hinnant wstring s(n, wchar_t()); 629cbbf633eSHoward Hinnant s.resize(s.capacity()); 630cbbf633eSHoward Hinnant while (true) 631cbbf633eSHoward Hinnant { 632cbbf633eSHoward Hinnant int n2 = swprintf(&s[0], s.size()+1, L"%lld", val); 633cbbf633eSHoward Hinnant if (n2 > 0) 634cbbf633eSHoward Hinnant { 635cbbf633eSHoward Hinnant s.resize(n2); 636cbbf633eSHoward Hinnant break; 637cbbf633eSHoward Hinnant } 638cbbf633eSHoward Hinnant s.resize(2*s.size()); 639cbbf633eSHoward Hinnant s.resize(s.capacity()); 640cbbf633eSHoward Hinnant } 641cbbf633eSHoward Hinnant return s; 642cbbf633eSHoward Hinnant } 643cbbf633eSHoward Hinnant 644cbbf633eSHoward Hinnant wstring to_wstring(unsigned long long val) 645cbbf633eSHoward Hinnant { 646cbbf633eSHoward Hinnant const size_t n = (numeric_limits<unsigned long long>::digits / 3) 647cbbf633eSHoward Hinnant + ((numeric_limits<unsigned long long>::digits % 3) != 0) 648cbbf633eSHoward Hinnant + 1; 649cbbf633eSHoward Hinnant wstring s(n, wchar_t()); 650cbbf633eSHoward Hinnant s.resize(s.capacity()); 651cbbf633eSHoward Hinnant while (true) 652cbbf633eSHoward Hinnant { 653cbbf633eSHoward Hinnant int n2 = swprintf(&s[0], s.size()+1, L"%llu", val); 654cbbf633eSHoward Hinnant if (n2 > 0) 655cbbf633eSHoward Hinnant { 656cbbf633eSHoward Hinnant s.resize(n2); 657cbbf633eSHoward Hinnant break; 658cbbf633eSHoward Hinnant } 659cbbf633eSHoward Hinnant s.resize(2*s.size()); 660cbbf633eSHoward Hinnant s.resize(s.capacity()); 661cbbf633eSHoward Hinnant } 662cbbf633eSHoward Hinnant return s; 663cbbf633eSHoward Hinnant } 664cbbf633eSHoward Hinnant 665cbbf633eSHoward Hinnant wstring to_wstring(float val) 666cbbf633eSHoward Hinnant { 667cbbf633eSHoward Hinnant const size_t n = 20; 668cbbf633eSHoward Hinnant wstring s(n, wchar_t()); 669cbbf633eSHoward Hinnant s.resize(s.capacity()); 670cbbf633eSHoward Hinnant while (true) 671cbbf633eSHoward Hinnant { 672cbbf633eSHoward Hinnant int n2 = swprintf(&s[0], s.size()+1, L"%f", val); 673cbbf633eSHoward Hinnant if (n2 > 0) 674cbbf633eSHoward Hinnant { 675cbbf633eSHoward Hinnant s.resize(n2); 676cbbf633eSHoward Hinnant break; 677cbbf633eSHoward Hinnant } 678cbbf633eSHoward Hinnant s.resize(2*s.size()); 679cbbf633eSHoward Hinnant s.resize(s.capacity()); 680cbbf633eSHoward Hinnant } 681cbbf633eSHoward Hinnant return s; 682cbbf633eSHoward Hinnant } 683cbbf633eSHoward Hinnant 684cbbf633eSHoward Hinnant wstring to_wstring(double val) 685cbbf633eSHoward Hinnant { 686cbbf633eSHoward Hinnant const size_t n = 20; 687cbbf633eSHoward Hinnant wstring s(n, wchar_t()); 688cbbf633eSHoward Hinnant s.resize(s.capacity()); 689cbbf633eSHoward Hinnant while (true) 690cbbf633eSHoward Hinnant { 691cbbf633eSHoward Hinnant int n2 = swprintf(&s[0], s.size()+1, L"%f", val); 692cbbf633eSHoward Hinnant if (n2 > 0) 693cbbf633eSHoward Hinnant { 694cbbf633eSHoward Hinnant s.resize(n2); 695cbbf633eSHoward Hinnant break; 696cbbf633eSHoward Hinnant } 697cbbf633eSHoward Hinnant s.resize(2*s.size()); 698cbbf633eSHoward Hinnant s.resize(s.capacity()); 699cbbf633eSHoward Hinnant } 700cbbf633eSHoward Hinnant return s; 701cbbf633eSHoward Hinnant } 702cbbf633eSHoward Hinnant 703cbbf633eSHoward Hinnant wstring to_wstring(long double val) 704cbbf633eSHoward Hinnant { 705cbbf633eSHoward Hinnant const size_t n = 20; 706cbbf633eSHoward Hinnant wstring s(n, wchar_t()); 707cbbf633eSHoward Hinnant s.resize(s.capacity()); 708cbbf633eSHoward Hinnant while (true) 709cbbf633eSHoward Hinnant { 710cbbf633eSHoward Hinnant int n2 = swprintf(&s[0], s.size()+1, L"%Lf", val); 711cbbf633eSHoward Hinnant if (n2 > 0) 712cbbf633eSHoward Hinnant { 713cbbf633eSHoward Hinnant s.resize(n2); 714cbbf633eSHoward Hinnant break; 715cbbf633eSHoward Hinnant } 716cbbf633eSHoward Hinnant s.resize(2*s.size()); 717cbbf633eSHoward Hinnant s.resize(s.capacity()); 718cbbf633eSHoward Hinnant } 719cbbf633eSHoward Hinnant return s; 720cbbf633eSHoward Hinnant } 721cbbf633eSHoward Hinnant 722cbbf633eSHoward Hinnant _LIBCPP_END_NAMESPACE_STD 723