blob: 55d19a68802b5a39e44354e1d297bdf9ae3fcb6d [file] [log] [blame]
Louis Dionneeb8650a2021-11-17 21:25:011//===----------------------------------------------------------------------===//
Howard Hinnantcbbf6332010-06-02 18:20:392//
Chandler Carruth57b08b02019-01-19 10:56:403// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Howard Hinnantcbbf6332010-06-02 18:20:396//
7//===----------------------------------------------------------------------===//
8
Louis Dionnef87aa192022-02-14 18:41:099#include <__assert>
Arthur O'Dwyerbbb0f2c2022-02-11 18:00:3910#include <cerrno>
11#include <charconv>
12#include <cstdlib>
13#include <limits>
14#include <stdexcept>
Arthur O'Dwyerbbb0f2c2022-02-11 18:00:3915#include <string>
Howard Hinnantcbbf6332010-06-02 18:20:3916
Nikolas Klauserc6f3b7b2024-11-06 09:39:1917#if _LIBCPP_HAS_WIDE_CHARACTERS
Arthur O'Dwyerbbb0f2c2022-02-11 18:00:3918# include <cwchar>
Louis Dionnef4c12582021-08-23 19:32:3619#endif
20
Howard Hinnantcbbf6332010-06-02 18:20:3921_LIBCPP_BEGIN_NAMESPACE_STD
22
Nikolas Klauser5173f432022-02-02 19:15:4023#ifndef _LIBCPP_ABI_DO_NOT_EXPORT_BASIC_STRING_COMMON
24
25template <bool>
26struct __basic_string_common;
27
28// The struct isn't declared anymore in the headers. It's only here for ABI compatibility.
29template <>
30struct __basic_string_common<true> {
Nikolas Klauser748023dc2024-09-11 06:59:4631 [[noreturn]] _LIBCPP_EXPORTED_FROM_ABI void __throw_length_error() const;
32 [[noreturn]] _LIBCPP_EXPORTED_FROM_ABI void __throw_out_of_range() const;
Nikolas Klauser5173f432022-02-02 19:15:4033};
34
Louis Dionne9783f282023-12-18 19:01:3335void __basic_string_common<true>::__throw_length_error() const { std::__throw_length_error("basic_string"); }
36void __basic_string_common<true>::__throw_out_of_range() const { std::__throw_out_of_range("basic_string"); }
Louis Dionne84b0b522021-08-19 16:21:0637
Nikolas Klauser5173f432022-02-02 19:15:4038#endif // _LIBCPP_ABI_DO_NOT_EXPORT_BASIC_STRING_COMMON
Howard Hinnantcbbf6332010-06-02 18:20:3939
Nikolas Klauser2472d382025-02-15 19:11:4840// Define legacy ABI functions
41// ---------------------------
42
43#ifndef _LIBCPP_ABI_STRING_OPTIMIZED_EXTERNAL_INSTANTIATION
44
45template <class _CharT, class _Traits, class _Allocator>
46void basic_string<_CharT, _Traits, _Allocator>::__init(const value_type* __s, size_type __sz, size_type __reserve) {
47 if (__libcpp_is_constant_evaluated())
48 __rep_ = __rep();
49 if (__reserve > max_size())
50 __throw_length_error();
51 pointer __p;
52 if (__fits_in_sso(__reserve)) {
53 __set_short_size(__sz);
54 __p = __get_short_pointer();
55 } else {
56 auto __allocation = std::__allocate_at_least(__alloc_, __recommend(__reserve) + 1);
57 __p = __allocation.ptr;
58 __begin_lifetime(__p, __allocation.count);
59 __set_long_pointer(__p);
60 __set_long_cap(__allocation.count);
61 __set_long_size(__sz);
62 }
63 traits_type::copy(std::__to_address(__p), __s, __sz);
64 traits_type::assign(__p[__sz], value_type());
65 __annotate_new(__sz);
66}
67
68# define STRING_LEGACY_API(CharT) \
69 template _LIBCPP_EXPORTED_FROM_ABI void basic_string<CharT>::__init(const value_type*, size_type, size_type)
70
71STRING_LEGACY_API(char);
72# if _LIBCPP_HAS_WIDE_CHARACTERS
73STRING_LEGACY_API(wchar_t);
74# endif
75
76#endif // _LIBCPP_ABI_STRING_OPTIMIZED_EXTERNAL_INSTANTIATION
77
Nikolas Klauser166e5b12025-04-25 08:43:1378#define _LIBCPP_EXTERN_TEMPLATE_DEFINE(...) template _LIBCPP_EXPORTED_FROM_ABI __VA_ARGS__;
Martijn Vels67532642020-03-02 15:11:3579#ifdef _LIBCPP_ABI_STRING_OPTIMIZED_EXTERNAL_INSTANTIATION
Louis Dionne9783f282023-12-18 19:01:3380_LIBCPP_STRING_UNSTABLE_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE_DEFINE, char)
Nikolas Klauserc6f3b7b2024-11-06 09:39:1981# if _LIBCPP_HAS_WIDE_CHARACTERS
Louis Dionne9783f282023-12-18 19:01:3382_LIBCPP_STRING_UNSTABLE_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE_DEFINE, wchar_t)
83# endif
Martijn Velsd8969a12020-02-19 21:27:5084#else
Louis Dionne9783f282023-12-18 19:01:3385_LIBCPP_STRING_V1_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE_DEFINE, char)
Nikolas Klauserc6f3b7b2024-11-06 09:39:1986# if _LIBCPP_HAS_WIDE_CHARACTERS
Louis Dionne9783f282023-12-18 19:01:3387_LIBCPP_STRING_V1_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE_DEFINE, wchar_t)
88# endif
Martijn Velsd8969a12020-02-19 21:27:5089#endif
Louis Dionneb648c612021-06-09 13:41:2790#undef _LIBCPP_EXTERN_TEMPLATE_DEFINE
Howard Hinnantcbbf6332010-06-02 18:20:3991
Louis Dionne9783f282023-12-18 19:01:3392template string operator+ <char, char_traits<char>, allocator<char>>(char const*, string const&);
Howard Hinnantcbbf6332010-06-02 18:20:3993
Louis Dionne9783f282023-12-18 19:01:3394namespace {
Howard Hinnant9daaf572013-05-16 17:13:4095
Louis Dionne63251842022-05-24 15:31:3196inline void throw_from_string_out_of_range(const string& func) {
Louis Dionne9783f282023-12-18 19:01:3397 std::__throw_out_of_range((func + ": out of range").c_str());
Howard Hinnant9daaf572013-05-16 17:13:4098}
99
Louis Dionne63251842022-05-24 15:31:31100inline void throw_from_string_invalid_arg(const string& func) {
Louis Dionne9783f282023-12-18 19:01:33101 std::__throw_invalid_argument((func + ": no conversion").c_str());
Howard Hinnant9daaf572013-05-16 17:13:40102}
103
104// as_integer
105
Louis Dionne9783f282023-12-18 19:01:33106template <typename V, typename S, typename F>
Louis Dionne63251842022-05-24 15:31:31107inline V as_integer_helper(const string& func, const S& str, size_t* idx, int base, F f) {
Louis Dionne9783f282023-12-18 19:01:33108 typename S::value_type* ptr = nullptr;
109 const typename S::value_type* const p = str.c_str();
110 __libcpp_remove_reference_t<decltype(errno)> errno_save = errno;
111 errno = 0;
112 V r = f(p, &ptr, base);
113 swap(errno, errno_save);
114 if (errno_save == ERANGE)
115 throw_from_string_out_of_range(func);
116 if (ptr == p)
117 throw_from_string_invalid_arg(func);
118 if (idx)
119 *idx = static_cast<size_t>(ptr - p);
120 return r;
Howard Hinnant9daaf572013-05-16 17:13:40121}
122
Louis Dionne9783f282023-12-18 19:01:33123template <typename V, typename S>
Louis Dionne63251842022-05-24 15:31:31124inline V as_integer(const string& func, const S& s, size_t* idx, int base);
Howard Hinnant9daaf572013-05-16 17:13:40125
126// string
Louis Dionne9783f282023-12-18 19:01:33127template <>
Louis Dionne63251842022-05-24 15:31:31128inline int as_integer(const string& func, const string& s, size_t* idx, int base) {
Louis Dionne9783f282023-12-18 19:01:33129 // Use long as no Standard string to integer exists.
130 long r = as_integer_helper<long>(func, s, idx, base, strtol);
131 if (r < numeric_limits<int>::min() || numeric_limits<int>::max() < r)
132 throw_from_string_out_of_range(func);
133 return static_cast<int>(r);
Howard Hinnant9daaf572013-05-16 17:13:40134}
135
Louis Dionne9783f282023-12-18 19:01:33136template <>
Louis Dionne63251842022-05-24 15:31:31137inline long as_integer(const string& func, const string& s, size_t* idx, int base) {
Louis Dionne9783f282023-12-18 19:01:33138 return as_integer_helper<long>(func, s, idx, base, strtol);
Howard Hinnant9daaf572013-05-16 17:13:40139}
140
Louis Dionne9783f282023-12-18 19:01:33141template <>
Louis Dionne63251842022-05-24 15:31:31142inline unsigned long as_integer(const string& func, const string& s, size_t* idx, int base) {
Louis Dionne9783f282023-12-18 19:01:33143 return as_integer_helper<unsigned long>(func, s, idx, base, strtoul);
Howard Hinnant9daaf572013-05-16 17:13:40144}
145
Louis Dionne9783f282023-12-18 19:01:33146template <>
Louis Dionne63251842022-05-24 15:31:31147inline long long as_integer(const string& func, const string& s, size_t* idx, int base) {
Louis Dionne9783f282023-12-18 19:01:33148 return as_integer_helper<long long>(func, s, idx, base, strtoll);
Howard Hinnant9daaf572013-05-16 17:13:40149}
150
Louis Dionne9783f282023-12-18 19:01:33151template <>
Louis Dionne63251842022-05-24 15:31:31152inline unsigned long long as_integer(const string& func, const string& s, size_t* idx, int base) {
Louis Dionne9783f282023-12-18 19:01:33153 return as_integer_helper<unsigned long long>(func, s, idx, base, strtoull);
Howard Hinnant9daaf572013-05-16 17:13:40154}
155
Nikolas Klauserc6f3b7b2024-11-06 09:39:19156#if _LIBCPP_HAS_WIDE_CHARACTERS
Howard Hinnant9daaf572013-05-16 17:13:40157// wstring
Louis Dionne9783f282023-12-18 19:01:33158template <>
Louis Dionne63251842022-05-24 15:31:31159inline int as_integer(const string& func, const wstring& s, size_t* idx, int base) {
Louis Dionne9783f282023-12-18 19:01:33160 // Use long as no Stantard string to integer exists.
161 long r = as_integer_helper<long>(func, s, idx, base, wcstol);
162 if (r < numeric_limits<int>::min() || numeric_limits<int>::max() < r)
163 throw_from_string_out_of_range(func);
164 return static_cast<int>(r);
Howard Hinnant9daaf572013-05-16 17:13:40165}
166
Louis Dionne9783f282023-12-18 19:01:33167template <>
Louis Dionne63251842022-05-24 15:31:31168inline long as_integer(const string& func, const wstring& s, size_t* idx, int base) {
Louis Dionne9783f282023-12-18 19:01:33169 return as_integer_helper<long>(func, s, idx, base, wcstol);
Howard Hinnant9daaf572013-05-16 17:13:40170}
171
Louis Dionne9783f282023-12-18 19:01:33172template <>
173inline unsigned long as_integer(const string& func, const wstring& s, size_t* idx, int base) {
174 return as_integer_helper<unsigned long>(func, s, idx, base, wcstoul);
Howard Hinnant9daaf572013-05-16 17:13:40175}
176
Louis Dionne9783f282023-12-18 19:01:33177template <>
Louis Dionne63251842022-05-24 15:31:31178inline long long as_integer(const string& func, const wstring& s, size_t* idx, int base) {
Louis Dionne9783f282023-12-18 19:01:33179 return as_integer_helper<long long>(func, s, idx, base, wcstoll);
Howard Hinnant9daaf572013-05-16 17:13:40180}
181
Louis Dionne9783f282023-12-18 19:01:33182template <>
Louis Dionne63251842022-05-24 15:31:31183inline unsigned long long as_integer(const string& func, const wstring& s, size_t* idx, int base) {
Louis Dionne9783f282023-12-18 19:01:33184 return as_integer_helper<unsigned long long>(func, s, idx, base, wcstoull);
Howard Hinnant9daaf572013-05-16 17:13:40185}
Nikolas Klauserc6f3b7b2024-11-06 09:39:19186#endif // _LIBCPP_HAS_WIDE_CHARACTERS
Howard Hinnant9daaf572013-05-16 17:13:40187
188// as_float
189
Louis Dionne9783f282023-12-18 19:01:33190template <typename V, typename S, typename F>
Louis Dionne63251842022-05-24 15:31:31191inline V as_float_helper(const string& func, const S& str, size_t* idx, F f) {
Louis Dionne9783f282023-12-18 19:01:33192 typename S::value_type* ptr = nullptr;
193 const typename S::value_type* const p = str.c_str();
194 __libcpp_remove_reference_t<decltype(errno)> errno_save = errno;
195 errno = 0;
196 V r = f(p, &ptr);
197 swap(errno, errno_save);
198 if (errno_save == ERANGE)
199 throw_from_string_out_of_range(func);
200 if (ptr == p)
201 throw_from_string_invalid_arg(func);
202 if (idx)
203 *idx = static_cast<size_t>(ptr - p);
204 return r;
Howard Hinnant9daaf572013-05-16 17:13:40205}
206
Louis Dionne9783f282023-12-18 19:01:33207template <typename V, typename S>
Louis Dionne63251842022-05-24 15:31:31208inline V as_float(const string& func, const S& s, size_t* idx = nullptr);
Howard Hinnant9daaf572013-05-16 17:13:40209
Louis Dionne9783f282023-12-18 19:01:33210template <>
Louis Dionne63251842022-05-24 15:31:31211inline float as_float(const string& func, const string& s, size_t* idx) {
Louis Dionne9783f282023-12-18 19:01:33212 return as_float_helper<float>(func, s, idx, strtof);
Howard Hinnant9daaf572013-05-16 17:13:40213}
214
Louis Dionne9783f282023-12-18 19:01:33215template <>
Louis Dionne63251842022-05-24 15:31:31216inline double as_float(const string& func, const string& s, size_t* idx) {
Louis Dionne9783f282023-12-18 19:01:33217 return as_float_helper<double>(func, s, idx, strtod);
Howard Hinnant9daaf572013-05-16 17:13:40218}
219
Louis Dionne9783f282023-12-18 19:01:33220template <>
Louis Dionne63251842022-05-24 15:31:31221inline long double as_float(const string& func, const string& s, size_t* idx) {
Louis Dionne9783f282023-12-18 19:01:33222 return as_float_helper<long double>(func, s, idx, strtold);
Howard Hinnant9daaf572013-05-16 17:13:40223}
224
Nikolas Klauserc6f3b7b2024-11-06 09:39:19225#if _LIBCPP_HAS_WIDE_CHARACTERS
Louis Dionne9783f282023-12-18 19:01:33226template <>
Louis Dionne63251842022-05-24 15:31:31227inline float as_float(const string& func, const wstring& s, size_t* idx) {
Louis Dionne9783f282023-12-18 19:01:33228 return as_float_helper<float>(func, s, idx, wcstof);
Howard Hinnant9daaf572013-05-16 17:13:40229}
230
Louis Dionne9783f282023-12-18 19:01:33231template <>
Louis Dionne63251842022-05-24 15:31:31232inline double as_float(const string& func, const wstring& s, size_t* idx) {
Louis Dionne9783f282023-12-18 19:01:33233 return as_float_helper<double>(func, s, idx, wcstod);
Howard Hinnant9daaf572013-05-16 17:13:40234}
235
Louis Dionne9783f282023-12-18 19:01:33236template <>
Louis Dionne63251842022-05-24 15:31:31237inline long double as_float(const string& func, const wstring& s, size_t* idx) {
Louis Dionne9783f282023-12-18 19:01:33238 return as_float_helper<long double>(func, s, idx, wcstold);
Howard Hinnant9daaf572013-05-16 17:13:40239}
Nikolas Klauserc6f3b7b2024-11-06 09:39:19240#endif // _LIBCPP_HAS_WIDE_CHARACTERS
Howard Hinnant9daaf572013-05-16 17:13:40241
Louis Dionne9783f282023-12-18 19:01:33242} // unnamed namespace
Howard Hinnant9daaf572013-05-16 17:13:40243
Louis Dionne9783f282023-12-18 19:01:33244int stoi(const string& str, size_t* idx, int base) { return as_integer<int>("stoi", str, idx, base); }
Howard Hinnantcbbf6332010-06-02 18:20:39245
Louis Dionne9783f282023-12-18 19:01:33246long stol(const string& str, size_t* idx, int base) { return as_integer<long>("stol", str, idx, base); }
Howard Hinnantcbbf6332010-06-02 18:20:39247
Louis Dionne63251842022-05-24 15:31:31248unsigned long stoul(const string& str, size_t* idx, int base) {
Louis Dionne9783f282023-12-18 19:01:33249 return as_integer<unsigned long>("stoul", str, idx, base);
Howard Hinnantcbbf6332010-06-02 18:20:39250}
251
Louis Dionne9783f282023-12-18 19:01:33252long long stoll(const string& str, size_t* idx, int base) { return as_integer<long long>("stoll", str, idx, base); }
Howard Hinnantcbbf6332010-06-02 18:20:39253
Louis Dionne63251842022-05-24 15:31:31254unsigned long long stoull(const string& str, size_t* idx, int base) {
Louis Dionne9783f282023-12-18 19:01:33255 return as_integer<unsigned long long>("stoull", str, idx, base);
Howard Hinnantcbbf6332010-06-02 18:20:39256}
257
Louis Dionne9783f282023-12-18 19:01:33258float stof(const string& str, size_t* idx) { return as_float<float>("stof", str, idx); }
Howard Hinnantcbbf6332010-06-02 18:20:39259
Louis Dionne9783f282023-12-18 19:01:33260double stod(const string& str, size_t* idx) { return as_float<double>("stod", str, idx); }
Howard Hinnantcbbf6332010-06-02 18:20:39261
Louis Dionne9783f282023-12-18 19:01:33262long double stold(const string& str, size_t* idx) { return as_float<long double>("stold", str, idx); }
Howard Hinnantcbbf6332010-06-02 18:20:39263
Nikolas Klauserc6f3b7b2024-11-06 09:39:19264#if _LIBCPP_HAS_WIDE_CHARACTERS
Louis Dionne9783f282023-12-18 19:01:33265int stoi(const wstring& str, size_t* idx, int base) { return as_integer<int>("stoi", str, idx, base); }
Louis Dionnedc8a9a02022-05-24 15:22:43266
Louis Dionne9783f282023-12-18 19:01:33267long stol(const wstring& str, size_t* idx, int base) { return as_integer<long>("stol", str, idx, base); }
Louis Dionnedc8a9a02022-05-24 15:22:43268
Louis Dionne63251842022-05-24 15:31:31269unsigned long stoul(const wstring& str, size_t* idx, int base) {
Louis Dionne9783f282023-12-18 19:01:33270 return as_integer<unsigned long>("stoul", str, idx, base);
Louis Dionnedc8a9a02022-05-24 15:22:43271}
272
Louis Dionne9783f282023-12-18 19:01:33273long long stoll(const wstring& str, size_t* idx, int base) { return as_integer<long long>("stoll", str, idx, base); }
Louis Dionnedc8a9a02022-05-24 15:22:43274
Louis Dionne63251842022-05-24 15:31:31275unsigned long long stoull(const wstring& str, size_t* idx, int base) {
Louis Dionne9783f282023-12-18 19:01:33276 return as_integer<unsigned long long>("stoull", str, idx, base);
Louis Dionnedc8a9a02022-05-24 15:22:43277}
278
Louis Dionne9783f282023-12-18 19:01:33279float stof(const wstring& str, size_t* idx) { return as_float<float>("stof", str, idx); }
Louis Dionnedc8a9a02022-05-24 15:22:43280
Louis Dionne9783f282023-12-18 19:01:33281double stod(const wstring& str, size_t* idx) { return as_float<double>("stod", str, idx); }
Louis Dionnedc8a9a02022-05-24 15:22:43282
Louis Dionne9783f282023-12-18 19:01:33283long double stold(const wstring& str, size_t* idx) { return as_float<long double>("stold", str, idx); }
Nikolas Klauserc6f3b7b2024-11-06 09:39:19284#endif // _LIBCPP_HAS_WIDE_CHARACTERS
Howard Hinnantcbbf6332010-06-02 18:20:39285
Howard Hinnant9daaf572013-05-16 17:13:40286// to_string
287
Louis Dionne9783f282023-12-18 19:01:33288namespace {
Howard Hinnant9daaf572013-05-16 17:13:40289
290// as_string
291
Louis Dionne9783f282023-12-18 19:01:33292template <typename S, typename P, typename V >
Louis Dionne63251842022-05-24 15:31:31293inline S as_string(P sprintf_like, S s, const typename S::value_type* fmt, V a) {
Louis Dionne9783f282023-12-18 19:01:33294 typedef typename S::size_type size_type;
295 size_type available = s.size();
296 while (true) {
297 int status = sprintf_like(&s[0], available + 1, fmt, a);
298 if (status >= 0) {
299 size_type used = static_cast<size_type>(status);
300 if (used <= available) {
301 s.resize(used);
302 break;
303 }
304 available = used; // Assume this is advice of how much space we need.
305 } else
306 available = available * 2 + 1;
307 s.resize(available);
308 }
309 return s;
Howard Hinnant9daaf572013-05-16 17:13:40310}
311
Marshall Clow141c2b72019-06-10 23:20:01312template <class S>
Howard Hinnant9daaf572013-05-16 17:13:40313struct initial_string;
314
Marshall Clow141c2b72019-06-10 23:20:01315template <>
Louis Dionne63251842022-05-24 15:31:31316struct initial_string<string> {
Louis Dionne9783f282023-12-18 19:01:33317 string operator()() const {
318 string s;
319 s.resize(s.capacity());
320 return s;
321 }
Howard Hinnant9daaf572013-05-16 17:13:40322};
323
Nikolas Klauserc6f3b7b2024-11-06 09:39:19324#if _LIBCPP_HAS_WIDE_CHARACTERS
Marshall Clow141c2b72019-06-10 23:20:01325template <>
Louis Dionne63251842022-05-24 15:31:31326struct initial_string<wstring> {
Louis Dionne9783f282023-12-18 19:01:33327 wstring operator()() const {
328 wstring s(20, wchar_t());
329 s.resize(s.capacity());
330 return s;
331 }
Howard Hinnant9daaf572013-05-16 17:13:40332};
333
Louis Dionne9783f282023-12-18 19:01:33334typedef int (*wide_printf)(wchar_t* __restrict, size_t, const wchar_t* __restrict, ...);
Howard Hinnant9daaf572013-05-16 17:13:40335
Louis Dionne63251842022-05-24 15:31:31336inline wide_printf get_swprintf() {
Louis Dionne9783f282023-12-18 19:01:33337# ifndef _LIBCPP_MSVCRT
338 return swprintf;
339# else
340 return static_cast<int(__cdecl*)(wchar_t* __restrict, size_t, const wchar_t* __restrict, ...)>(_snwprintf);
341# endif
Howard Hinnant9daaf572013-05-16 17:13:40342}
Nikolas Klauserc6f3b7b2024-11-06 09:39:19343#endif // _LIBCPP_HAS_WIDE_CHARACTERS
Howard Hinnant9daaf572013-05-16 17:13:40344
Marshall Clow141c2b72019-06-10 23:20:01345template <typename S, typename V>
Louis Dionne63251842022-05-24 15:31:31346S i_to_string(V v) {
Louis Dionne9783f282023-12-18 19:01:33347 // numeric_limits::digits10 returns value less on 1 than desired for unsigned numbers.
348 // For example, for 1-byte unsigned value digits10 is 2 (999 can not be represented),
349 // so we need +1 here.
350 constexpr size_t bufsize = numeric_limits<V>::digits10 + 2; // +1 for minus, +1 for digits10
351 char buf[bufsize];
352 const auto res = to_chars(buf, buf + bufsize, v);
353 _LIBCPP_ASSERT_INTERNAL(res.ec == errc(), "bufsize must be large enough to accomodate the value");
354 return S(buf, res.ptr);
Marshall Clow141c2b72019-06-10 23:20:01355}
356
Louis Dionne9783f282023-12-18 19:01:33357} // unnamed namespace
Howard Hinnant9daaf572013-05-16 17:13:40358
Louis Dionne9783f282023-12-18 19:01:33359string to_string(int val) { return i_to_string< string>(val); }
360string to_string(long val) { return i_to_string< string>(val); }
361string to_string(long long val) { return i_to_string< string>(val); }
362string to_string(unsigned val) { return i_to_string< string>(val); }
363string to_string(unsigned long val) { return i_to_string< string>(val); }
364string to_string(unsigned long long val) { return i_to_string< string>(val); }
Howard Hinnantcbbf6332010-06-02 18:20:39365
Nikolas Klauserc6f3b7b2024-11-06 09:39:19366#if _LIBCPP_HAS_WIDE_CHARACTERS
Louis Dionne9783f282023-12-18 19:01:33367wstring to_wstring(int val) { return i_to_string<wstring>(val); }
368wstring to_wstring(long val) { return i_to_string<wstring>(val); }
369wstring to_wstring(long long val) { return i_to_string<wstring>(val); }
370wstring to_wstring(unsigned val) { return i_to_string<wstring>(val); }
371wstring to_wstring(unsigned long val) { return i_to_string<wstring>(val); }
Marshall Clow141c2b72019-06-10 23:20:01372wstring to_wstring(unsigned long long val) { return i_to_string<wstring>(val); }
Louis Dionnef4c12582021-08-23 19:32:36373#endif
Howard Hinnantcbbf6332010-06-02 18:20:39374
Louis Dionne9783f282023-12-18 19:01:33375string to_string(float val) { return as_string(snprintf, initial_string< string>()(), "%f", val); }
376string to_string(double val) { return as_string(snprintf, initial_string< string>()(), "%f", val); }
377string to_string(long double val) { return as_string(snprintf, initial_string< string>()(), "%Lf", val); }
Howard Hinnantcbbf6332010-06-02 18:20:39378
Nikolas Klauserc6f3b7b2024-11-06 09:39:19379#if _LIBCPP_HAS_WIDE_CHARACTERS
Louis Dionne9783f282023-12-18 19:01:33380wstring to_wstring(float val) { return as_string(get_swprintf(), initial_string<wstring>()(), L"%f", val); }
381wstring to_wstring(double val) { return as_string(get_swprintf(), initial_string<wstring>()(), L"%f", val); }
Marshall Clow141c2b72019-06-10 23:20:01382wstring to_wstring(long double val) { return as_string(get_swprintf(), initial_string<wstring>()(), L"%Lf", val); }
Louis Dionnef4c12582021-08-23 19:32:36383#endif
Howard Hinnantcbbf6332010-06-02 18:20:39384
Howard Hinnantcbbf6332010-06-02 18:20:39385_LIBCPP_END_NAMESPACE_STD