blob: a21a1550612bc0bbf95f48235a267363bde494c0 [file] [log] [blame]
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +00001//===------------------------- string.cpp ---------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Howard Hinnantee11c312010-11-16 22:09:02 +00005// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +00007//
8//===----------------------------------------------------------------------===//
9
10#include "string"
11#include "cstdlib"
12#include "cwchar"
13#include "cerrno"
Howard Hinnanteb505f62011-09-23 16:11:27 +000014#if _WIN32
15#include "support/win32/support.h"
16#endif // _WIN32
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +000017
18_LIBCPP_BEGIN_NAMESPACE_STD
19
20template class __basic_string_common<true>;
21
22template class basic_string<char>;
23template class basic_string<wchar_t>;
24
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +000025template
26 string
27 operator+<char, char_traits<char>, allocator<char> >(char const*, string const&);
28
29int
30stoi(const string& str, size_t* idx, int base)
31{
32 char* ptr;
33 const char* const p = str.c_str();
Howard Hinnant6e357862013-01-14 18:59:43 +000034 int errno_save = errno;
35 errno = 0;
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +000036 long r = strtol(p, &ptr, base);
Howard Hinnant6e357862013-01-14 18:59:43 +000037 swap(errno, errno_save);
Howard Hinnant72f73582010-08-11 17:04:31 +000038#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant6e357862013-01-14 18:59:43 +000039 if (errno_save == ERANGE || r < numeric_limits<int>::min() ||
40 numeric_limits<int>::max() < r)
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +000041 throw out_of_range("stoi: out of range");
Howard Hinnant6e357862013-01-14 18:59:43 +000042 if (ptr == p)
43 throw invalid_argument("stoi: no conversion");
Howard Hinnantffb308e2010-08-22 00:03:27 +000044#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +000045 if (idx)
46 *idx = static_cast<size_t>(ptr - p);
47 return static_cast<int>(r);
48}
49
50int
51stoi(const wstring& str, size_t* idx, int base)
52{
53 wchar_t* ptr;
54 const wchar_t* const p = str.c_str();
Howard Hinnant6e357862013-01-14 18:59:43 +000055 int errno_save = errno;
56 errno = 0;
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +000057 long r = wcstol(p, &ptr, base);
Howard Hinnant6e357862013-01-14 18:59:43 +000058 swap(errno, errno_save);
Howard Hinnant72f73582010-08-11 17:04:31 +000059#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant6e357862013-01-14 18:59:43 +000060 if (errno_save == ERANGE || r < numeric_limits<int>::min() ||
61 numeric_limits<int>::max() < r)
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +000062 throw out_of_range("stoi: out of range");
Howard Hinnant6e357862013-01-14 18:59:43 +000063 if (ptr == p)
64 throw invalid_argument("stoi: no conversion");
Howard Hinnantffb308e2010-08-22 00:03:27 +000065#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +000066 if (idx)
67 *idx = static_cast<size_t>(ptr - p);
68 return static_cast<int>(r);
69}
70
71long
72stol(const string& str, size_t* idx, int base)
73{
74 char* ptr;
75 const char* const p = str.c_str();
Howard Hinnant6e357862013-01-14 18:59:43 +000076 int errno_save = errno;
77 errno = 0;
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +000078 long r = strtol(p, &ptr, base);
Howard Hinnant6e357862013-01-14 18:59:43 +000079 swap(errno, errno_save);
Howard Hinnant72f73582010-08-11 17:04:31 +000080#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant6e357862013-01-14 18:59:43 +000081 if (errno_save == ERANGE)
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +000082 throw out_of_range("stol: out of range");
Howard Hinnant6e357862013-01-14 18:59:43 +000083 if (ptr == p)
84 throw invalid_argument("stol: no conversion");
Howard Hinnantffb308e2010-08-22 00:03:27 +000085#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +000086 if (idx)
87 *idx = static_cast<size_t>(ptr - p);
88 return r;
89}
90
91long
92stol(const wstring& str, size_t* idx, int base)
93{
94 wchar_t* ptr;
95 const wchar_t* const p = str.c_str();
Howard Hinnant6e357862013-01-14 18:59:43 +000096 int errno_save = errno;
97 errno = 0;
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +000098 long r = wcstol(p, &ptr, base);
Howard Hinnant6e357862013-01-14 18:59:43 +000099 swap(errno, errno_save);
Howard Hinnant72f73582010-08-11 17:04:31 +0000100#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant6e357862013-01-14 18:59:43 +0000101 if (errno_save == ERANGE)
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000102 throw out_of_range("stol: out of range");
Howard Hinnant6e357862013-01-14 18:59:43 +0000103 if (ptr == p)
104 throw invalid_argument("stol: no conversion");
Howard Hinnantffb308e2010-08-22 00:03:27 +0000105#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000106 if (idx)
107 *idx = static_cast<size_t>(ptr - p);
108 return r;
109}
110
111unsigned long
112stoul(const string& str, size_t* idx, int base)
113{
114 char* ptr;
115 const char* const p = str.c_str();
Howard Hinnant6e357862013-01-14 18:59:43 +0000116 int errno_save = errno;
117 errno = 0;
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000118 unsigned long r = strtoul(p, &ptr, base);
Howard Hinnant6e357862013-01-14 18:59:43 +0000119 swap(errno, errno_save);
Howard Hinnant72f73582010-08-11 17:04:31 +0000120#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant6e357862013-01-14 18:59:43 +0000121 if (errno_save == ERANGE)
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000122 throw out_of_range("stoul: out of range");
Howard Hinnant6e357862013-01-14 18:59:43 +0000123 if (ptr == p)
124 throw invalid_argument("stoul: no conversion");
Howard Hinnantffb308e2010-08-22 00:03:27 +0000125#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000126 if (idx)
127 *idx = static_cast<size_t>(ptr - p);
128 return r;
129}
130
131unsigned long
132stoul(const wstring& str, size_t* idx, int base)
133{
134 wchar_t* ptr;
135 const wchar_t* const p = str.c_str();
Howard Hinnant6e357862013-01-14 18:59:43 +0000136 int errno_save = errno;
137 errno = 0;
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000138 unsigned long r = wcstoul(p, &ptr, base);
Howard Hinnant6e357862013-01-14 18:59:43 +0000139 swap(errno, errno_save);
Howard Hinnant72f73582010-08-11 17:04:31 +0000140#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant6e357862013-01-14 18:59:43 +0000141 if (errno_save == ERANGE)
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000142 throw out_of_range("stoul: out of range");
Howard Hinnant6e357862013-01-14 18:59:43 +0000143 if (ptr == p)
144 throw invalid_argument("stoul: no conversion");
Howard Hinnantffb308e2010-08-22 00:03:27 +0000145#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000146 if (idx)
147 *idx = static_cast<size_t>(ptr - p);
148 return r;
149}
150
151long long
152stoll(const string& str, size_t* idx, int base)
153{
154 char* ptr;
155 const char* const p = str.c_str();
Howard Hinnant6e357862013-01-14 18:59:43 +0000156 int errno_save = errno;
157 errno = 0;
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000158 long long r = strtoll(p, &ptr, base);
Howard Hinnant6e357862013-01-14 18:59:43 +0000159 swap(errno, errno_save);
Howard Hinnant72f73582010-08-11 17:04:31 +0000160#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant6e357862013-01-14 18:59:43 +0000161 if (errno_save == ERANGE)
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000162 throw out_of_range("stoll: out of range");
Howard Hinnant6e357862013-01-14 18:59:43 +0000163 if (ptr == p)
164 throw invalid_argument("stoll: no conversion");
Howard Hinnantffb308e2010-08-22 00:03:27 +0000165#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000166 if (idx)
167 *idx = static_cast<size_t>(ptr - p);
168 return r;
169}
170
171long long
172stoll(const wstring& str, size_t* idx, int base)
173{
174 wchar_t* ptr;
175 const wchar_t* const p = str.c_str();
Howard Hinnant6e357862013-01-14 18:59:43 +0000176 int errno_save = errno;
177 errno = 0;
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000178 long long r = wcstoll(p, &ptr, base);
Howard Hinnant6e357862013-01-14 18:59:43 +0000179 swap(errno, errno_save);
Howard Hinnant72f73582010-08-11 17:04:31 +0000180#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant6e357862013-01-14 18:59:43 +0000181 if (errno_save == ERANGE)
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000182 throw out_of_range("stoll: out of range");
Howard Hinnant6e357862013-01-14 18:59:43 +0000183 if (ptr == p)
184 throw invalid_argument("stoll: no conversion");
Howard Hinnantffb308e2010-08-22 00:03:27 +0000185#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000186 if (idx)
187 *idx = static_cast<size_t>(ptr - p);
188 return r;
189}
190
191unsigned long long
192stoull(const string& str, size_t* idx, int base)
193{
194 char* ptr;
195 const char* const p = str.c_str();
Howard Hinnant6e357862013-01-14 18:59:43 +0000196 int errno_save = errno;
197 errno = 0;
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000198 unsigned long long r = strtoull(p, &ptr, base);
Howard Hinnant6e357862013-01-14 18:59:43 +0000199 swap(errno, errno_save);
Howard Hinnant72f73582010-08-11 17:04:31 +0000200#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant6e357862013-01-14 18:59:43 +0000201 if (errno_save == ERANGE)
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000202 throw out_of_range("stoull: out of range");
Howard Hinnant6e357862013-01-14 18:59:43 +0000203 if (ptr == p)
204 throw invalid_argument("stoull: no conversion");
Howard Hinnantffb308e2010-08-22 00:03:27 +0000205#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000206 if (idx)
207 *idx = static_cast<size_t>(ptr - p);
208 return r;
209}
210
211unsigned long long
212stoull(const wstring& str, size_t* idx, int base)
213{
214 wchar_t* ptr;
215 const wchar_t* const p = str.c_str();
Howard Hinnant6e357862013-01-14 18:59:43 +0000216 int errno_save = errno;
217 errno = 0;
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000218 unsigned long long r = wcstoull(p, &ptr, base);
Howard Hinnant6e357862013-01-14 18:59:43 +0000219 swap(errno, errno_save);
Howard Hinnant72f73582010-08-11 17:04:31 +0000220#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant6e357862013-01-14 18:59:43 +0000221 if (errno_save == ERANGE)
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000222 throw out_of_range("stoull: out of range");
Howard Hinnant6e357862013-01-14 18:59:43 +0000223 if (ptr == p)
224 throw invalid_argument("stoull: no conversion");
Howard Hinnantffb308e2010-08-22 00:03:27 +0000225#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000226 if (idx)
227 *idx = static_cast<size_t>(ptr - p);
228 return r;
229}
230
231float
232stof(const string& str, size_t* idx)
233{
234 char* ptr;
235 const char* const p = str.c_str();
236 int errno_save = errno;
237 errno = 0;
Howard Hinnant6e357862013-01-14 18:59:43 +0000238 float r = strtof(p, &ptr);
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000239 swap(errno, errno_save);
Howard Hinnant72f73582010-08-11 17:04:31 +0000240#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000241 if (errno_save == ERANGE)
242 throw out_of_range("stof: out of range");
243 if (ptr == p)
244 throw invalid_argument("stof: no conversion");
Howard Hinnantffb308e2010-08-22 00:03:27 +0000245#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000246 if (idx)
247 *idx = static_cast<size_t>(ptr - p);
Howard Hinnant6e357862013-01-14 18:59:43 +0000248 return r;
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000249}
250
251float
252stof(const wstring& str, size_t* idx)
253{
254 wchar_t* ptr;
255 const wchar_t* const p = str.c_str();
256 int errno_save = errno;
257 errno = 0;
Howard Hinnant6e357862013-01-14 18:59:43 +0000258 float r = wcstof(p, &ptr);
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000259 swap(errno, errno_save);
Howard Hinnant72f73582010-08-11 17:04:31 +0000260#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000261 if (errno_save == ERANGE)
262 throw out_of_range("stof: out of range");
263 if (ptr == p)
264 throw invalid_argument("stof: no conversion");
Howard Hinnantffb308e2010-08-22 00:03:27 +0000265#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000266 if (idx)
267 *idx = static_cast<size_t>(ptr - p);
Howard Hinnant6e357862013-01-14 18:59:43 +0000268 return r;
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000269}
270
271double
272stod(const string& str, size_t* idx)
273{
274 char* ptr;
275 const char* const p = str.c_str();
276 int errno_save = errno;
277 errno = 0;
278 double r = strtod(p, &ptr);
279 swap(errno, errno_save);
Howard Hinnant72f73582010-08-11 17:04:31 +0000280#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000281 if (errno_save == ERANGE)
282 throw out_of_range("stod: out of range");
283 if (ptr == p)
284 throw invalid_argument("stod: no conversion");
Howard Hinnantffb308e2010-08-22 00:03:27 +0000285#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000286 if (idx)
287 *idx = static_cast<size_t>(ptr - p);
288 return r;
289}
290
291double
292stod(const wstring& str, size_t* idx)
293{
294 wchar_t* ptr;
295 const wchar_t* const p = str.c_str();
296 int errno_save = errno;
297 errno = 0;
298 double r = wcstod(p, &ptr);
299 swap(errno, errno_save);
Howard Hinnant72f73582010-08-11 17:04:31 +0000300#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000301 if (errno_save == ERANGE)
302 throw out_of_range("stod: out of range");
303 if (ptr == p)
304 throw invalid_argument("stod: no conversion");
Howard Hinnantffb308e2010-08-22 00:03:27 +0000305#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000306 if (idx)
307 *idx = static_cast<size_t>(ptr - p);
308 return r;
309}
310
311long double
312stold(const string& str, size_t* idx)
313{
314 char* ptr;
315 const char* const p = str.c_str();
316 int errno_save = errno;
317 errno = 0;
318 long double r = strtold(p, &ptr);
319 swap(errno, errno_save);
Howard Hinnant72f73582010-08-11 17:04:31 +0000320#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000321 if (errno_save == ERANGE)
322 throw out_of_range("stold: out of range");
323 if (ptr == p)
324 throw invalid_argument("stold: no conversion");
Howard Hinnantffb308e2010-08-22 00:03:27 +0000325#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000326 if (idx)
327 *idx = static_cast<size_t>(ptr - p);
328 return r;
329}
330
331long double
332stold(const wstring& str, size_t* idx)
333{
334 wchar_t* ptr;
335 const wchar_t* const p = str.c_str();
336 int errno_save = errno;
337 errno = 0;
338 long double r = wcstold(p, &ptr);
339 swap(errno, errno_save);
Howard Hinnant72f73582010-08-11 17:04:31 +0000340#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000341 if (errno_save == ERANGE)
342 throw out_of_range("stold: out of range");
343 if (ptr == p)
344 throw invalid_argument("stold: no conversion");
Howard Hinnantffb308e2010-08-22 00:03:27 +0000345#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000346 if (idx)
347 *idx = static_cast<size_t>(ptr - p);
348 return r;
349}
350
351string to_string(int val)
352{
353 string s;
354 s.resize(s.capacity());
355 while (true)
356 {
Howard Hinnant28b24882011-12-01 20:21:04 +0000357 size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%d", val));
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000358 if (n2 <= s.size())
359 {
360 s.resize(n2);
361 break;
362 }
363 s.resize(n2);
364 }
365 return s;
366}
367
368string to_string(unsigned val)
369{
370 string s;
371 s.resize(s.capacity());
372 while (true)
373 {
Howard Hinnant28b24882011-12-01 20:21:04 +0000374 size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%u", val));
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000375 if (n2 <= s.size())
376 {
377 s.resize(n2);
378 break;
379 }
380 s.resize(n2);
381 }
382 return s;
383}
384
385string to_string(long val)
386{
387 string s;
388 s.resize(s.capacity());
389 while (true)
390 {
Howard Hinnant28b24882011-12-01 20:21:04 +0000391 size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%ld", val));
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000392 if (n2 <= s.size())
393 {
394 s.resize(n2);
395 break;
396 }
397 s.resize(n2);
398 }
399 return s;
400}
401
402string to_string(unsigned long val)
403{
404 string s;
405 s.resize(s.capacity());
406 while (true)
407 {
Howard Hinnant28b24882011-12-01 20:21:04 +0000408 size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%lu", val));
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000409 if (n2 <= s.size())
410 {
411 s.resize(n2);
412 break;
413 }
414 s.resize(n2);
415 }
416 return s;
417}
418
419string to_string(long long val)
420{
421 string s;
422 s.resize(s.capacity());
423 while (true)
424 {
Howard Hinnant28b24882011-12-01 20:21:04 +0000425 size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%lld", val));
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000426 if (n2 <= s.size())
427 {
428 s.resize(n2);
429 break;
430 }
431 s.resize(n2);
432 }
433 return s;
434}
435
436string to_string(unsigned long long val)
437{
438 string s;
439 s.resize(s.capacity());
440 while (true)
441 {
Howard Hinnant28b24882011-12-01 20:21:04 +0000442 size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%llu", val));
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000443 if (n2 <= s.size())
444 {
445 s.resize(n2);
446 break;
447 }
448 s.resize(n2);
449 }
450 return s;
451}
452
453string to_string(float val)
454{
455 string s;
456 s.resize(s.capacity());
457 while (true)
458 {
Howard Hinnant28b24882011-12-01 20:21:04 +0000459 size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%f", val));
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000460 if (n2 <= s.size())
461 {
462 s.resize(n2);
463 break;
464 }
465 s.resize(n2);
466 }
467 return s;
468}
469
470string to_string(double val)
471{
472 string s;
473 s.resize(s.capacity());
474 while (true)
475 {
Howard Hinnant28b24882011-12-01 20:21:04 +0000476 size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%f", val));
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000477 if (n2 <= s.size())
478 {
479 s.resize(n2);
480 break;
481 }
482 s.resize(n2);
483 }
484 return s;
485}
486
487string to_string(long double val)
488{
489 string s;
490 s.resize(s.capacity());
491 while (true)
492 {
Howard Hinnant28b24882011-12-01 20:21:04 +0000493 size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%Lf", val));
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000494 if (n2 <= s.size())
495 {
496 s.resize(n2);
497 break;
498 }
499 s.resize(n2);
500 }
501 return s;
502}
503
504wstring to_wstring(int val)
505{
506 const size_t n = (numeric_limits<int>::digits / 3)
507 + ((numeric_limits<int>::digits % 3) != 0)
508 + 1;
509 wstring s(n, wchar_t());
510 s.resize(s.capacity());
511 while (true)
512 {
513 int n2 = swprintf(&s[0], s.size()+1, L"%d", val);
514 if (n2 > 0)
515 {
Howard Hinnant28b24882011-12-01 20:21:04 +0000516 s.resize(static_cast<size_t>(n2));
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000517 break;
518 }
519 s.resize(2*s.size());
520 s.resize(s.capacity());
521 }
522 return s;
523}
524
525wstring to_wstring(unsigned val)
526{
527 const size_t n = (numeric_limits<unsigned>::digits / 3)
528 + ((numeric_limits<unsigned>::digits % 3) != 0)
529 + 1;
530 wstring s(n, wchar_t());
531 s.resize(s.capacity());
532 while (true)
533 {
534 int n2 = swprintf(&s[0], s.size()+1, L"%u", val);
535 if (n2 > 0)
536 {
Howard Hinnant28b24882011-12-01 20:21:04 +0000537 s.resize(static_cast<size_t>(n2));
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000538 break;
539 }
540 s.resize(2*s.size());
541 s.resize(s.capacity());
542 }
543 return s;
544}
545
546wstring to_wstring(long val)
547{
548 const size_t n = (numeric_limits<long>::digits / 3)
549 + ((numeric_limits<long>::digits % 3) != 0)
550 + 1;
551 wstring s(n, wchar_t());
552 s.resize(s.capacity());
553 while (true)
554 {
555 int n2 = swprintf(&s[0], s.size()+1, L"%ld", val);
556 if (n2 > 0)
557 {
Howard Hinnant28b24882011-12-01 20:21:04 +0000558 s.resize(static_cast<size_t>(n2));
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000559 break;
560 }
561 s.resize(2*s.size());
562 s.resize(s.capacity());
563 }
564 return s;
565}
566
567wstring to_wstring(unsigned long val)
568{
569 const size_t n = (numeric_limits<unsigned long>::digits / 3)
570 + ((numeric_limits<unsigned long>::digits % 3) != 0)
571 + 1;
572 wstring s(n, wchar_t());
573 s.resize(s.capacity());
574 while (true)
575 {
576 int n2 = swprintf(&s[0], s.size()+1, L"%lu", val);
577 if (n2 > 0)
578 {
Howard Hinnant28b24882011-12-01 20:21:04 +0000579 s.resize(static_cast<size_t>(n2));
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000580 break;
581 }
582 s.resize(2*s.size());
583 s.resize(s.capacity());
584 }
585 return s;
586}
587
588wstring to_wstring(long long val)
589{
590 const size_t n = (numeric_limits<long long>::digits / 3)
591 + ((numeric_limits<long long>::digits % 3) != 0)
592 + 1;
593 wstring s(n, wchar_t());
594 s.resize(s.capacity());
595 while (true)
596 {
597 int n2 = swprintf(&s[0], s.size()+1, L"%lld", val);
598 if (n2 > 0)
599 {
Howard Hinnant28b24882011-12-01 20:21:04 +0000600 s.resize(static_cast<size_t>(n2));
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000601 break;
602 }
603 s.resize(2*s.size());
604 s.resize(s.capacity());
605 }
606 return s;
607}
608
609wstring to_wstring(unsigned long long val)
610{
611 const size_t n = (numeric_limits<unsigned long long>::digits / 3)
612 + ((numeric_limits<unsigned long long>::digits % 3) != 0)
613 + 1;
614 wstring s(n, wchar_t());
615 s.resize(s.capacity());
616 while (true)
617 {
618 int n2 = swprintf(&s[0], s.size()+1, L"%llu", val);
619 if (n2 > 0)
620 {
Howard Hinnant28b24882011-12-01 20:21:04 +0000621 s.resize(static_cast<size_t>(n2));
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000622 break;
623 }
624 s.resize(2*s.size());
625 s.resize(s.capacity());
626 }
627 return s;
628}
629
630wstring to_wstring(float val)
631{
632 const size_t n = 20;
633 wstring s(n, wchar_t());
634 s.resize(s.capacity());
635 while (true)
636 {
637 int n2 = swprintf(&s[0], s.size()+1, L"%f", val);
638 if (n2 > 0)
639 {
Howard Hinnant28b24882011-12-01 20:21:04 +0000640 s.resize(static_cast<size_t>(n2));
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000641 break;
642 }
643 s.resize(2*s.size());
644 s.resize(s.capacity());
645 }
646 return s;
647}
648
649wstring to_wstring(double val)
650{
651 const size_t n = 20;
652 wstring s(n, wchar_t());
653 s.resize(s.capacity());
654 while (true)
655 {
656 int n2 = swprintf(&s[0], s.size()+1, L"%f", val);
657 if (n2 > 0)
658 {
Howard Hinnant28b24882011-12-01 20:21:04 +0000659 s.resize(static_cast<size_t>(n2));
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000660 break;
661 }
662 s.resize(2*s.size());
663 s.resize(s.capacity());
664 }
665 return s;
666}
667
668wstring to_wstring(long double val)
669{
670 const size_t n = 20;
671 wstring s(n, wchar_t());
672 s.resize(s.capacity());
673 while (true)
674 {
675 int n2 = swprintf(&s[0], s.size()+1, L"%Lf", val);
676 if (n2 > 0)
677 {
Howard Hinnant28b24882011-12-01 20:21:04 +0000678 s.resize(static_cast<size_t>(n2));
Howard Hinnanta5f4f8e2010-06-02 18:20:39 +0000679 break;
680 }
681 s.resize(2*s.size());
682 s.resize(s.capacity());
683 }
684 return s;
685}
686
687_LIBCPP_END_NAMESPACE_STD