1*58b9f456SAndroid Build Coastguard Worker //===------------------------- string.cpp ---------------------------------===//
2*58b9f456SAndroid Build Coastguard Worker //
3*58b9f456SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*58b9f456SAndroid Build Coastguard Worker //
5*58b9f456SAndroid Build Coastguard Worker // This file is dual licensed under the MIT and the University of Illinois Open
6*58b9f456SAndroid Build Coastguard Worker // Source Licenses. See LICENSE.TXT for details.
7*58b9f456SAndroid Build Coastguard Worker //
8*58b9f456SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*58b9f456SAndroid Build Coastguard Worker
10*58b9f456SAndroid Build Coastguard Worker #include "string"
11*58b9f456SAndroid Build Coastguard Worker #include "cstdlib"
12*58b9f456SAndroid Build Coastguard Worker #include "cwchar"
13*58b9f456SAndroid Build Coastguard Worker #include "cerrno"
14*58b9f456SAndroid Build Coastguard Worker #include "limits"
15*58b9f456SAndroid Build Coastguard Worker #include "stdexcept"
16*58b9f456SAndroid Build Coastguard Worker #include <stdio.h>
17*58b9f456SAndroid Build Coastguard Worker
18*58b9f456SAndroid Build Coastguard Worker _LIBCPP_BEGIN_NAMESPACE_STD
19*58b9f456SAndroid Build Coastguard Worker
20*58b9f456SAndroid Build Coastguard Worker template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS __basic_string_common<true>;
21*58b9f456SAndroid Build Coastguard Worker
22*58b9f456SAndroid Build Coastguard Worker template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_string<char>;
23*58b9f456SAndroid Build Coastguard Worker template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_string<wchar_t>;
24*58b9f456SAndroid Build Coastguard Worker
25*58b9f456SAndroid Build Coastguard Worker template
26*58b9f456SAndroid Build Coastguard Worker string
27*58b9f456SAndroid Build Coastguard Worker operator+<char, char_traits<char>, allocator<char> >(char const*, string const&);
28*58b9f456SAndroid Build Coastguard Worker
29*58b9f456SAndroid Build Coastguard Worker namespace
30*58b9f456SAndroid Build Coastguard Worker {
31*58b9f456SAndroid Build Coastguard Worker
32*58b9f456SAndroid Build Coastguard Worker template<typename T>
33*58b9f456SAndroid Build Coastguard Worker inline
throw_helper(const string & msg)34*58b9f456SAndroid Build Coastguard Worker void throw_helper( const string& msg )
35*58b9f456SAndroid Build Coastguard Worker {
36*58b9f456SAndroid Build Coastguard Worker #ifndef _LIBCPP_NO_EXCEPTIONS
37*58b9f456SAndroid Build Coastguard Worker throw T( msg );
38*58b9f456SAndroid Build Coastguard Worker #else
39*58b9f456SAndroid Build Coastguard Worker fprintf(stderr, "%s\n", msg.c_str());
40*58b9f456SAndroid Build Coastguard Worker _VSTD::abort();
41*58b9f456SAndroid Build Coastguard Worker #endif
42*58b9f456SAndroid Build Coastguard Worker }
43*58b9f456SAndroid Build Coastguard Worker
44*58b9f456SAndroid Build Coastguard Worker inline
throw_from_string_out_of_range(const string & func)45*58b9f456SAndroid Build Coastguard Worker void throw_from_string_out_of_range( const string& func )
46*58b9f456SAndroid Build Coastguard Worker {
47*58b9f456SAndroid Build Coastguard Worker throw_helper<out_of_range>(func + ": out of range");
48*58b9f456SAndroid Build Coastguard Worker }
49*58b9f456SAndroid Build Coastguard Worker
50*58b9f456SAndroid Build Coastguard Worker inline
throw_from_string_invalid_arg(const string & func)51*58b9f456SAndroid Build Coastguard Worker void throw_from_string_invalid_arg( const string& func )
52*58b9f456SAndroid Build Coastguard Worker {
53*58b9f456SAndroid Build Coastguard Worker throw_helper<invalid_argument>(func + ": no conversion");
54*58b9f456SAndroid Build Coastguard Worker }
55*58b9f456SAndroid Build Coastguard Worker
56*58b9f456SAndroid Build Coastguard Worker // as_integer
57*58b9f456SAndroid Build Coastguard Worker
58*58b9f456SAndroid Build Coastguard Worker template<typename V, typename S, typename F>
59*58b9f456SAndroid Build Coastguard Worker inline
60*58b9f456SAndroid Build Coastguard Worker V
as_integer_helper(const string & func,const S & str,size_t * idx,int base,F f)61*58b9f456SAndroid Build Coastguard Worker as_integer_helper(const string& func, const S& str, size_t* idx, int base, F f)
62*58b9f456SAndroid Build Coastguard Worker {
63*58b9f456SAndroid Build Coastguard Worker typename S::value_type* ptr = nullptr;
64*58b9f456SAndroid Build Coastguard Worker const typename S::value_type* const p = str.c_str();
65*58b9f456SAndroid Build Coastguard Worker typename remove_reference<decltype(errno)>::type errno_save = errno;
66*58b9f456SAndroid Build Coastguard Worker errno = 0;
67*58b9f456SAndroid Build Coastguard Worker V r = f(p, &ptr, base);
68*58b9f456SAndroid Build Coastguard Worker swap(errno, errno_save);
69*58b9f456SAndroid Build Coastguard Worker if (errno_save == ERANGE)
70*58b9f456SAndroid Build Coastguard Worker throw_from_string_out_of_range(func);
71*58b9f456SAndroid Build Coastguard Worker if (ptr == p)
72*58b9f456SAndroid Build Coastguard Worker throw_from_string_invalid_arg(func);
73*58b9f456SAndroid Build Coastguard Worker if (idx)
74*58b9f456SAndroid Build Coastguard Worker *idx = static_cast<size_t>(ptr - p);
75*58b9f456SAndroid Build Coastguard Worker return r;
76*58b9f456SAndroid Build Coastguard Worker }
77*58b9f456SAndroid Build Coastguard Worker
78*58b9f456SAndroid Build Coastguard Worker template<typename V, typename S>
79*58b9f456SAndroid Build Coastguard Worker inline
80*58b9f456SAndroid Build Coastguard Worker V
81*58b9f456SAndroid Build Coastguard Worker as_integer(const string& func, const S& s, size_t* idx, int base);
82*58b9f456SAndroid Build Coastguard Worker
83*58b9f456SAndroid Build Coastguard Worker // string
84*58b9f456SAndroid Build Coastguard Worker template<>
85*58b9f456SAndroid Build Coastguard Worker inline
86*58b9f456SAndroid Build Coastguard Worker int
as_integer(const string & func,const string & s,size_t * idx,int base)87*58b9f456SAndroid Build Coastguard Worker as_integer(const string& func, const string& s, size_t* idx, int base )
88*58b9f456SAndroid Build Coastguard Worker {
89*58b9f456SAndroid Build Coastguard Worker // Use long as no Standard string to integer exists.
90*58b9f456SAndroid Build Coastguard Worker long r = as_integer_helper<long>( func, s, idx, base, strtol );
91*58b9f456SAndroid Build Coastguard Worker if (r < numeric_limits<int>::min() || numeric_limits<int>::max() < r)
92*58b9f456SAndroid Build Coastguard Worker throw_from_string_out_of_range(func);
93*58b9f456SAndroid Build Coastguard Worker return static_cast<int>(r);
94*58b9f456SAndroid Build Coastguard Worker }
95*58b9f456SAndroid Build Coastguard Worker
96*58b9f456SAndroid Build Coastguard Worker template<>
97*58b9f456SAndroid Build Coastguard Worker inline
98*58b9f456SAndroid Build Coastguard Worker long
as_integer(const string & func,const string & s,size_t * idx,int base)99*58b9f456SAndroid Build Coastguard Worker as_integer(const string& func, const string& s, size_t* idx, int base )
100*58b9f456SAndroid Build Coastguard Worker {
101*58b9f456SAndroid Build Coastguard Worker return as_integer_helper<long>( func, s, idx, base, strtol );
102*58b9f456SAndroid Build Coastguard Worker }
103*58b9f456SAndroid Build Coastguard Worker
104*58b9f456SAndroid Build Coastguard Worker template<>
105*58b9f456SAndroid Build Coastguard Worker inline
106*58b9f456SAndroid Build Coastguard Worker unsigned long
as_integer(const string & func,const string & s,size_t * idx,int base)107*58b9f456SAndroid Build Coastguard Worker as_integer( const string& func, const string& s, size_t* idx, int base )
108*58b9f456SAndroid Build Coastguard Worker {
109*58b9f456SAndroid Build Coastguard Worker return as_integer_helper<unsigned long>( func, s, idx, base, strtoul );
110*58b9f456SAndroid Build Coastguard Worker }
111*58b9f456SAndroid Build Coastguard Worker
112*58b9f456SAndroid Build Coastguard Worker template<>
113*58b9f456SAndroid Build Coastguard Worker inline
114*58b9f456SAndroid Build Coastguard Worker long long
as_integer(const string & func,const string & s,size_t * idx,int base)115*58b9f456SAndroid Build Coastguard Worker as_integer( const string& func, const string& s, size_t* idx, int base )
116*58b9f456SAndroid Build Coastguard Worker {
117*58b9f456SAndroid Build Coastguard Worker return as_integer_helper<long long>( func, s, idx, base, strtoll );
118*58b9f456SAndroid Build Coastguard Worker }
119*58b9f456SAndroid Build Coastguard Worker
120*58b9f456SAndroid Build Coastguard Worker template<>
121*58b9f456SAndroid Build Coastguard Worker inline
122*58b9f456SAndroid Build Coastguard Worker unsigned long long
as_integer(const string & func,const string & s,size_t * idx,int base)123*58b9f456SAndroid Build Coastguard Worker as_integer( const string& func, const string& s, size_t* idx, int base )
124*58b9f456SAndroid Build Coastguard Worker {
125*58b9f456SAndroid Build Coastguard Worker return as_integer_helper<unsigned long long>( func, s, idx, base, strtoull );
126*58b9f456SAndroid Build Coastguard Worker }
127*58b9f456SAndroid Build Coastguard Worker
128*58b9f456SAndroid Build Coastguard Worker // wstring
129*58b9f456SAndroid Build Coastguard Worker template<>
130*58b9f456SAndroid Build Coastguard Worker inline
131*58b9f456SAndroid Build Coastguard Worker int
as_integer(const string & func,const wstring & s,size_t * idx,int base)132*58b9f456SAndroid Build Coastguard Worker as_integer( const string& func, const wstring& s, size_t* idx, int base )
133*58b9f456SAndroid Build Coastguard Worker {
134*58b9f456SAndroid Build Coastguard Worker // Use long as no Stantard string to integer exists.
135*58b9f456SAndroid Build Coastguard Worker long r = as_integer_helper<long>( func, s, idx, base, wcstol );
136*58b9f456SAndroid Build Coastguard Worker if (r < numeric_limits<int>::min() || numeric_limits<int>::max() < r)
137*58b9f456SAndroid Build Coastguard Worker throw_from_string_out_of_range(func);
138*58b9f456SAndroid Build Coastguard Worker return static_cast<int>(r);
139*58b9f456SAndroid Build Coastguard Worker }
140*58b9f456SAndroid Build Coastguard Worker
141*58b9f456SAndroid Build Coastguard Worker template<>
142*58b9f456SAndroid Build Coastguard Worker inline
143*58b9f456SAndroid Build Coastguard Worker long
as_integer(const string & func,const wstring & s,size_t * idx,int base)144*58b9f456SAndroid Build Coastguard Worker as_integer( const string& func, const wstring& s, size_t* idx, int base )
145*58b9f456SAndroid Build Coastguard Worker {
146*58b9f456SAndroid Build Coastguard Worker return as_integer_helper<long>( func, s, idx, base, wcstol );
147*58b9f456SAndroid Build Coastguard Worker }
148*58b9f456SAndroid Build Coastguard Worker
149*58b9f456SAndroid Build Coastguard Worker template<>
150*58b9f456SAndroid Build Coastguard Worker inline
151*58b9f456SAndroid Build Coastguard Worker unsigned long
as_integer(const string & func,const wstring & s,size_t * idx,int base)152*58b9f456SAndroid Build Coastguard Worker as_integer( const string& func, const wstring& s, size_t* idx, int base )
153*58b9f456SAndroid Build Coastguard Worker {
154*58b9f456SAndroid Build Coastguard Worker return as_integer_helper<unsigned long>( func, s, idx, base, wcstoul );
155*58b9f456SAndroid Build Coastguard Worker }
156*58b9f456SAndroid Build Coastguard Worker
157*58b9f456SAndroid Build Coastguard Worker template<>
158*58b9f456SAndroid Build Coastguard Worker inline
159*58b9f456SAndroid Build Coastguard Worker long long
as_integer(const string & func,const wstring & s,size_t * idx,int base)160*58b9f456SAndroid Build Coastguard Worker as_integer( const string& func, const wstring& s, size_t* idx, int base )
161*58b9f456SAndroid Build Coastguard Worker {
162*58b9f456SAndroid Build Coastguard Worker return as_integer_helper<long long>( func, s, idx, base, wcstoll );
163*58b9f456SAndroid Build Coastguard Worker }
164*58b9f456SAndroid Build Coastguard Worker
165*58b9f456SAndroid Build Coastguard Worker template<>
166*58b9f456SAndroid Build Coastguard Worker inline
167*58b9f456SAndroid Build Coastguard Worker unsigned long long
as_integer(const string & func,const wstring & s,size_t * idx,int base)168*58b9f456SAndroid Build Coastguard Worker as_integer( const string& func, const wstring& s, size_t* idx, int base )
169*58b9f456SAndroid Build Coastguard Worker {
170*58b9f456SAndroid Build Coastguard Worker return as_integer_helper<unsigned long long>( func, s, idx, base, wcstoull );
171*58b9f456SAndroid Build Coastguard Worker }
172*58b9f456SAndroid Build Coastguard Worker
173*58b9f456SAndroid Build Coastguard Worker // as_float
174*58b9f456SAndroid Build Coastguard Worker
175*58b9f456SAndroid Build Coastguard Worker template<typename V, typename S, typename F>
176*58b9f456SAndroid Build Coastguard Worker inline
177*58b9f456SAndroid Build Coastguard Worker V
as_float_helper(const string & func,const S & str,size_t * idx,F f)178*58b9f456SAndroid Build Coastguard Worker as_float_helper(const string& func, const S& str, size_t* idx, F f )
179*58b9f456SAndroid Build Coastguard Worker {
180*58b9f456SAndroid Build Coastguard Worker typename S::value_type* ptr = nullptr;
181*58b9f456SAndroid Build Coastguard Worker const typename S::value_type* const p = str.c_str();
182*58b9f456SAndroid Build Coastguard Worker typename remove_reference<decltype(errno)>::type errno_save = errno;
183*58b9f456SAndroid Build Coastguard Worker errno = 0;
184*58b9f456SAndroid Build Coastguard Worker V r = f(p, &ptr);
185*58b9f456SAndroid Build Coastguard Worker swap(errno, errno_save);
186*58b9f456SAndroid Build Coastguard Worker if (errno_save == ERANGE)
187*58b9f456SAndroid Build Coastguard Worker throw_from_string_out_of_range(func);
188*58b9f456SAndroid Build Coastguard Worker if (ptr == p)
189*58b9f456SAndroid Build Coastguard Worker throw_from_string_invalid_arg(func);
190*58b9f456SAndroid Build Coastguard Worker if (idx)
191*58b9f456SAndroid Build Coastguard Worker *idx = static_cast<size_t>(ptr - p);
192*58b9f456SAndroid Build Coastguard Worker return r;
193*58b9f456SAndroid Build Coastguard Worker }
194*58b9f456SAndroid Build Coastguard Worker
195*58b9f456SAndroid Build Coastguard Worker template<typename V, typename S>
196*58b9f456SAndroid Build Coastguard Worker inline
197*58b9f456SAndroid Build Coastguard Worker V as_float( const string& func, const S& s, size_t* idx = nullptr );
198*58b9f456SAndroid Build Coastguard Worker
199*58b9f456SAndroid Build Coastguard Worker template<>
200*58b9f456SAndroid Build Coastguard Worker inline
201*58b9f456SAndroid Build Coastguard Worker float
as_float(const string & func,const string & s,size_t * idx)202*58b9f456SAndroid Build Coastguard Worker as_float( const string& func, const string& s, size_t* idx )
203*58b9f456SAndroid Build Coastguard Worker {
204*58b9f456SAndroid Build Coastguard Worker return as_float_helper<float>( func, s, idx, strtof );
205*58b9f456SAndroid Build Coastguard Worker }
206*58b9f456SAndroid Build Coastguard Worker
207*58b9f456SAndroid Build Coastguard Worker template<>
208*58b9f456SAndroid Build Coastguard Worker inline
209*58b9f456SAndroid Build Coastguard Worker double
as_float(const string & func,const string & s,size_t * idx)210*58b9f456SAndroid Build Coastguard Worker as_float(const string& func, const string& s, size_t* idx )
211*58b9f456SAndroid Build Coastguard Worker {
212*58b9f456SAndroid Build Coastguard Worker return as_float_helper<double>( func, s, idx, strtod );
213*58b9f456SAndroid Build Coastguard Worker }
214*58b9f456SAndroid Build Coastguard Worker
215*58b9f456SAndroid Build Coastguard Worker template<>
216*58b9f456SAndroid Build Coastguard Worker inline
217*58b9f456SAndroid Build Coastguard Worker long double
as_float(const string & func,const string & s,size_t * idx)218*58b9f456SAndroid Build Coastguard Worker as_float( const string& func, const string& s, size_t* idx )
219*58b9f456SAndroid Build Coastguard Worker {
220*58b9f456SAndroid Build Coastguard Worker return as_float_helper<long double>( func, s, idx, strtold );
221*58b9f456SAndroid Build Coastguard Worker }
222*58b9f456SAndroid Build Coastguard Worker
223*58b9f456SAndroid Build Coastguard Worker template<>
224*58b9f456SAndroid Build Coastguard Worker inline
225*58b9f456SAndroid Build Coastguard Worker float
as_float(const string & func,const wstring & s,size_t * idx)226*58b9f456SAndroid Build Coastguard Worker as_float( const string& func, const wstring& s, size_t* idx )
227*58b9f456SAndroid Build Coastguard Worker {
228*58b9f456SAndroid Build Coastguard Worker return as_float_helper<float>( func, s, idx, wcstof );
229*58b9f456SAndroid Build Coastguard Worker }
230*58b9f456SAndroid Build Coastguard Worker
231*58b9f456SAndroid Build Coastguard Worker template<>
232*58b9f456SAndroid Build Coastguard Worker inline
233*58b9f456SAndroid Build Coastguard Worker double
as_float(const string & func,const wstring & s,size_t * idx)234*58b9f456SAndroid Build Coastguard Worker as_float( const string& func, const wstring& s, size_t* idx )
235*58b9f456SAndroid Build Coastguard Worker {
236*58b9f456SAndroid Build Coastguard Worker return as_float_helper<double>( func, s, idx, wcstod );
237*58b9f456SAndroid Build Coastguard Worker }
238*58b9f456SAndroid Build Coastguard Worker
239*58b9f456SAndroid Build Coastguard Worker template<>
240*58b9f456SAndroid Build Coastguard Worker inline
241*58b9f456SAndroid Build Coastguard Worker long double
as_float(const string & func,const wstring & s,size_t * idx)242*58b9f456SAndroid Build Coastguard Worker as_float( const string& func, const wstring& s, size_t* idx )
243*58b9f456SAndroid Build Coastguard Worker {
244*58b9f456SAndroid Build Coastguard Worker return as_float_helper<long double>( func, s, idx, wcstold );
245*58b9f456SAndroid Build Coastguard Worker }
246*58b9f456SAndroid Build Coastguard Worker
247*58b9f456SAndroid Build Coastguard Worker } // unnamed namespace
248*58b9f456SAndroid Build Coastguard Worker
249*58b9f456SAndroid Build Coastguard Worker int
stoi(const string & str,size_t * idx,int base)250*58b9f456SAndroid Build Coastguard Worker stoi(const string& str, size_t* idx, int base)
251*58b9f456SAndroid Build Coastguard Worker {
252*58b9f456SAndroid Build Coastguard Worker return as_integer<int>( "stoi", str, idx, base );
253*58b9f456SAndroid Build Coastguard Worker }
254*58b9f456SAndroid Build Coastguard Worker
255*58b9f456SAndroid Build Coastguard Worker int
stoi(const wstring & str,size_t * idx,int base)256*58b9f456SAndroid Build Coastguard Worker stoi(const wstring& str, size_t* idx, int base)
257*58b9f456SAndroid Build Coastguard Worker {
258*58b9f456SAndroid Build Coastguard Worker return as_integer<int>( "stoi", str, idx, base );
259*58b9f456SAndroid Build Coastguard Worker }
260*58b9f456SAndroid Build Coastguard Worker
261*58b9f456SAndroid Build Coastguard Worker long
stol(const string & str,size_t * idx,int base)262*58b9f456SAndroid Build Coastguard Worker stol(const string& str, size_t* idx, int base)
263*58b9f456SAndroid Build Coastguard Worker {
264*58b9f456SAndroid Build Coastguard Worker return as_integer<long>( "stol", str, idx, base );
265*58b9f456SAndroid Build Coastguard Worker }
266*58b9f456SAndroid Build Coastguard Worker
267*58b9f456SAndroid Build Coastguard Worker long
stol(const wstring & str,size_t * idx,int base)268*58b9f456SAndroid Build Coastguard Worker stol(const wstring& str, size_t* idx, int base)
269*58b9f456SAndroid Build Coastguard Worker {
270*58b9f456SAndroid Build Coastguard Worker return as_integer<long>( "stol", str, idx, base );
271*58b9f456SAndroid Build Coastguard Worker }
272*58b9f456SAndroid Build Coastguard Worker
273*58b9f456SAndroid Build Coastguard Worker unsigned long
stoul(const string & str,size_t * idx,int base)274*58b9f456SAndroid Build Coastguard Worker stoul(const string& str, size_t* idx, int base)
275*58b9f456SAndroid Build Coastguard Worker {
276*58b9f456SAndroid Build Coastguard Worker return as_integer<unsigned long>( "stoul", str, idx, base );
277*58b9f456SAndroid Build Coastguard Worker }
278*58b9f456SAndroid Build Coastguard Worker
279*58b9f456SAndroid Build Coastguard Worker unsigned long
stoul(const wstring & str,size_t * idx,int base)280*58b9f456SAndroid Build Coastguard Worker stoul(const wstring& str, size_t* idx, int base)
281*58b9f456SAndroid Build Coastguard Worker {
282*58b9f456SAndroid Build Coastguard Worker return as_integer<unsigned long>( "stoul", str, idx, base );
283*58b9f456SAndroid Build Coastguard Worker }
284*58b9f456SAndroid Build Coastguard Worker
285*58b9f456SAndroid Build Coastguard Worker long long
stoll(const string & str,size_t * idx,int base)286*58b9f456SAndroid Build Coastguard Worker stoll(const string& str, size_t* idx, int base)
287*58b9f456SAndroid Build Coastguard Worker {
288*58b9f456SAndroid Build Coastguard Worker return as_integer<long long>( "stoll", str, idx, base );
289*58b9f456SAndroid Build Coastguard Worker }
290*58b9f456SAndroid Build Coastguard Worker
291*58b9f456SAndroid Build Coastguard Worker long long
stoll(const wstring & str,size_t * idx,int base)292*58b9f456SAndroid Build Coastguard Worker stoll(const wstring& str, size_t* idx, int base)
293*58b9f456SAndroid Build Coastguard Worker {
294*58b9f456SAndroid Build Coastguard Worker return as_integer<long long>( "stoll", str, idx, base );
295*58b9f456SAndroid Build Coastguard Worker }
296*58b9f456SAndroid Build Coastguard Worker
297*58b9f456SAndroid Build Coastguard Worker unsigned long long
stoull(const string & str,size_t * idx,int base)298*58b9f456SAndroid Build Coastguard Worker stoull(const string& str, size_t* idx, int base)
299*58b9f456SAndroid Build Coastguard Worker {
300*58b9f456SAndroid Build Coastguard Worker return as_integer<unsigned long long>( "stoull", str, idx, base );
301*58b9f456SAndroid Build Coastguard Worker }
302*58b9f456SAndroid Build Coastguard Worker
303*58b9f456SAndroid Build Coastguard Worker unsigned long long
stoull(const wstring & str,size_t * idx,int base)304*58b9f456SAndroid Build Coastguard Worker stoull(const wstring& str, size_t* idx, int base)
305*58b9f456SAndroid Build Coastguard Worker {
306*58b9f456SAndroid Build Coastguard Worker return as_integer<unsigned long long>( "stoull", str, idx, base );
307*58b9f456SAndroid Build Coastguard Worker }
308*58b9f456SAndroid Build Coastguard Worker
309*58b9f456SAndroid Build Coastguard Worker float
stof(const string & str,size_t * idx)310*58b9f456SAndroid Build Coastguard Worker stof(const string& str, size_t* idx)
311*58b9f456SAndroid Build Coastguard Worker {
312*58b9f456SAndroid Build Coastguard Worker return as_float<float>( "stof", str, idx );
313*58b9f456SAndroid Build Coastguard Worker }
314*58b9f456SAndroid Build Coastguard Worker
315*58b9f456SAndroid Build Coastguard Worker float
stof(const wstring & str,size_t * idx)316*58b9f456SAndroid Build Coastguard Worker stof(const wstring& str, size_t* idx)
317*58b9f456SAndroid Build Coastguard Worker {
318*58b9f456SAndroid Build Coastguard Worker return as_float<float>( "stof", str, idx );
319*58b9f456SAndroid Build Coastguard Worker }
320*58b9f456SAndroid Build Coastguard Worker
321*58b9f456SAndroid Build Coastguard Worker double
stod(const string & str,size_t * idx)322*58b9f456SAndroid Build Coastguard Worker stod(const string& str, size_t* idx)
323*58b9f456SAndroid Build Coastguard Worker {
324*58b9f456SAndroid Build Coastguard Worker return as_float<double>( "stod", str, idx );
325*58b9f456SAndroid Build Coastguard Worker }
326*58b9f456SAndroid Build Coastguard Worker
327*58b9f456SAndroid Build Coastguard Worker double
stod(const wstring & str,size_t * idx)328*58b9f456SAndroid Build Coastguard Worker stod(const wstring& str, size_t* idx)
329*58b9f456SAndroid Build Coastguard Worker {
330*58b9f456SAndroid Build Coastguard Worker return as_float<double>( "stod", str, idx );
331*58b9f456SAndroid Build Coastguard Worker }
332*58b9f456SAndroid Build Coastguard Worker
333*58b9f456SAndroid Build Coastguard Worker long double
stold(const string & str,size_t * idx)334*58b9f456SAndroid Build Coastguard Worker stold(const string& str, size_t* idx)
335*58b9f456SAndroid Build Coastguard Worker {
336*58b9f456SAndroid Build Coastguard Worker return as_float<long double>( "stold", str, idx );
337*58b9f456SAndroid Build Coastguard Worker }
338*58b9f456SAndroid Build Coastguard Worker
339*58b9f456SAndroid Build Coastguard Worker long double
stold(const wstring & str,size_t * idx)340*58b9f456SAndroid Build Coastguard Worker stold(const wstring& str, size_t* idx)
341*58b9f456SAndroid Build Coastguard Worker {
342*58b9f456SAndroid Build Coastguard Worker return as_float<long double>( "stold", str, idx );
343*58b9f456SAndroid Build Coastguard Worker }
344*58b9f456SAndroid Build Coastguard Worker
345*58b9f456SAndroid Build Coastguard Worker // to_string
346*58b9f456SAndroid Build Coastguard Worker
347*58b9f456SAndroid Build Coastguard Worker namespace
348*58b9f456SAndroid Build Coastguard Worker {
349*58b9f456SAndroid Build Coastguard Worker
350*58b9f456SAndroid Build Coastguard Worker // as_string
351*58b9f456SAndroid Build Coastguard Worker
352*58b9f456SAndroid Build Coastguard Worker template<typename S, typename P, typename V >
353*58b9f456SAndroid Build Coastguard Worker inline
354*58b9f456SAndroid Build Coastguard Worker S
as_string(P sprintf_like,S s,const typename S::value_type * fmt,V a)355*58b9f456SAndroid Build Coastguard Worker as_string(P sprintf_like, S s, const typename S::value_type* fmt, V a)
356*58b9f456SAndroid Build Coastguard Worker {
357*58b9f456SAndroid Build Coastguard Worker typedef typename S::size_type size_type;
358*58b9f456SAndroid Build Coastguard Worker size_type available = s.size();
359*58b9f456SAndroid Build Coastguard Worker while (true)
360*58b9f456SAndroid Build Coastguard Worker {
361*58b9f456SAndroid Build Coastguard Worker int status = sprintf_like(&s[0], available + 1, fmt, a);
362*58b9f456SAndroid Build Coastguard Worker if ( status >= 0 )
363*58b9f456SAndroid Build Coastguard Worker {
364*58b9f456SAndroid Build Coastguard Worker size_type used = static_cast<size_type>(status);
365*58b9f456SAndroid Build Coastguard Worker if ( used <= available )
366*58b9f456SAndroid Build Coastguard Worker {
367*58b9f456SAndroid Build Coastguard Worker s.resize( used );
368*58b9f456SAndroid Build Coastguard Worker break;
369*58b9f456SAndroid Build Coastguard Worker }
370*58b9f456SAndroid Build Coastguard Worker available = used; // Assume this is advice of how much space we need.
371*58b9f456SAndroid Build Coastguard Worker }
372*58b9f456SAndroid Build Coastguard Worker else
373*58b9f456SAndroid Build Coastguard Worker available = available * 2 + 1;
374*58b9f456SAndroid Build Coastguard Worker s.resize(available);
375*58b9f456SAndroid Build Coastguard Worker }
376*58b9f456SAndroid Build Coastguard Worker return s;
377*58b9f456SAndroid Build Coastguard Worker }
378*58b9f456SAndroid Build Coastguard Worker
379*58b9f456SAndroid Build Coastguard Worker template <class S, class V, bool = is_floating_point<V>::value>
380*58b9f456SAndroid Build Coastguard Worker struct initial_string;
381*58b9f456SAndroid Build Coastguard Worker
382*58b9f456SAndroid Build Coastguard Worker template <class V, bool b>
383*58b9f456SAndroid Build Coastguard Worker struct initial_string<string, V, b>
384*58b9f456SAndroid Build Coastguard Worker {
385*58b9f456SAndroid Build Coastguard Worker string
operator ()__anon8a7565bf0211::initial_string386*58b9f456SAndroid Build Coastguard Worker operator()() const
387*58b9f456SAndroid Build Coastguard Worker {
388*58b9f456SAndroid Build Coastguard Worker string s;
389*58b9f456SAndroid Build Coastguard Worker s.resize(s.capacity());
390*58b9f456SAndroid Build Coastguard Worker return s;
391*58b9f456SAndroid Build Coastguard Worker }
392*58b9f456SAndroid Build Coastguard Worker };
393*58b9f456SAndroid Build Coastguard Worker
394*58b9f456SAndroid Build Coastguard Worker template <class V>
395*58b9f456SAndroid Build Coastguard Worker struct initial_string<wstring, V, false>
396*58b9f456SAndroid Build Coastguard Worker {
397*58b9f456SAndroid Build Coastguard Worker wstring
operator ()__anon8a7565bf0211::initial_string398*58b9f456SAndroid Build Coastguard Worker operator()() const
399*58b9f456SAndroid Build Coastguard Worker {
400*58b9f456SAndroid Build Coastguard Worker const size_t n = (numeric_limits<unsigned long long>::digits / 3)
401*58b9f456SAndroid Build Coastguard Worker + ((numeric_limits<unsigned long long>::digits % 3) != 0)
402*58b9f456SAndroid Build Coastguard Worker + 1;
403*58b9f456SAndroid Build Coastguard Worker wstring s(n, wchar_t());
404*58b9f456SAndroid Build Coastguard Worker s.resize(s.capacity());
405*58b9f456SAndroid Build Coastguard Worker return s;
406*58b9f456SAndroid Build Coastguard Worker }
407*58b9f456SAndroid Build Coastguard Worker };
408*58b9f456SAndroid Build Coastguard Worker
409*58b9f456SAndroid Build Coastguard Worker template <class V>
410*58b9f456SAndroid Build Coastguard Worker struct initial_string<wstring, V, true>
411*58b9f456SAndroid Build Coastguard Worker {
412*58b9f456SAndroid Build Coastguard Worker wstring
operator ()__anon8a7565bf0211::initial_string413*58b9f456SAndroid Build Coastguard Worker operator()() const
414*58b9f456SAndroid Build Coastguard Worker {
415*58b9f456SAndroid Build Coastguard Worker wstring s(20, wchar_t());
416*58b9f456SAndroid Build Coastguard Worker s.resize(s.capacity());
417*58b9f456SAndroid Build Coastguard Worker return s;
418*58b9f456SAndroid Build Coastguard Worker }
419*58b9f456SAndroid Build Coastguard Worker };
420*58b9f456SAndroid Build Coastguard Worker
421*58b9f456SAndroid Build Coastguard Worker typedef int (*wide_printf)(wchar_t* __restrict, size_t, const wchar_t*__restrict, ...);
422*58b9f456SAndroid Build Coastguard Worker
423*58b9f456SAndroid Build Coastguard Worker inline
424*58b9f456SAndroid Build Coastguard Worker wide_printf
get_swprintf()425*58b9f456SAndroid Build Coastguard Worker get_swprintf()
426*58b9f456SAndroid Build Coastguard Worker {
427*58b9f456SAndroid Build Coastguard Worker #ifndef _LIBCPP_MSVCRT
428*58b9f456SAndroid Build Coastguard Worker return swprintf;
429*58b9f456SAndroid Build Coastguard Worker #else
430*58b9f456SAndroid Build Coastguard Worker return static_cast<int (__cdecl*)(wchar_t* __restrict, size_t, const wchar_t*__restrict, ...)>(_snwprintf);
431*58b9f456SAndroid Build Coastguard Worker #endif
432*58b9f456SAndroid Build Coastguard Worker }
433*58b9f456SAndroid Build Coastguard Worker
434*58b9f456SAndroid Build Coastguard Worker } // unnamed namespace
435*58b9f456SAndroid Build Coastguard Worker
to_string(int val)436*58b9f456SAndroid Build Coastguard Worker string to_string(int val)
437*58b9f456SAndroid Build Coastguard Worker {
438*58b9f456SAndroid Build Coastguard Worker return as_string(snprintf, initial_string<string, int>()(), "%d", val);
439*58b9f456SAndroid Build Coastguard Worker }
440*58b9f456SAndroid Build Coastguard Worker
to_string(unsigned val)441*58b9f456SAndroid Build Coastguard Worker string to_string(unsigned val)
442*58b9f456SAndroid Build Coastguard Worker {
443*58b9f456SAndroid Build Coastguard Worker return as_string(snprintf, initial_string<string, unsigned>()(), "%u", val);
444*58b9f456SAndroid Build Coastguard Worker }
445*58b9f456SAndroid Build Coastguard Worker
to_string(long val)446*58b9f456SAndroid Build Coastguard Worker string to_string(long val)
447*58b9f456SAndroid Build Coastguard Worker {
448*58b9f456SAndroid Build Coastguard Worker return as_string(snprintf, initial_string<string, long>()(), "%ld", val);
449*58b9f456SAndroid Build Coastguard Worker }
450*58b9f456SAndroid Build Coastguard Worker
to_string(unsigned long val)451*58b9f456SAndroid Build Coastguard Worker string to_string(unsigned long val)
452*58b9f456SAndroid Build Coastguard Worker {
453*58b9f456SAndroid Build Coastguard Worker return as_string(snprintf, initial_string<string, unsigned long>()(), "%lu", val);
454*58b9f456SAndroid Build Coastguard Worker }
455*58b9f456SAndroid Build Coastguard Worker
to_string(long long val)456*58b9f456SAndroid Build Coastguard Worker string to_string(long long val)
457*58b9f456SAndroid Build Coastguard Worker {
458*58b9f456SAndroid Build Coastguard Worker return as_string(snprintf, initial_string<string, long long>()(), "%lld", val);
459*58b9f456SAndroid Build Coastguard Worker }
460*58b9f456SAndroid Build Coastguard Worker
to_string(unsigned long long val)461*58b9f456SAndroid Build Coastguard Worker string to_string(unsigned long long val)
462*58b9f456SAndroid Build Coastguard Worker {
463*58b9f456SAndroid Build Coastguard Worker return as_string(snprintf, initial_string<string, unsigned long long>()(), "%llu", val);
464*58b9f456SAndroid Build Coastguard Worker }
465*58b9f456SAndroid Build Coastguard Worker
to_string(float val)466*58b9f456SAndroid Build Coastguard Worker string to_string(float val)
467*58b9f456SAndroid Build Coastguard Worker {
468*58b9f456SAndroid Build Coastguard Worker return as_string(snprintf, initial_string<string, float>()(), "%f", val);
469*58b9f456SAndroid Build Coastguard Worker }
470*58b9f456SAndroid Build Coastguard Worker
to_string(double val)471*58b9f456SAndroid Build Coastguard Worker string to_string(double val)
472*58b9f456SAndroid Build Coastguard Worker {
473*58b9f456SAndroid Build Coastguard Worker return as_string(snprintf, initial_string<string, double>()(), "%f", val);
474*58b9f456SAndroid Build Coastguard Worker }
475*58b9f456SAndroid Build Coastguard Worker
to_string(long double val)476*58b9f456SAndroid Build Coastguard Worker string to_string(long double val)
477*58b9f456SAndroid Build Coastguard Worker {
478*58b9f456SAndroid Build Coastguard Worker return as_string(snprintf, initial_string<string, long double>()(), "%Lf", val);
479*58b9f456SAndroid Build Coastguard Worker }
480*58b9f456SAndroid Build Coastguard Worker
to_wstring(int val)481*58b9f456SAndroid Build Coastguard Worker wstring to_wstring(int val)
482*58b9f456SAndroid Build Coastguard Worker {
483*58b9f456SAndroid Build Coastguard Worker return as_string(get_swprintf(), initial_string<wstring, int>()(), L"%d", val);
484*58b9f456SAndroid Build Coastguard Worker }
485*58b9f456SAndroid Build Coastguard Worker
to_wstring(unsigned val)486*58b9f456SAndroid Build Coastguard Worker wstring to_wstring(unsigned val)
487*58b9f456SAndroid Build Coastguard Worker {
488*58b9f456SAndroid Build Coastguard Worker return as_string(get_swprintf(), initial_string<wstring, unsigned>()(), L"%u", val);
489*58b9f456SAndroid Build Coastguard Worker }
490*58b9f456SAndroid Build Coastguard Worker
to_wstring(long val)491*58b9f456SAndroid Build Coastguard Worker wstring to_wstring(long val)
492*58b9f456SAndroid Build Coastguard Worker {
493*58b9f456SAndroid Build Coastguard Worker return as_string(get_swprintf(), initial_string<wstring, long>()(), L"%ld", val);
494*58b9f456SAndroid Build Coastguard Worker }
495*58b9f456SAndroid Build Coastguard Worker
to_wstring(unsigned long val)496*58b9f456SAndroid Build Coastguard Worker wstring to_wstring(unsigned long val)
497*58b9f456SAndroid Build Coastguard Worker {
498*58b9f456SAndroid Build Coastguard Worker return as_string(get_swprintf(), initial_string<wstring, unsigned long>()(), L"%lu", val);
499*58b9f456SAndroid Build Coastguard Worker }
500*58b9f456SAndroid Build Coastguard Worker
to_wstring(long long val)501*58b9f456SAndroid Build Coastguard Worker wstring to_wstring(long long val)
502*58b9f456SAndroid Build Coastguard Worker {
503*58b9f456SAndroid Build Coastguard Worker return as_string(get_swprintf(), initial_string<wstring, long long>()(), L"%lld", val);
504*58b9f456SAndroid Build Coastguard Worker }
505*58b9f456SAndroid Build Coastguard Worker
to_wstring(unsigned long long val)506*58b9f456SAndroid Build Coastguard Worker wstring to_wstring(unsigned long long val)
507*58b9f456SAndroid Build Coastguard Worker {
508*58b9f456SAndroid Build Coastguard Worker return as_string(get_swprintf(), initial_string<wstring, unsigned long long>()(), L"%llu", val);
509*58b9f456SAndroid Build Coastguard Worker }
510*58b9f456SAndroid Build Coastguard Worker
to_wstring(float val)511*58b9f456SAndroid Build Coastguard Worker wstring to_wstring(float val)
512*58b9f456SAndroid Build Coastguard Worker {
513*58b9f456SAndroid Build Coastguard Worker return as_string(get_swprintf(), initial_string<wstring, float>()(), L"%f", val);
514*58b9f456SAndroid Build Coastguard Worker }
515*58b9f456SAndroid Build Coastguard Worker
to_wstring(double val)516*58b9f456SAndroid Build Coastguard Worker wstring to_wstring(double val)
517*58b9f456SAndroid Build Coastguard Worker {
518*58b9f456SAndroid Build Coastguard Worker return as_string(get_swprintf(), initial_string<wstring, double>()(), L"%f", val);
519*58b9f456SAndroid Build Coastguard Worker }
520*58b9f456SAndroid Build Coastguard Worker
to_wstring(long double val)521*58b9f456SAndroid Build Coastguard Worker wstring to_wstring(long double val)
522*58b9f456SAndroid Build Coastguard Worker {
523*58b9f456SAndroid Build Coastguard Worker return as_string(get_swprintf(), initial_string<wstring, long double>()(), L"%Lf", val);
524*58b9f456SAndroid Build Coastguard Worker }
525*58b9f456SAndroid Build Coastguard Worker _LIBCPP_END_NAMESPACE_STD
526