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