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