string.cpp revision 253159
150276Speter//===------------------------- string.cpp ---------------------------------===// 2176187Srafan// 350276Speter// The LLVM Compiler Infrastructure 450276Speter// 550276Speter// This file is dual licensed under the MIT and the University of Illinois Open 650276Speter// Source Licenses. See LICENSE.TXT for details. 750276Speter// 850276Speter//===----------------------------------------------------------------------===// 950276Speter 1050276Speter#include "string" 1150276Speter#include "cstdlib" 1250276Speter#include "cwchar" 1350276Speter#include "cerrno" 1450276Speter#include "limits" 1550276Speter#include "stdexcept" 1650276Speter#ifdef _WIN32 1750276Speter#include "support/win32/support.h" 1850276Speter#endif // _WIN32 1950276Speter 2050276Speter_LIBCPP_BEGIN_NAMESPACE_STD 2150276Speter 2250276Spetertemplate class __basic_string_common<true>; 2350276Speter 2450276Spetertemplate class basic_string<char>; 2550276Spetertemplate class basic_string<wchar_t>; 2650276Speter 2750276Spetertemplate 2850276Speter string 2950276Speter operator+<char, char_traits<char>, allocator<char> >(char const*, string const&); 3050276Speter 3150276Speternamespace 3250276Speter{ 3350276Speter 3450276Spetertemplate<typename T> 3550276Speterinline 3650276Spetervoid throw_helper( const string& msg ) 3750276Speter{ 3850276Speter#ifndef _LIBCPP_NO_EXCEPTIONS 39184989Srafan throw T( msg ); 4050276Speter#else 41166124Srafan abort(); 42166124Srafan#endif 4350276Speter} 4450276Speter 4550276Speterinline 4650276Spetervoid throw_from_string_out_of_range( const string& func ) 4750276Speter{ 4850276Speter throw_helper<out_of_range>(func + ": out of range"); 4950276Speter} 5050276Speter 5150276Speterinline 5250276Spetervoid throw_from_string_invalid_arg( const string& func ) 5350276Speter{ 54166124Srafan throw_helper<invalid_argument>(func + ": no conversion"); 5550276Speter} 56166124Srafan 5797049Speter// as_integer 5850276Speter 5950276Spetertemplate<typename V, typename S, typename F> 60166124Srafaninline 61166124SrafanV 6250276Speteras_integer_helper(const string& func, const S& str, size_t* idx, int base, F f) 63166124Srafan{ 64166124Srafan typename S::value_type* ptr; 65166124Srafan const typename S::value_type* const p = str.c_str(); 66166124Srafan typename remove_reference<decltype(errno)>::type errno_save = errno; 6797049Speter errno = 0; 68166124Srafan V r = f(p, &ptr, base); 69166124Srafan swap(errno, errno_save); 70166124Srafan if (errno_save == ERANGE) 71166124Srafan throw_from_string_out_of_range(func); 7262449Speter if (ptr == p) 7397049Speter throw_from_string_invalid_arg(func); 74166124Srafan if (idx) 7562449Speter *idx = static_cast<size_t>(ptr - p); 76166124Srafan return r; 77166124Srafan} 78166124Srafan 79166124Srafantemplate<typename V, typename S> 80166124Srafaninline 81166124SrafanV 82166124Srafanas_integer(const string& func, const S& s, size_t* idx, int base); 83166124Srafan 84166124Srafan// string 85166124Srafantemplate<> 8697049Speterinline 87166124Srafanint 8862449Speteras_integer(const string& func, const string& s, size_t* idx, int base ) 8950276Speter{ 90166124Srafan // Use long as no Stantard string to integer exists. 91166124Srafan long r = as_integer_helper<long>( func, s, idx, base, strtol ); 92166124Srafan if (r < numeric_limits<int>::min() || numeric_limits<int>::max() < r) 93166124Srafan throw_from_string_out_of_range(func); 94166124Srafan return static_cast<int>(r); 95166124Srafan} 96166124Srafan 97166124Srafantemplate<> 9862449Speterinline 9962449Speterlong 10050276Speteras_integer(const string& func, const string& s, size_t* idx, int base ) 10150276Speter{ 10297049Speter return as_integer_helper<long>( func, s, idx, base, strtol ); 10397049Speter} 10450276Speter 10550276Spetertemplate<> 10662449Speterinline 10750276Speterunsigned long 10850276Speteras_integer( const string& func, const string& s, size_t* idx, int base ) 10950276Speter{ 11050276Speter return as_integer_helper<unsigned long>( func, s, idx, base, strtoul ); 11150276Speter} 11250276Speter 11350276Spetertemplate<> 11450276Speterinline 11550276Speterlong long 11650276Speteras_integer( const string& func, const string& s, size_t* idx, int base ) 11750276Speter{ 11850276Speter return as_integer_helper<long long>( func, s, idx, base, strtoll ); 11950276Speter} 12050276Speter 12150276Spetertemplate<> 12262449Speterinline 12350276Speterunsigned long long 12450276Speteras_integer( const string& func, const string& s, size_t* idx, int base ) 125166124Srafan{ 126166124Srafan return as_integer_helper<unsigned long long>( func, s, idx, base, strtoull ); 127166124Srafan} 128166124Srafan 129166124Srafan// wstring 130166124Srafantemplate<> 131166124Srafaninline 132166124Srafanint 133166124Srafanas_integer( const string& func, const wstring& s, size_t* idx, int base ) 134166124Srafan{ 135166124Srafan // Use long as no Stantard string to integer exists. 136166124Srafan long r = as_integer_helper<long>( func, s, idx, base, wcstol ); 137166124Srafan if (r < numeric_limits<int>::min() || numeric_limits<int>::max() < r) 138166124Srafan throw_from_string_out_of_range(func); 139166124Srafan return static_cast<int>(r); 140166124Srafan} 141166124Srafan 142166124Srafantemplate<> 143166124Srafaninline 144166124Srafanlong 145166124Srafanas_integer( const string& func, const wstring& s, size_t* idx, int base ) 146166124Srafan{ 147166124Srafan return as_integer_helper<long>( func, s, idx, base, wcstol ); 148166124Srafan} 149166124Srafan 150166124Srafantemplate<> 151166124Srafaninline 152166124Srafanunsigned long 153166124Srafanas_integer( const string& func, const wstring& s, size_t* idx, int base ) 154166124Srafan{ 155166124Srafan return as_integer_helper<unsigned long>( func, s, idx, base, wcstoul ); 156166124Srafan} 157166124Srafan 158166124Srafantemplate<> 159166124Srafaninline 160166124Srafanlong long 161166124Srafanas_integer( const string& func, const wstring& s, size_t* idx, int base ) 162166124Srafan{ 163166124Srafan return as_integer_helper<long long>( func, s, idx, base, wcstoll ); 164166124Srafan} 165166124Srafan 166166124Srafantemplate<> 167166124Srafaninline 168166124Srafanunsigned long long 169166124Srafanas_integer( const string& func, const wstring& s, size_t* idx, int base ) 170166124Srafan{ 171166124Srafan return as_integer_helper<unsigned long long>( func, s, idx, base, wcstoull ); 172166124Srafan} 173166124Srafan 174166124Srafan// as_float 175166124Srafan 176166124Srafantemplate<typename V, typename S, typename F> 177166124Srafaninline 178166124SrafanV 179166124Srafanas_float_helper(const string& func, const S& str, size_t* idx, F f ) 180166124Srafan{ 181166124Srafan typename S::value_type* ptr; 182166124Srafan const typename S::value_type* const p = str.c_str(); 183166124Srafan typename remove_reference<decltype(errno)>::type errno_save = errno; 184166124Srafan errno = 0; 185166124Srafan V r = f(p, &ptr); 186166124Srafan swap(errno, errno_save); 187166124Srafan if (errno_save == ERANGE) 188166124Srafan throw_from_string_out_of_range(func); 189166124Srafan if (ptr == p) 190166124Srafan throw_from_string_invalid_arg(func); 191166124Srafan if (idx) 192166124Srafan *idx = static_cast<size_t>(ptr - p); 193166124Srafan return r; 194166124Srafan} 195166124Srafan 196166124Srafantemplate<typename V, typename S> 197166124Srafaninline 198166124SrafanV as_float( const string& func, const S& s, size_t* idx = nullptr ); 199166124Srafan 200166124Srafantemplate<> 201166124Srafaninline 202166124Srafanfloat 203166124Srafanas_float( const string& func, const string& s, size_t* idx ) 204166124Srafan{ 205166124Srafan return as_float_helper<float>( func, s, idx, strtof ); 206166124Srafan} 207166124Srafan 208166124Srafantemplate<> 209166124Srafaninline 210166124Srafandouble 211166124Srafanas_float(const string& func, const string& s, size_t* idx ) 212166124Srafan{ 213184989Srafan return as_float_helper<double>( func, s, idx, strtod ); 214166124Srafan} 215166124Srafan 216166124Srafantemplate<> 217166124Srafaninline 218166124Srafanlong double 219166124Srafanas_float( const string& func, const string& s, size_t* idx ) 220178866Srafan{ 221166124Srafan return as_float_helper<long double>( func, s, idx, strtold ); 222178866Srafan} 223166124Srafan 224176187Srafantemplate<> 225176187Srafaninline 226176187Srafanfloat 227176187Srafanas_float( const string& func, const wstring& s, size_t* idx ) 228176187Srafan{ 229176187Srafan return as_float_helper<float>( func, s, idx, wcstof ); 230176187Srafan} 231176187Srafan 232176187Srafantemplate<> 233166124Srafaninline 234166124Srafandouble 235166124Srafanas_float( const string& func, const wstring& s, size_t* idx ) 236166124Srafan{ 237166124Srafan return as_float_helper<double>( func, s, idx, wcstod ); 238166124Srafan} 239166124Srafan 240166124Srafantemplate<> 241166124Srafaninline 242166124Srafanlong double 24397049Speteras_float( const string& func, const wstring& s, size_t* idx ) 24450276Speter{ 24562449Speter return as_float_helper<long double>( func, s, idx, wcstold ); 246166124Srafan} 24762449Speter 24850276Speter} // unnamed namespace 24962449Speter 250166124Srafanint 25150276Speterstoi(const string& str, size_t* idx, int base) 252166124Srafan{ 25350276Speter return as_integer<int>( "stoi", str, idx, base ); 25462449Speter} 25550276Speter 256166124Srafanint 25750276Speterstoi(const wstring& str, size_t* idx, int base) 25862449Speter{ 25962449Speter return as_integer<int>( "stoi", str, idx, base ); 260166124Srafan} 261166124Srafan 262166124Srafanlong 26397049Speterstol(const string& str, size_t* idx, int base) 264166124Srafan{ 265166124Srafan return as_integer<long>( "stol", str, idx, base ); 266166124Srafan} 267176187Srafan 268176187Srafanlong 269166124Srafanstol(const wstring& str, size_t* idx, int base) 270166124Srafan{ 271166124Srafan return as_integer<long>( "stol", str, idx, base ); 272166124Srafan} 273166124Srafan 274166124Srafanunsigned long 275176187Srafanstoul(const string& str, size_t* idx, int base) 276176187Srafan{ 277166124Srafan return as_integer<unsigned long>( "stoul", str, idx, base ); 278166124Srafan} 279166124Srafan 280166124Srafanunsigned long 28197049Speterstoul(const wstring& str, size_t* idx, int base) 28262449Speter{ 283166124Srafan return as_integer<unsigned long>( "stoul", str, idx, base ); 284166124Srafan} 285166124Srafan 286166124Srafanlong long 287166124Srafanstoll(const string& str, size_t* idx, int base) 288166124Srafan{ 289166124Srafan return as_integer<long long>( "stoll", str, idx, base ); 290166124Srafan} 291166124Srafan 292166124Srafanlong long 293184989Srafanstoll(const wstring& str, size_t* idx, int base) 294166124Srafan{ 295166124Srafan return as_integer<long long>( "stoll", str, idx, base ); 296166124Srafan} 297184989Srafan 298184989Srafanunsigned long long 299184989Srafanstoull(const string& str, size_t* idx, int base) 300184989Srafan{ 301184989Srafan return as_integer<unsigned long long>( "stoull", str, idx, base ); 302166124Srafan} 303166124Srafan 304166124Srafanunsigned long long 305166124Srafanstoull(const wstring& str, size_t* idx, int base) 306166124Srafan{ 307166124Srafan return as_integer<unsigned long long>( "stoull", str, idx, base ); 308166124Srafan} 309166124Srafan 310166124Srafanfloat 311166124Srafanstof(const string& str, size_t* idx) 312166124Srafan{ 313166124Srafan return as_float<float>( "stof", str, idx ); 314166124Srafan} 315166124Srafan 316166124Srafanfloat 317166124Srafanstof(const wstring& str, size_t* idx) 318166124Srafan{ 319166124Srafan return as_float<float>( "stof", str, idx ); 320166124Srafan} 321166124Srafan 322166124Srafandouble 323166124Srafanstod(const string& str, size_t* idx) 324166124Srafan{ 325166124Srafan return as_float<double>( "stod", str, idx ); 326166124Srafan} 327166124Srafan 328166124Srafandouble 329166124Srafanstod(const wstring& str, size_t* idx) 330166124Srafan{ 331166124Srafan return as_float<double>( "stod", str, idx ); 332166124Srafan} 333166124Srafan 334166124Srafanlong double 335166124Srafanstold(const string& str, size_t* idx) 336166124Srafan{ 337166124Srafan return as_float<long double>( "stold", str, idx ); 338166124Srafan} 339166124Srafan 340166124Srafanlong double 341166124Srafanstold(const wstring& str, size_t* idx) 342166124Srafan{ 343166124Srafan return as_float<long double>( "stold", str, idx ); 344166124Srafan} 345166124Srafan 346166124Srafan// to_string 347166124Srafan 348166124Srafannamespace 349166124Srafan{ 350166124Srafan 351166124Srafan// as_string 352166124Srafan 353166124Srafantemplate<typename S, typename P, typename V > 354166124Srafaninline 355166124SrafanS 356166124Srafanas_string(P sprintf_like, S s, const typename S::value_type* fmt, V a) 357166124Srafan{ 358166124Srafan typedef typename S::size_type size_type; 359166124Srafan size_type available = s.size(); 360166124Srafan while (true) 361166124Srafan { 362166124Srafan int status = sprintf_like(&s[0], available + 1, fmt, a); 363166124Srafan if ( status >= 0 ) 364166124Srafan { 365166124Srafan size_type used = static_cast<size_type>(status); 366166124Srafan if ( used <= available ) 367166124Srafan { 368166124Srafan s.resize( used ); 369166124Srafan break; 370166124Srafan } 371166124Srafan available = used; // Assume this is advice of how much space we need. 372166124Srafan } 373166124Srafan else 374166124Srafan available = available * 2 + 1; 375166124Srafan s.resize(available); 376166124Srafan } 377166124Srafan return s; 378166124Srafan} 379166124Srafan 380166124Srafantemplate <class S, class V, bool = is_floating_point<V>::value> 381166124Srafanstruct initial_string; 382166124Srafan 383166124Srafantemplate <class V, bool b> 38462449Speterstruct initial_string<string, V, b> 385166124Srafan{ 38662449Speter string 38762449Speter operator()() const 38862449Speter { 38950276Speter string s; 39050276Speter s.resize(s.capacity()); 391166124Srafan return s; 39297049Speter } 39350276Speter}; 39450276Speter 395166124Srafantemplate <class V> 396166124Srafanstruct initial_string<wstring, V, false> 397166124Srafan{ 39850276Speter wstring 399166124Srafan operator()() const 400166124Srafan { 401166124Srafan const size_t n = (numeric_limits<unsigned long long>::digits / 3) 402166124Srafan + ((numeric_limits<unsigned long long>::digits % 3) != 0) 403166124Srafan + 1; 40497049Speter wstring s(n, wchar_t()); 405166124Srafan s.resize(s.capacity()); 406166124Srafan return s; 407166124Srafan } 408166124Srafan}; 409166124Srafan 410166124Srafantemplate <class V> 411166124Srafanstruct initial_string<wstring, V, true> 412166124Srafan{ 413166124Srafan wstring 414166124Srafan operator()() const 415166124Srafan { 416166124Srafan wstring s(20, wchar_t()); 417166124Srafan s.resize(s.capacity()); 418166124Srafan return s; 41962449Speter } 42050276Speter}; 421166124Srafan 422166124Srafantypedef int (*wide_printf)(wchar_t* __restrict, size_t, const wchar_t*__restrict, ...); 423166124Srafan 424166124Srafaninline 42562449Speterwide_printf 42662449Speterget_swprintf() 42750276Speter{ 42862449Speter#ifndef _WIN32 42962449Speter return swprintf; 43062449Speter#else 43150276Speter return static_cast<int (__cdecl*)(wchar_t* __restrict, size_t, const wchar_t*__restrict, ...)>(swprintf); 43262449Speter#endif 43362449Speter} 43462449Speter 43562449Speter} // unnamed namespace 43662449Speter 43762449Speterstring to_string(int val) 438166124Srafan{ 43997049Speter return as_string(snprintf, initial_string<string, int>()(), "%d", val); 44062449Speter} 44162449Speter 44262449Speterstring to_string(unsigned val) 44362449Speter{ 44462449Speter return as_string(snprintf, initial_string<string, unsigned>()(), "%u", val); 44562449Speter} 44662449Speter 44762449Speterstring to_string(long val) 448166124Srafan{ 44962449Speter return as_string(snprintf, initial_string<string, long>()(), "%ld", val); 45062449Speter} 45162449Speter 45262449Speterstring to_string(unsigned long val) 45350276Speter{ 45462449Speter return as_string(snprintf, initial_string<string, unsigned long>()(), "%lu", val); 45550276Speter} 45662449Speter 45750276Speterstring to_string(long long val) 45862449Speter{ 45962449Speter return as_string(snprintf, initial_string<string, long long>()(), "%lld", val); 46062449Speter} 461166124Srafan 46262449Speterstring to_string(unsigned long long val) 46362449Speter{ 46462449Speter return as_string(snprintf, initial_string<string, unsigned long long>()(), "%llu", val); 46562449Speter} 46662449Speter 46762449Speterstring to_string(float val) 46862449Speter{ 46962449Speter return as_string(snprintf, initial_string<string, float>()(), "%f", val); 47062449Speter} 47162449Speter 47262449Speterstring to_string(double val) 47362449Speter{ 47462449Speter return as_string(snprintf, initial_string<string, double>()(), "%f", val); 47562449Speter} 47662449Speter 47762449Speterstring to_string(long double val) 47862449Speter{ 47997049Speter return as_string(snprintf, initial_string<string, long double>()(), "%Lf", val); 48097049Speter} 48197049Speter 482178866Srafanwstring to_wstring(int val) 48397049Speter{ 48462449Speter return as_string(get_swprintf(), initial_string<wstring, int>()(), L"%d", val); 48597049Speter} 48662449Speter 48762449Speterwstring to_wstring(unsigned val) 48850276Speter{ 48962449Speter return as_string(get_swprintf(), initial_string<wstring, unsigned>()(), L"%u", val); 49062449Speter} 49150276Speter 49262449Speterwstring to_wstring(long val) 49350276Speter{ 49450276Speter return as_string(get_swprintf(), initial_string<wstring, long>()(), L"%ld", val); 49576726Speter} 49697049Speter 49750276Speterwstring to_wstring(unsigned long val) 49850276Speter{ 49962449Speter return as_string(get_swprintf(), initial_string<wstring, unsigned long>()(), L"%lu", val); 50050276Speter} 50150276Speter 50250276Speterwstring to_wstring(long long val) 503166124Srafan{ 50450276Speter return as_string(get_swprintf(), initial_string<wstring, long long>()(), L"%lld", val); 50550276Speter} 50650276Speter 50750276Speterwstring to_wstring(unsigned long long val) 50850276Speter{ 50950276Speter return as_string(get_swprintf(), initial_string<wstring, unsigned long long>()(), L"%llu", val); 51076726Speter} 51197049Speter 51250276Speterwstring to_wstring(float val) 51362449Speter{ 51497049Speter return as_string(get_swprintf(), initial_string<wstring, float>()(), L"%f", val); 51597049Speter} 51650276Speter 51762449Speterwstring to_wstring(double val) 51876726Speter{ 51950276Speter return as_string(get_swprintf(), initial_string<wstring, double>()(), L"%f", val); 52097049Speter} 52162449Speter 52262449Speterwstring to_wstring(long double val) 52362449Speter{ 52450276Speter return as_string(get_swprintf(), initial_string<wstring, long double>()(), L"%Lf", val); 52562449Speter} 52662449Speter_LIBCPP_END_NAMESPACE_STD 52750276Speter