string.cpp revision 246468
1227825Stheraven//===------------------------- string.cpp ---------------------------------===// 2227825Stheraven// 3227825Stheraven// The LLVM Compiler Infrastructure 4227825Stheraven// 5227825Stheraven// This file is dual licensed under the MIT and the University of Illinois Open 6227825Stheraven// Source Licenses. See LICENSE.TXT for details. 7227825Stheraven// 8227825Stheraven//===----------------------------------------------------------------------===// 9227825Stheraven 10227825Stheraven#include "string" 11227825Stheraven#include "cstdlib" 12227825Stheraven#include "cwchar" 13227825Stheraven#include "cerrno" 14227825Stheraven#if _WIN32 15227825Stheraven#include "support/win32/support.h" 16227825Stheraven#endif // _WIN32 17227825Stheraven 18227825Stheraven_LIBCPP_BEGIN_NAMESPACE_STD 19227825Stheraven 20227825Stheraventemplate class __basic_string_common<true>; 21227825Stheraven 22227825Stheraventemplate class basic_string<char>; 23227825Stheraventemplate class basic_string<wchar_t>; 24227825Stheraven 25227825Stheraventemplate 26227825Stheraven string 27227825Stheraven operator+<char, char_traits<char>, allocator<char> >(char const*, string const&); 28227825Stheraven 29227825Stheravenint 30227825Stheravenstoi(const string& str, size_t* idx, int base) 31227825Stheraven{ 32227825Stheraven char* ptr; 33227825Stheraven const char* const p = str.c_str(); 34246468Stheraven typename remove_reference<decltype(errno)>::type errno_save = errno; 35246468Stheraven errno = 0; 36227825Stheraven long r = strtol(p, &ptr, base); 37246468Stheraven swap(errno, errno_save); 38227825Stheraven#ifndef _LIBCPP_NO_EXCEPTIONS 39246468Stheraven if (errno_save == ERANGE || r < numeric_limits<int>::min() || 40246468Stheraven numeric_limits<int>::max() < r) 41227825Stheraven throw out_of_range("stoi: out of range"); 42246468Stheraven if (ptr == p) 43246468Stheraven throw invalid_argument("stoi: no conversion"); 44227825Stheraven#endif // _LIBCPP_NO_EXCEPTIONS 45227825Stheraven if (idx) 46227825Stheraven *idx = static_cast<size_t>(ptr - p); 47227825Stheraven return static_cast<int>(r); 48227825Stheraven} 49227825Stheraven 50227825Stheravenint 51227825Stheravenstoi(const wstring& str, size_t* idx, int base) 52227825Stheraven{ 53227825Stheraven wchar_t* ptr; 54227825Stheraven const wchar_t* const p = str.c_str(); 55246468Stheraven typename remove_reference<decltype(errno)>::type errno_save = errno; 56246468Stheraven errno = 0; 57227825Stheraven long r = wcstol(p, &ptr, base); 58246468Stheraven swap(errno, errno_save); 59227825Stheraven#ifndef _LIBCPP_NO_EXCEPTIONS 60246468Stheraven if (errno_save == ERANGE || r < numeric_limits<int>::min() || 61246468Stheraven numeric_limits<int>::max() < r) 62227825Stheraven throw out_of_range("stoi: out of range"); 63246468Stheraven if (ptr == p) 64246468Stheraven throw invalid_argument("stoi: no conversion"); 65227825Stheraven#endif // _LIBCPP_NO_EXCEPTIONS 66227825Stheraven if (idx) 67227825Stheraven *idx = static_cast<size_t>(ptr - p); 68227825Stheraven return static_cast<int>(r); 69227825Stheraven} 70227825Stheraven 71227825Stheravenlong 72227825Stheravenstol(const string& str, size_t* idx, int base) 73227825Stheraven{ 74227825Stheraven char* ptr; 75227825Stheraven const char* const p = str.c_str(); 76246468Stheraven typename remove_reference<decltype(errno)>::type errno_save = errno; 77246468Stheraven errno = 0; 78227825Stheraven long r = strtol(p, &ptr, base); 79246468Stheraven swap(errno, errno_save); 80227825Stheraven#ifndef _LIBCPP_NO_EXCEPTIONS 81246468Stheraven if (errno_save == ERANGE) 82227825Stheraven throw out_of_range("stol: out of range"); 83246468Stheraven if (ptr == p) 84246468Stheraven throw invalid_argument("stol: no conversion"); 85227825Stheraven#endif // _LIBCPP_NO_EXCEPTIONS 86227825Stheraven if (idx) 87227825Stheraven *idx = static_cast<size_t>(ptr - p); 88227825Stheraven return r; 89227825Stheraven} 90227825Stheraven 91227825Stheravenlong 92227825Stheravenstol(const wstring& str, size_t* idx, int base) 93227825Stheraven{ 94227825Stheraven wchar_t* ptr; 95227825Stheraven const wchar_t* const p = str.c_str(); 96246468Stheraven typename remove_reference<decltype(errno)>::type errno_save = errno; 97246468Stheraven errno = 0; 98227825Stheraven long r = wcstol(p, &ptr, base); 99246468Stheraven swap(errno, errno_save); 100227825Stheraven#ifndef _LIBCPP_NO_EXCEPTIONS 101246468Stheraven if (errno_save == ERANGE) 102227825Stheraven throw out_of_range("stol: out of range"); 103246468Stheraven if (ptr == p) 104246468Stheraven throw invalid_argument("stol: no conversion"); 105227825Stheraven#endif // _LIBCPP_NO_EXCEPTIONS 106227825Stheraven if (idx) 107227825Stheraven *idx = static_cast<size_t>(ptr - p); 108227825Stheraven return r; 109227825Stheraven} 110227825Stheraven 111227825Stheravenunsigned long 112227825Stheravenstoul(const string& str, size_t* idx, int base) 113227825Stheraven{ 114227825Stheraven char* ptr; 115227825Stheraven const char* const p = str.c_str(); 116246468Stheraven typename remove_reference<decltype(errno)>::type errno_save = errno; 117246468Stheraven errno = 0; 118227825Stheraven unsigned long r = strtoul(p, &ptr, base); 119246468Stheraven swap(errno, errno_save); 120227825Stheraven#ifndef _LIBCPP_NO_EXCEPTIONS 121246468Stheraven if (errno_save == ERANGE) 122227825Stheraven throw out_of_range("stoul: out of range"); 123246468Stheraven if (ptr == p) 124246468Stheraven throw invalid_argument("stoul: no conversion"); 125227825Stheraven#endif // _LIBCPP_NO_EXCEPTIONS 126227825Stheraven if (idx) 127227825Stheraven *idx = static_cast<size_t>(ptr - p); 128227825Stheraven return r; 129227825Stheraven} 130227825Stheraven 131227825Stheravenunsigned long 132227825Stheravenstoul(const wstring& str, size_t* idx, int base) 133227825Stheraven{ 134227825Stheraven wchar_t* ptr; 135227825Stheraven const wchar_t* const p = str.c_str(); 136246468Stheraven typename remove_reference<decltype(errno)>::type errno_save = errno; 137246468Stheraven errno = 0; 138227825Stheraven unsigned long r = wcstoul(p, &ptr, base); 139246468Stheraven swap(errno, errno_save); 140227825Stheraven#ifndef _LIBCPP_NO_EXCEPTIONS 141246468Stheraven if (errno_save == ERANGE) 142227825Stheraven throw out_of_range("stoul: out of range"); 143246468Stheraven if (ptr == p) 144246468Stheraven throw invalid_argument("stoul: no conversion"); 145227825Stheraven#endif // _LIBCPP_NO_EXCEPTIONS 146227825Stheraven if (idx) 147227825Stheraven *idx = static_cast<size_t>(ptr - p); 148227825Stheraven return r; 149227825Stheraven} 150227825Stheraven 151227825Stheravenlong long 152227825Stheravenstoll(const string& str, size_t* idx, int base) 153227825Stheraven{ 154227825Stheraven char* ptr; 155227825Stheraven const char* const p = str.c_str(); 156246468Stheraven typename remove_reference<decltype(errno)>::type errno_save = errno; 157246468Stheraven errno = 0; 158227825Stheraven long long r = strtoll(p, &ptr, base); 159246468Stheraven swap(errno, errno_save); 160227825Stheraven#ifndef _LIBCPP_NO_EXCEPTIONS 161246468Stheraven if (errno_save == ERANGE) 162227825Stheraven throw out_of_range("stoll: out of range"); 163246468Stheraven if (ptr == p) 164246468Stheraven throw invalid_argument("stoll: no conversion"); 165227825Stheraven#endif // _LIBCPP_NO_EXCEPTIONS 166227825Stheraven if (idx) 167227825Stheraven *idx = static_cast<size_t>(ptr - p); 168227825Stheraven return r; 169227825Stheraven} 170227825Stheraven 171227825Stheravenlong long 172227825Stheravenstoll(const wstring& str, size_t* idx, int base) 173227825Stheraven{ 174227825Stheraven wchar_t* ptr; 175227825Stheraven const wchar_t* const p = str.c_str(); 176246468Stheraven typename remove_reference<decltype(errno)>::type errno_save = errno; 177246468Stheraven errno = 0; 178227825Stheraven long long r = wcstoll(p, &ptr, base); 179246468Stheraven swap(errno, errno_save); 180227825Stheraven#ifndef _LIBCPP_NO_EXCEPTIONS 181246468Stheraven if (errno_save == ERANGE) 182227825Stheraven throw out_of_range("stoll: out of range"); 183246468Stheraven if (ptr == p) 184246468Stheraven throw invalid_argument("stoll: no conversion"); 185227825Stheraven#endif // _LIBCPP_NO_EXCEPTIONS 186227825Stheraven if (idx) 187227825Stheraven *idx = static_cast<size_t>(ptr - p); 188227825Stheraven return r; 189227825Stheraven} 190227825Stheraven 191227825Stheravenunsigned long long 192227825Stheravenstoull(const string& str, size_t* idx, int base) 193227825Stheraven{ 194227825Stheraven char* ptr; 195227825Stheraven const char* const p = str.c_str(); 196246468Stheraven typename remove_reference<decltype(errno)>::type errno_save = errno; 197246468Stheraven errno = 0; 198227825Stheraven unsigned long long r = strtoull(p, &ptr, base); 199246468Stheraven swap(errno, errno_save); 200227825Stheraven#ifndef _LIBCPP_NO_EXCEPTIONS 201246468Stheraven if (errno_save == ERANGE) 202227825Stheraven throw out_of_range("stoull: out of range"); 203246468Stheraven if (ptr == p) 204246468Stheraven throw invalid_argument("stoull: no conversion"); 205227825Stheraven#endif // _LIBCPP_NO_EXCEPTIONS 206227825Stheraven if (idx) 207227825Stheraven *idx = static_cast<size_t>(ptr - p); 208227825Stheraven return r; 209227825Stheraven} 210227825Stheraven 211227825Stheravenunsigned long long 212227825Stheravenstoull(const wstring& str, size_t* idx, int base) 213227825Stheraven{ 214227825Stheraven wchar_t* ptr; 215227825Stheraven const wchar_t* const p = str.c_str(); 216246468Stheraven typename remove_reference<decltype(errno)>::type errno_save = errno; 217246468Stheraven errno = 0; 218227825Stheraven unsigned long long r = wcstoull(p, &ptr, base); 219246468Stheraven swap(errno, errno_save); 220227825Stheraven#ifndef _LIBCPP_NO_EXCEPTIONS 221246468Stheraven if (errno_save == ERANGE) 222227825Stheraven throw out_of_range("stoull: out of range"); 223246468Stheraven if (ptr == p) 224246468Stheraven throw invalid_argument("stoull: no conversion"); 225227825Stheraven#endif // _LIBCPP_NO_EXCEPTIONS 226227825Stheraven if (idx) 227227825Stheraven *idx = static_cast<size_t>(ptr - p); 228227825Stheraven return r; 229227825Stheraven} 230227825Stheraven 231227825Stheravenfloat 232227825Stheravenstof(const string& str, size_t* idx) 233227825Stheraven{ 234227825Stheraven char* ptr; 235227825Stheraven const char* const p = str.c_str(); 236246468Stheraven typename remove_reference<decltype(errno)>::type errno_save = errno; 237227825Stheraven errno = 0; 238246468Stheraven float r = strtof(p, &ptr); 239227825Stheraven swap(errno, errno_save); 240227825Stheraven#ifndef _LIBCPP_NO_EXCEPTIONS 241227825Stheraven if (errno_save == ERANGE) 242227825Stheraven throw out_of_range("stof: out of range"); 243227825Stheraven if (ptr == p) 244227825Stheraven throw invalid_argument("stof: no conversion"); 245227825Stheraven#endif // _LIBCPP_NO_EXCEPTIONS 246227825Stheraven if (idx) 247227825Stheraven *idx = static_cast<size_t>(ptr - p); 248246468Stheraven return r; 249227825Stheraven} 250227825Stheraven 251227825Stheravenfloat 252227825Stheravenstof(const wstring& str, size_t* idx) 253227825Stheraven{ 254227825Stheraven wchar_t* ptr; 255227825Stheraven const wchar_t* const p = str.c_str(); 256246468Stheraven typename remove_reference<decltype(errno)>::type errno_save = errno; 257227825Stheraven errno = 0; 258246468Stheraven float r = wcstof(p, &ptr); 259227825Stheraven swap(errno, errno_save); 260227825Stheraven#ifndef _LIBCPP_NO_EXCEPTIONS 261227825Stheraven if (errno_save == ERANGE) 262227825Stheraven throw out_of_range("stof: out of range"); 263227825Stheraven if (ptr == p) 264227825Stheraven throw invalid_argument("stof: no conversion"); 265227825Stheraven#endif // _LIBCPP_NO_EXCEPTIONS 266227825Stheraven if (idx) 267227825Stheraven *idx = static_cast<size_t>(ptr - p); 268246468Stheraven return r; 269227825Stheraven} 270227825Stheraven 271227825Stheravendouble 272227825Stheravenstod(const string& str, size_t* idx) 273227825Stheraven{ 274227825Stheraven char* ptr; 275227825Stheraven const char* const p = str.c_str(); 276246468Stheraven typename remove_reference<decltype(errno)>::type errno_save = errno; 277227825Stheraven errno = 0; 278227825Stheraven double r = strtod(p, &ptr); 279227825Stheraven swap(errno, errno_save); 280227825Stheraven#ifndef _LIBCPP_NO_EXCEPTIONS 281227825Stheraven if (errno_save == ERANGE) 282227825Stheraven throw out_of_range("stod: out of range"); 283227825Stheraven if (ptr == p) 284227825Stheraven throw invalid_argument("stod: no conversion"); 285227825Stheraven#endif // _LIBCPP_NO_EXCEPTIONS 286227825Stheraven if (idx) 287227825Stheraven *idx = static_cast<size_t>(ptr - p); 288227825Stheraven return r; 289227825Stheraven} 290227825Stheraven 291227825Stheravendouble 292227825Stheravenstod(const wstring& str, size_t* idx) 293227825Stheraven{ 294227825Stheraven wchar_t* ptr; 295227825Stheraven const wchar_t* const p = str.c_str(); 296246468Stheraven typename remove_reference<decltype(errno)>::type errno_save = errno; 297227825Stheraven errno = 0; 298227825Stheraven double r = wcstod(p, &ptr); 299227825Stheraven swap(errno, errno_save); 300227825Stheraven#ifndef _LIBCPP_NO_EXCEPTIONS 301227825Stheraven if (errno_save == ERANGE) 302227825Stheraven throw out_of_range("stod: out of range"); 303227825Stheraven if (ptr == p) 304227825Stheraven throw invalid_argument("stod: no conversion"); 305227825Stheraven#endif // _LIBCPP_NO_EXCEPTIONS 306227825Stheraven if (idx) 307227825Stheraven *idx = static_cast<size_t>(ptr - p); 308227825Stheraven return r; 309227825Stheraven} 310227825Stheraven 311227825Stheravenlong double 312227825Stheravenstold(const string& str, size_t* idx) 313227825Stheraven{ 314227825Stheraven char* ptr; 315227825Stheraven const char* const p = str.c_str(); 316246468Stheraven typename remove_reference<decltype(errno)>::type errno_save = errno; 317227825Stheraven errno = 0; 318227825Stheraven long double r = strtold(p, &ptr); 319227825Stheraven swap(errno, errno_save); 320227825Stheraven#ifndef _LIBCPP_NO_EXCEPTIONS 321227825Stheraven if (errno_save == ERANGE) 322227825Stheraven throw out_of_range("stold: out of range"); 323227825Stheraven if (ptr == p) 324227825Stheraven throw invalid_argument("stold: no conversion"); 325227825Stheraven#endif // _LIBCPP_NO_EXCEPTIONS 326227825Stheraven if (idx) 327227825Stheraven *idx = static_cast<size_t>(ptr - p); 328227825Stheraven return r; 329227825Stheraven} 330227825Stheraven 331227825Stheravenlong double 332227825Stheravenstold(const wstring& str, size_t* idx) 333227825Stheraven{ 334227825Stheraven wchar_t* ptr; 335227825Stheraven const wchar_t* const p = str.c_str(); 336246468Stheraven typename remove_reference<decltype(errno)>::type errno_save = errno; 337227825Stheraven errno = 0; 338227825Stheraven long double r = wcstold(p, &ptr); 339227825Stheraven swap(errno, errno_save); 340227825Stheraven#ifndef _LIBCPP_NO_EXCEPTIONS 341227825Stheraven if (errno_save == ERANGE) 342227825Stheraven throw out_of_range("stold: out of range"); 343227825Stheraven if (ptr == p) 344227825Stheraven throw invalid_argument("stold: no conversion"); 345227825Stheraven#endif // _LIBCPP_NO_EXCEPTIONS 346227825Stheraven if (idx) 347227825Stheraven *idx = static_cast<size_t>(ptr - p); 348227825Stheraven return r; 349227825Stheraven} 350227825Stheraven 351227825Stheravenstring to_string(int val) 352227825Stheraven{ 353227825Stheraven string s; 354227825Stheraven s.resize(s.capacity()); 355227825Stheraven while (true) 356227825Stheraven { 357232924Stheraven size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%d", val)); 358227825Stheraven if (n2 <= s.size()) 359227825Stheraven { 360227825Stheraven s.resize(n2); 361227825Stheraven break; 362227825Stheraven } 363227825Stheraven s.resize(n2); 364227825Stheraven } 365227825Stheraven return s; 366227825Stheraven} 367227825Stheraven 368227825Stheravenstring to_string(unsigned val) 369227825Stheraven{ 370227825Stheraven string s; 371227825Stheraven s.resize(s.capacity()); 372227825Stheraven while (true) 373227825Stheraven { 374232924Stheraven size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%u", val)); 375227825Stheraven if (n2 <= s.size()) 376227825Stheraven { 377227825Stheraven s.resize(n2); 378227825Stheraven break; 379227825Stheraven } 380227825Stheraven s.resize(n2); 381227825Stheraven } 382227825Stheraven return s; 383227825Stheraven} 384227825Stheraven 385227825Stheravenstring to_string(long val) 386227825Stheraven{ 387227825Stheraven string s; 388227825Stheraven s.resize(s.capacity()); 389227825Stheraven while (true) 390227825Stheraven { 391232924Stheraven size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%ld", val)); 392227825Stheraven if (n2 <= s.size()) 393227825Stheraven { 394227825Stheraven s.resize(n2); 395227825Stheraven break; 396227825Stheraven } 397227825Stheraven s.resize(n2); 398227825Stheraven } 399227825Stheraven return s; 400227825Stheraven} 401227825Stheraven 402227825Stheravenstring to_string(unsigned long val) 403227825Stheraven{ 404227825Stheraven string s; 405227825Stheraven s.resize(s.capacity()); 406227825Stheraven while (true) 407227825Stheraven { 408232924Stheraven size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%lu", val)); 409227825Stheraven if (n2 <= s.size()) 410227825Stheraven { 411227825Stheraven s.resize(n2); 412227825Stheraven break; 413227825Stheraven } 414227825Stheraven s.resize(n2); 415227825Stheraven } 416227825Stheraven return s; 417227825Stheraven} 418227825Stheraven 419227825Stheravenstring to_string(long long val) 420227825Stheraven{ 421227825Stheraven string s; 422227825Stheraven s.resize(s.capacity()); 423227825Stheraven while (true) 424227825Stheraven { 425232924Stheraven size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%lld", val)); 426227825Stheraven if (n2 <= s.size()) 427227825Stheraven { 428227825Stheraven s.resize(n2); 429227825Stheraven break; 430227825Stheraven } 431227825Stheraven s.resize(n2); 432227825Stheraven } 433227825Stheraven return s; 434227825Stheraven} 435227825Stheraven 436227825Stheravenstring to_string(unsigned long long val) 437227825Stheraven{ 438227825Stheraven string s; 439227825Stheraven s.resize(s.capacity()); 440227825Stheraven while (true) 441227825Stheraven { 442232924Stheraven size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%llu", val)); 443227825Stheraven if (n2 <= s.size()) 444227825Stheraven { 445227825Stheraven s.resize(n2); 446227825Stheraven break; 447227825Stheraven } 448227825Stheraven s.resize(n2); 449227825Stheraven } 450227825Stheraven return s; 451227825Stheraven} 452227825Stheraven 453227825Stheravenstring to_string(float val) 454227825Stheraven{ 455227825Stheraven string s; 456227825Stheraven s.resize(s.capacity()); 457227825Stheraven while (true) 458227825Stheraven { 459232924Stheraven size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%f", val)); 460227825Stheraven if (n2 <= s.size()) 461227825Stheraven { 462227825Stheraven s.resize(n2); 463227825Stheraven break; 464227825Stheraven } 465227825Stheraven s.resize(n2); 466227825Stheraven } 467227825Stheraven return s; 468227825Stheraven} 469227825Stheraven 470227825Stheravenstring to_string(double val) 471227825Stheraven{ 472227825Stheraven string s; 473227825Stheraven s.resize(s.capacity()); 474227825Stheraven while (true) 475227825Stheraven { 476232924Stheraven size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%f", val)); 477227825Stheraven if (n2 <= s.size()) 478227825Stheraven { 479227825Stheraven s.resize(n2); 480227825Stheraven break; 481227825Stheraven } 482227825Stheraven s.resize(n2); 483227825Stheraven } 484227825Stheraven return s; 485227825Stheraven} 486227825Stheraven 487227825Stheravenstring to_string(long double val) 488227825Stheraven{ 489227825Stheraven string s; 490227825Stheraven s.resize(s.capacity()); 491227825Stheraven while (true) 492227825Stheraven { 493232924Stheraven size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%Lf", val)); 494227825Stheraven if (n2 <= s.size()) 495227825Stheraven { 496227825Stheraven s.resize(n2); 497227825Stheraven break; 498227825Stheraven } 499227825Stheraven s.resize(n2); 500227825Stheraven } 501227825Stheraven return s; 502227825Stheraven} 503227825Stheraven 504227825Stheravenwstring to_wstring(int val) 505227825Stheraven{ 506227825Stheraven const size_t n = (numeric_limits<int>::digits / 3) 507227825Stheraven + ((numeric_limits<int>::digits % 3) != 0) 508227825Stheraven + 1; 509227825Stheraven wstring s(n, wchar_t()); 510227825Stheraven s.resize(s.capacity()); 511227825Stheraven while (true) 512227825Stheraven { 513227825Stheraven int n2 = swprintf(&s[0], s.size()+1, L"%d", val); 514227825Stheraven if (n2 > 0) 515227825Stheraven { 516232924Stheraven s.resize(static_cast<size_t>(n2)); 517227825Stheraven break; 518227825Stheraven } 519227825Stheraven s.resize(2*s.size()); 520227825Stheraven s.resize(s.capacity()); 521227825Stheraven } 522227825Stheraven return s; 523227825Stheraven} 524227825Stheraven 525227825Stheravenwstring to_wstring(unsigned val) 526227825Stheraven{ 527227825Stheraven const size_t n = (numeric_limits<unsigned>::digits / 3) 528227825Stheraven + ((numeric_limits<unsigned>::digits % 3) != 0) 529227825Stheraven + 1; 530227825Stheraven wstring s(n, wchar_t()); 531227825Stheraven s.resize(s.capacity()); 532227825Stheraven while (true) 533227825Stheraven { 534227825Stheraven int n2 = swprintf(&s[0], s.size()+1, L"%u", val); 535227825Stheraven if (n2 > 0) 536227825Stheraven { 537232924Stheraven s.resize(static_cast<size_t>(n2)); 538227825Stheraven break; 539227825Stheraven } 540227825Stheraven s.resize(2*s.size()); 541227825Stheraven s.resize(s.capacity()); 542227825Stheraven } 543227825Stheraven return s; 544227825Stheraven} 545227825Stheraven 546227825Stheravenwstring to_wstring(long val) 547227825Stheraven{ 548227825Stheraven const size_t n = (numeric_limits<long>::digits / 3) 549227825Stheraven + ((numeric_limits<long>::digits % 3) != 0) 550227825Stheraven + 1; 551227825Stheraven wstring s(n, wchar_t()); 552227825Stheraven s.resize(s.capacity()); 553227825Stheraven while (true) 554227825Stheraven { 555227825Stheraven int n2 = swprintf(&s[0], s.size()+1, L"%ld", val); 556227825Stheraven if (n2 > 0) 557227825Stheraven { 558232924Stheraven s.resize(static_cast<size_t>(n2)); 559227825Stheraven break; 560227825Stheraven } 561227825Stheraven s.resize(2*s.size()); 562227825Stheraven s.resize(s.capacity()); 563227825Stheraven } 564227825Stheraven return s; 565227825Stheraven} 566227825Stheraven 567227825Stheravenwstring to_wstring(unsigned long val) 568227825Stheraven{ 569227825Stheraven const size_t n = (numeric_limits<unsigned long>::digits / 3) 570227825Stheraven + ((numeric_limits<unsigned long>::digits % 3) != 0) 571227825Stheraven + 1; 572227825Stheraven wstring s(n, wchar_t()); 573227825Stheraven s.resize(s.capacity()); 574227825Stheraven while (true) 575227825Stheraven { 576227825Stheraven int n2 = swprintf(&s[0], s.size()+1, L"%lu", val); 577227825Stheraven if (n2 > 0) 578227825Stheraven { 579232924Stheraven s.resize(static_cast<size_t>(n2)); 580227825Stheraven break; 581227825Stheraven } 582227825Stheraven s.resize(2*s.size()); 583227825Stheraven s.resize(s.capacity()); 584227825Stheraven } 585227825Stheraven return s; 586227825Stheraven} 587227825Stheraven 588227825Stheravenwstring to_wstring(long long val) 589227825Stheraven{ 590227825Stheraven const size_t n = (numeric_limits<long long>::digits / 3) 591227825Stheraven + ((numeric_limits<long long>::digits % 3) != 0) 592227825Stheraven + 1; 593227825Stheraven wstring s(n, wchar_t()); 594227825Stheraven s.resize(s.capacity()); 595227825Stheraven while (true) 596227825Stheraven { 597227825Stheraven int n2 = swprintf(&s[0], s.size()+1, L"%lld", val); 598227825Stheraven if (n2 > 0) 599227825Stheraven { 600232924Stheraven s.resize(static_cast<size_t>(n2)); 601227825Stheraven break; 602227825Stheraven } 603227825Stheraven s.resize(2*s.size()); 604227825Stheraven s.resize(s.capacity()); 605227825Stheraven } 606227825Stheraven return s; 607227825Stheraven} 608227825Stheraven 609227825Stheravenwstring to_wstring(unsigned long long val) 610227825Stheraven{ 611227825Stheraven const size_t n = (numeric_limits<unsigned long long>::digits / 3) 612227825Stheraven + ((numeric_limits<unsigned long long>::digits % 3) != 0) 613227825Stheraven + 1; 614227825Stheraven wstring s(n, wchar_t()); 615227825Stheraven s.resize(s.capacity()); 616227825Stheraven while (true) 617227825Stheraven { 618227825Stheraven int n2 = swprintf(&s[0], s.size()+1, L"%llu", val); 619227825Stheraven if (n2 > 0) 620227825Stheraven { 621232924Stheraven s.resize(static_cast<size_t>(n2)); 622227825Stheraven break; 623227825Stheraven } 624227825Stheraven s.resize(2*s.size()); 625227825Stheraven s.resize(s.capacity()); 626227825Stheraven } 627227825Stheraven return s; 628227825Stheraven} 629227825Stheraven 630227825Stheravenwstring to_wstring(float val) 631227825Stheraven{ 632227825Stheraven const size_t n = 20; 633227825Stheraven wstring s(n, wchar_t()); 634227825Stheraven s.resize(s.capacity()); 635227825Stheraven while (true) 636227825Stheraven { 637227825Stheraven int n2 = swprintf(&s[0], s.size()+1, L"%f", val); 638227825Stheraven if (n2 > 0) 639227825Stheraven { 640232924Stheraven s.resize(static_cast<size_t>(n2)); 641227825Stheraven break; 642227825Stheraven } 643227825Stheraven s.resize(2*s.size()); 644227825Stheraven s.resize(s.capacity()); 645227825Stheraven } 646227825Stheraven return s; 647227825Stheraven} 648227825Stheraven 649227825Stheravenwstring to_wstring(double val) 650227825Stheraven{ 651227825Stheraven const size_t n = 20; 652227825Stheraven wstring s(n, wchar_t()); 653227825Stheraven s.resize(s.capacity()); 654227825Stheraven while (true) 655227825Stheraven { 656227825Stheraven int n2 = swprintf(&s[0], s.size()+1, L"%f", val); 657227825Stheraven if (n2 > 0) 658227825Stheraven { 659232924Stheraven s.resize(static_cast<size_t>(n2)); 660227825Stheraven break; 661227825Stheraven } 662227825Stheraven s.resize(2*s.size()); 663227825Stheraven s.resize(s.capacity()); 664227825Stheraven } 665227825Stheraven return s; 666227825Stheraven} 667227825Stheraven 668227825Stheravenwstring to_wstring(long double val) 669227825Stheraven{ 670227825Stheraven const size_t n = 20; 671227825Stheraven wstring s(n, wchar_t()); 672227825Stheraven s.resize(s.capacity()); 673227825Stheraven while (true) 674227825Stheraven { 675227825Stheraven int n2 = swprintf(&s[0], s.size()+1, L"%Lf", val); 676227825Stheraven if (n2 > 0) 677227825Stheraven { 678232924Stheraven s.resize(static_cast<size_t>(n2)); 679227825Stheraven break; 680227825Stheraven } 681227825Stheraven s.resize(2*s.size()); 682227825Stheraven s.resize(s.capacity()); 683227825Stheraven } 684227825Stheraven return s; 685227825Stheraven} 686227825Stheraven 687227825Stheraven_LIBCPP_END_NAMESPACE_STD 688