blob: dc16ce781f76b620a7f55305469b0407ff40787d [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
Louis Dionneb648c612021-06-09 13:41:2740#define _LIBCPP_EXTERN_TEMPLATE_DEFINE(...) template __VA_ARGS__;
Martijn Vels67532642020-03-02 15:11:3541#ifdef _LIBCPP_ABI_STRING_OPTIMIZED_EXTERNAL_INSTANTIATION
Louis Dionne9783f282023-12-18 19:01:3342_LIBCPP_STRING_UNSTABLE_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE_DEFINE, char)
Nikolas Klauserc6f3b7b2024-11-06 09:39:1943# if _LIBCPP_HAS_WIDE_CHARACTERS
Louis Dionne9783f282023-12-18 19:01:3344_LIBCPP_STRING_UNSTABLE_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE_DEFINE, wchar_t)
45# endif
Martijn Velsd8969a12020-02-19 21:27:5046#else
Louis Dionne9783f282023-12-18 19:01:3347_LIBCPP_STRING_V1_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE_DEFINE, char)
Nikolas Klauserc6f3b7b2024-11-06 09:39:1948# if _LIBCPP_HAS_WIDE_CHARACTERS
Louis Dionne9783f282023-12-18 19:01:3349_LIBCPP_STRING_V1_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE_DEFINE, wchar_t)
50# endif
Martijn Velsd8969a12020-02-19 21:27:5051#endif
Louis Dionneb648c612021-06-09 13:41:2752#undef _LIBCPP_EXTERN_TEMPLATE_DEFINE
Howard Hinnantcbbf6332010-06-02 18:20:3953
Louis Dionne9783f282023-12-18 19:01:3354template string operator+ <char, char_traits<char>, allocator<char>>(char const*, string const&);
Howard Hinnantcbbf6332010-06-02 18:20:3955
Louis Dionne9783f282023-12-18 19:01:3356namespace {
Howard Hinnant9daaf572013-05-16 17:13:4057
Louis Dionne63251842022-05-24 15:31:3158inline void throw_from_string_out_of_range(const string& func) {
Louis Dionne9783f282023-12-18 19:01:3359 std::__throw_out_of_range((func + ": out of range").c_str());
Howard Hinnant9daaf572013-05-16 17:13:4060}
61
Louis Dionne63251842022-05-24 15:31:3162inline void throw_from_string_invalid_arg(const string& func) {
Louis Dionne9783f282023-12-18 19:01:3363 std::__throw_invalid_argument((func + ": no conversion").c_str());
Howard Hinnant9daaf572013-05-16 17:13:4064}
65
66// as_integer
67
Louis Dionne9783f282023-12-18 19:01:3368template <typename V, typename S, typename F>
Louis Dionne63251842022-05-24 15:31:3169inline V as_integer_helper(const string& func, const S& str, size_t* idx, int base, F f) {
Louis Dionne9783f282023-12-18 19:01:3370 typename S::value_type* ptr = nullptr;
71 const typename S::value_type* const p = str.c_str();
72 __libcpp_remove_reference_t<decltype(errno)> errno_save = errno;
73 errno = 0;
74 V r = f(p, &ptr, base);
75 swap(errno, errno_save);
76 if (errno_save == ERANGE)
77 throw_from_string_out_of_range(func);
78 if (ptr == p)
79 throw_from_string_invalid_arg(func);
80 if (idx)
81 *idx = static_cast<size_t>(ptr - p);
82 return r;
Howard Hinnant9daaf572013-05-16 17:13:4083}
84
Louis Dionne9783f282023-12-18 19:01:3385template <typename V, typename S>
Louis Dionne63251842022-05-24 15:31:3186inline V as_integer(const string& func, const S& s, size_t* idx, int base);
Howard Hinnant9daaf572013-05-16 17:13:4087
88// string
Louis Dionne9783f282023-12-18 19:01:3389template <>
Louis Dionne63251842022-05-24 15:31:3190inline int as_integer(const string& func, const string& s, size_t* idx, int base) {
Louis Dionne9783f282023-12-18 19:01:3391 // Use long as no Standard string to integer exists.
92 long r = as_integer_helper<long>(func, s, idx, base, strtol);
93 if (r < numeric_limits<int>::min() || numeric_limits<int>::max() < r)
94 throw_from_string_out_of_range(func);
95 return static_cast<int>(r);
Howard Hinnant9daaf572013-05-16 17:13:4096}
97
Louis Dionne9783f282023-12-18 19:01:3398template <>
Louis Dionne63251842022-05-24 15:31:3199inline long as_integer(const string& func, const string& s, size_t* idx, int base) {
Louis Dionne9783f282023-12-18 19:01:33100 return as_integer_helper<long>(func, s, idx, base, strtol);
Howard Hinnant9daaf572013-05-16 17:13:40101}
102
Louis Dionne9783f282023-12-18 19:01:33103template <>
Louis Dionne63251842022-05-24 15:31:31104inline unsigned long as_integer(const string& func, const string& s, size_t* idx, int base) {
Louis Dionne9783f282023-12-18 19:01:33105 return as_integer_helper<unsigned long>(func, s, idx, base, strtoul);
Howard Hinnant9daaf572013-05-16 17:13:40106}
107
Louis Dionne9783f282023-12-18 19:01:33108template <>
Louis Dionne63251842022-05-24 15:31:31109inline long long as_integer(const string& func, const string& s, size_t* idx, int base) {
Louis Dionne9783f282023-12-18 19:01:33110 return as_integer_helper<long long>(func, s, idx, base, strtoll);
Howard Hinnant9daaf572013-05-16 17:13:40111}
112
Louis Dionne9783f282023-12-18 19:01:33113template <>
Louis Dionne63251842022-05-24 15:31:31114inline unsigned long long as_integer(const string& func, const string& s, size_t* idx, int base) {
Louis Dionne9783f282023-12-18 19:01:33115 return as_integer_helper<unsigned long long>(func, s, idx, base, strtoull);
Howard Hinnant9daaf572013-05-16 17:13:40116}
117
Nikolas Klauserc6f3b7b2024-11-06 09:39:19118#if _LIBCPP_HAS_WIDE_CHARACTERS
Howard Hinnant9daaf572013-05-16 17:13:40119// wstring
Louis Dionne9783f282023-12-18 19:01:33120template <>
Louis Dionne63251842022-05-24 15:31:31121inline int as_integer(const string& func, const wstring& s, size_t* idx, int base) {
Louis Dionne9783f282023-12-18 19:01:33122 // Use long as no Stantard string to integer exists.
123 long r = as_integer_helper<long>(func, s, idx, base, wcstol);
124 if (r < numeric_limits<int>::min() || numeric_limits<int>::max() < r)
125 throw_from_string_out_of_range(func);
126 return static_cast<int>(r);
Howard Hinnant9daaf572013-05-16 17:13:40127}
128
Louis Dionne9783f282023-12-18 19:01:33129template <>
Louis Dionne63251842022-05-24 15:31:31130inline long as_integer(const string& func, const wstring& s, size_t* idx, int base) {
Louis Dionne9783f282023-12-18 19:01:33131 return as_integer_helper<long>(func, s, idx, base, wcstol);
Howard Hinnant9daaf572013-05-16 17:13:40132}
133
Louis Dionne9783f282023-12-18 19:01:33134template <>
135inline unsigned long as_integer(const string& func, const wstring& s, size_t* idx, int base) {
136 return as_integer_helper<unsigned long>(func, s, idx, base, wcstoul);
Howard Hinnant9daaf572013-05-16 17:13:40137}
138
Louis Dionne9783f282023-12-18 19:01:33139template <>
Louis Dionne63251842022-05-24 15:31:31140inline long long as_integer(const string& func, const wstring& s, size_t* idx, int base) {
Louis Dionne9783f282023-12-18 19:01:33141 return as_integer_helper<long long>(func, s, idx, base, wcstoll);
Howard Hinnant9daaf572013-05-16 17:13:40142}
143
Louis Dionne9783f282023-12-18 19:01:33144template <>
Louis Dionne63251842022-05-24 15:31:31145inline unsigned long long as_integer(const string& func, const wstring& s, size_t* idx, int base) {
Louis Dionne9783f282023-12-18 19:01:33146 return as_integer_helper<unsigned long long>(func, s, idx, base, wcstoull);
Howard Hinnant9daaf572013-05-16 17:13:40147}
Nikolas Klauserc6f3b7b2024-11-06 09:39:19148#endif // _LIBCPP_HAS_WIDE_CHARACTERS
Howard Hinnant9daaf572013-05-16 17:13:40149
150// as_float
151
Louis Dionne9783f282023-12-18 19:01:33152template <typename V, typename S, typename F>
Louis Dionne63251842022-05-24 15:31:31153inline V as_float_helper(const string& func, const S& str, size_t* idx, F f) {
Louis Dionne9783f282023-12-18 19:01:33154 typename S::value_type* ptr = nullptr;
155 const typename S::value_type* const p = str.c_str();
156 __libcpp_remove_reference_t<decltype(errno)> errno_save = errno;
157 errno = 0;
158 V r = f(p, &ptr);
159 swap(errno, errno_save);
160 if (errno_save == ERANGE)
161 throw_from_string_out_of_range(func);
162 if (ptr == p)
163 throw_from_string_invalid_arg(func);
164 if (idx)
165 *idx = static_cast<size_t>(ptr - p);
166 return r;
Howard Hinnant9daaf572013-05-16 17:13:40167}
168
Louis Dionne9783f282023-12-18 19:01:33169template <typename V, typename S>
Louis Dionne63251842022-05-24 15:31:31170inline V as_float(const string& func, const S& s, size_t* idx = nullptr);
Howard Hinnant9daaf572013-05-16 17:13:40171
Louis Dionne9783f282023-12-18 19:01:33172template <>
Louis Dionne63251842022-05-24 15:31:31173inline float as_float(const string& func, const string& s, size_t* idx) {
Louis Dionne9783f282023-12-18 19:01:33174 return as_float_helper<float>(func, s, idx, strtof);
Howard Hinnant9daaf572013-05-16 17:13:40175}
176
Louis Dionne9783f282023-12-18 19:01:33177template <>
Louis Dionne63251842022-05-24 15:31:31178inline double as_float(const string& func, const string& s, size_t* idx) {
Louis Dionne9783f282023-12-18 19:01:33179 return as_float_helper<double>(func, s, idx, strtod);
Howard Hinnant9daaf572013-05-16 17:13:40180}
181
Louis Dionne9783f282023-12-18 19:01:33182template <>
Louis Dionne63251842022-05-24 15:31:31183inline long double as_float(const string& func, const string& s, size_t* idx) {
Louis Dionne9783f282023-12-18 19:01:33184 return as_float_helper<long double>(func, s, idx, strtold);
Howard Hinnant9daaf572013-05-16 17:13:40185}
186
Nikolas Klauserc6f3b7b2024-11-06 09:39:19187#if _LIBCPP_HAS_WIDE_CHARACTERS
Louis Dionne9783f282023-12-18 19:01:33188template <>
Louis Dionne63251842022-05-24 15:31:31189inline float as_float(const string& func, const wstring& s, size_t* idx) {
Louis Dionne9783f282023-12-18 19:01:33190 return as_float_helper<float>(func, s, idx, wcstof);
Howard Hinnant9daaf572013-05-16 17:13:40191}
192
Louis Dionne9783f282023-12-18 19:01:33193template <>
Louis Dionne63251842022-05-24 15:31:31194inline double as_float(const string& func, const wstring& s, size_t* idx) {
Louis Dionne9783f282023-12-18 19:01:33195 return as_float_helper<double>(func, s, idx, wcstod);
Howard Hinnant9daaf572013-05-16 17:13:40196}
197
Louis Dionne9783f282023-12-18 19:01:33198template <>
Louis Dionne63251842022-05-24 15:31:31199inline long double as_float(const string& func, const wstring& s, size_t* idx) {
Louis Dionne9783f282023-12-18 19:01:33200 return as_float_helper<long double>(func, s, idx, wcstold);
Howard Hinnant9daaf572013-05-16 17:13:40201}
Nikolas Klauserc6f3b7b2024-11-06 09:39:19202#endif // _LIBCPP_HAS_WIDE_CHARACTERS
Howard Hinnant9daaf572013-05-16 17:13:40203
Louis Dionne9783f282023-12-18 19:01:33204} // unnamed namespace
Howard Hinnant9daaf572013-05-16 17:13:40205
Louis Dionne9783f282023-12-18 19:01:33206int stoi(const string& str, size_t* idx, int base) { return as_integer<int>("stoi", str, idx, base); }
Howard Hinnantcbbf6332010-06-02 18:20:39207
Louis Dionne9783f282023-12-18 19:01:33208long stol(const string& str, size_t* idx, int base) { return as_integer<long>("stol", str, idx, base); }
Howard Hinnantcbbf6332010-06-02 18:20:39209
Louis Dionne63251842022-05-24 15:31:31210unsigned long stoul(const string& str, size_t* idx, int base) {
Louis Dionne9783f282023-12-18 19:01:33211 return as_integer<unsigned long>("stoul", str, idx, base);
Howard Hinnantcbbf6332010-06-02 18:20:39212}
213
Louis Dionne9783f282023-12-18 19:01:33214long 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:39215
Louis Dionne63251842022-05-24 15:31:31216unsigned long long stoull(const string& str, size_t* idx, int base) {
Louis Dionne9783f282023-12-18 19:01:33217 return as_integer<unsigned long long>("stoull", str, idx, base);
Howard Hinnantcbbf6332010-06-02 18:20:39218}
219
Louis Dionne9783f282023-12-18 19:01:33220float stof(const string& str, size_t* idx) { return as_float<float>("stof", str, idx); }
Howard Hinnantcbbf6332010-06-02 18:20:39221
Louis Dionne9783f282023-12-18 19:01:33222double stod(const string& str, size_t* idx) { return as_float<double>("stod", str, idx); }
Howard Hinnantcbbf6332010-06-02 18:20:39223
Louis Dionne9783f282023-12-18 19:01:33224long double stold(const string& str, size_t* idx) { return as_float<long double>("stold", str, idx); }
Howard Hinnantcbbf6332010-06-02 18:20:39225
Nikolas Klauserc6f3b7b2024-11-06 09:39:19226#if _LIBCPP_HAS_WIDE_CHARACTERS
Louis Dionne9783f282023-12-18 19:01:33227int stoi(const wstring& str, size_t* idx, int base) { return as_integer<int>("stoi", str, idx, base); }
Louis Dionnedc8a9a02022-05-24 15:22:43228
Louis Dionne9783f282023-12-18 19:01:33229long stol(const wstring& str, size_t* idx, int base) { return as_integer<long>("stol", str, idx, base); }
Louis Dionnedc8a9a02022-05-24 15:22:43230
Louis Dionne63251842022-05-24 15:31:31231unsigned long stoul(const wstring& str, size_t* idx, int base) {
Louis Dionne9783f282023-12-18 19:01:33232 return as_integer<unsigned long>("stoul", str, idx, base);
Louis Dionnedc8a9a02022-05-24 15:22:43233}
234
Louis Dionne9783f282023-12-18 19:01:33235long 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:43236
Louis Dionne63251842022-05-24 15:31:31237unsigned long long stoull(const wstring& str, size_t* idx, int base) {
Louis Dionne9783f282023-12-18 19:01:33238 return as_integer<unsigned long long>("stoull", str, idx, base);
Louis Dionnedc8a9a02022-05-24 15:22:43239}
240
Louis Dionne9783f282023-12-18 19:01:33241float stof(const wstring& str, size_t* idx) { return as_float<float>("stof", str, idx); }
Louis Dionnedc8a9a02022-05-24 15:22:43242
Louis Dionne9783f282023-12-18 19:01:33243double stod(const wstring& str, size_t* idx) { return as_float<double>("stod", str, idx); }
Louis Dionnedc8a9a02022-05-24 15:22:43244
Louis Dionne9783f282023-12-18 19:01:33245long double stold(const wstring& str, size_t* idx) { return as_float<long double>("stold", str, idx); }
Nikolas Klauserc6f3b7b2024-11-06 09:39:19246#endif // _LIBCPP_HAS_WIDE_CHARACTERS
Howard Hinnantcbbf6332010-06-02 18:20:39247
Howard Hinnant9daaf572013-05-16 17:13:40248// to_string
249
Louis Dionne9783f282023-12-18 19:01:33250namespace {
Howard Hinnant9daaf572013-05-16 17:13:40251
252// as_string
253
Louis Dionne9783f282023-12-18 19:01:33254template <typename S, typename P, typename V >
Louis Dionne63251842022-05-24 15:31:31255inline S as_string(P sprintf_like, S s, const typename S::value_type* fmt, V a) {
Louis Dionne9783f282023-12-18 19:01:33256 typedef typename S::size_type size_type;
257 size_type available = s.size();
258 while (true) {
259 int status = sprintf_like(&s[0], available + 1, fmt, a);
260 if (status >= 0) {
261 size_type used = static_cast<size_type>(status);
262 if (used <= available) {
263 s.resize(used);
264 break;
265 }
266 available = used; // Assume this is advice of how much space we need.
267 } else
268 available = available * 2 + 1;
269 s.resize(available);
270 }
271 return s;
Howard Hinnant9daaf572013-05-16 17:13:40272}
273
Marshall Clow141c2b72019-06-10 23:20:01274template <class S>
Howard Hinnant9daaf572013-05-16 17:13:40275struct initial_string;
276
Marshall Clow141c2b72019-06-10 23:20:01277template <>
Louis Dionne63251842022-05-24 15:31:31278struct initial_string<string> {
Louis Dionne9783f282023-12-18 19:01:33279 string operator()() const {
280 string s;
281 s.resize(s.capacity());
282 return s;
283 }
Howard Hinnant9daaf572013-05-16 17:13:40284};
285
Nikolas Klauserc6f3b7b2024-11-06 09:39:19286#if _LIBCPP_HAS_WIDE_CHARACTERS
Marshall Clow141c2b72019-06-10 23:20:01287template <>
Louis Dionne63251842022-05-24 15:31:31288struct initial_string<wstring> {
Louis Dionne9783f282023-12-18 19:01:33289 wstring operator()() const {
290 wstring s(20, wchar_t());
291 s.resize(s.capacity());
292 return s;
293 }
Howard Hinnant9daaf572013-05-16 17:13:40294};
295
Louis Dionne9783f282023-12-18 19:01:33296typedef int (*wide_printf)(wchar_t* __restrict, size_t, const wchar_t* __restrict, ...);
Howard Hinnant9daaf572013-05-16 17:13:40297
Louis Dionne63251842022-05-24 15:31:31298inline wide_printf get_swprintf() {
Louis Dionne9783f282023-12-18 19:01:33299# ifndef _LIBCPP_MSVCRT
300 return swprintf;
301# else
302 return static_cast<int(__cdecl*)(wchar_t* __restrict, size_t, const wchar_t* __restrict, ...)>(_snwprintf);
303# endif
Howard Hinnant9daaf572013-05-16 17:13:40304}
Nikolas Klauserc6f3b7b2024-11-06 09:39:19305#endif // _LIBCPP_HAS_WIDE_CHARACTERS
Howard Hinnant9daaf572013-05-16 17:13:40306
Marshall Clow141c2b72019-06-10 23:20:01307template <typename S, typename V>
Louis Dionne63251842022-05-24 15:31:31308S i_to_string(V v) {
Louis Dionne9783f282023-12-18 19:01:33309 // numeric_limits::digits10 returns value less on 1 than desired for unsigned numbers.
310 // For example, for 1-byte unsigned value digits10 is 2 (999 can not be represented),
311 // so we need +1 here.
312 constexpr size_t bufsize = numeric_limits<V>::digits10 + 2; // +1 for minus, +1 for digits10
313 char buf[bufsize];
314 const auto res = to_chars(buf, buf + bufsize, v);
315 _LIBCPP_ASSERT_INTERNAL(res.ec == errc(), "bufsize must be large enough to accomodate the value");
316 return S(buf, res.ptr);
Marshall Clow141c2b72019-06-10 23:20:01317}
318
Louis Dionne9783f282023-12-18 19:01:33319} // unnamed namespace
Howard Hinnant9daaf572013-05-16 17:13:40320
Louis Dionne9783f282023-12-18 19:01:33321string to_string(int val) { return i_to_string< string>(val); }
322string to_string(long val) { return i_to_string< string>(val); }
323string to_string(long long val) { return i_to_string< string>(val); }
324string to_string(unsigned val) { return i_to_string< string>(val); }
325string to_string(unsigned long val) { return i_to_string< string>(val); }
326string to_string(unsigned long long val) { return i_to_string< string>(val); }
Howard Hinnantcbbf6332010-06-02 18:20:39327
Nikolas Klauserc6f3b7b2024-11-06 09:39:19328#if _LIBCPP_HAS_WIDE_CHARACTERS
Louis Dionne9783f282023-12-18 19:01:33329wstring to_wstring(int val) { return i_to_string<wstring>(val); }
330wstring to_wstring(long val) { return i_to_string<wstring>(val); }
331wstring to_wstring(long long val) { return i_to_string<wstring>(val); }
332wstring to_wstring(unsigned val) { return i_to_string<wstring>(val); }
333wstring to_wstring(unsigned long val) { return i_to_string<wstring>(val); }
Marshall Clow141c2b72019-06-10 23:20:01334wstring to_wstring(unsigned long long val) { return i_to_string<wstring>(val); }
Louis Dionnef4c12582021-08-23 19:32:36335#endif
Howard Hinnantcbbf6332010-06-02 18:20:39336
Louis Dionne9783f282023-12-18 19:01:33337string to_string(float val) { return as_string(snprintf, initial_string< string>()(), "%f", val); }
338string to_string(double val) { return as_string(snprintf, initial_string< string>()(), "%f", val); }
339string to_string(long double val) { return as_string(snprintf, initial_string< string>()(), "%Lf", val); }
Howard Hinnantcbbf6332010-06-02 18:20:39340
Nikolas Klauserc6f3b7b2024-11-06 09:39:19341#if _LIBCPP_HAS_WIDE_CHARACTERS
Louis Dionne9783f282023-12-18 19:01:33342wstring to_wstring(float val) { return as_string(get_swprintf(), initial_string<wstring>()(), L"%f", val); }
343wstring to_wstring(double val) { return as_string(get_swprintf(), initial_string<wstring>()(), L"%f", val); }
Marshall Clow141c2b72019-06-10 23:20:01344wstring to_wstring(long double val) { return as_string(get_swprintf(), initial_string<wstring>()(), L"%Lf", val); }
Louis Dionnef4c12582021-08-23 19:32:36345#endif
Howard Hinnantcbbf6332010-06-02 18:20:39346
Howard Hinnantcbbf6332010-06-02 18:20:39347_LIBCPP_END_NAMESPACE_STD