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