xref: /aosp_15_r20/external/libcxx/include/charconv (revision 58b9f456b02922dfdb1fad8a988d5fd8765ecb80)
1*58b9f456SAndroid Build Coastguard Worker// -*- C++ -*-
2*58b9f456SAndroid Build Coastguard Worker//===------------------------------ charconv ------------------------------===//
3*58b9f456SAndroid Build Coastguard Worker//
4*58b9f456SAndroid Build Coastguard Worker//                     The LLVM Compiler Infrastructure
5*58b9f456SAndroid Build Coastguard Worker//
6*58b9f456SAndroid Build Coastguard Worker// This file is dual licensed under the MIT and the University of Illinois Open
7*58b9f456SAndroid Build Coastguard Worker// Source Licenses. See LICENSE.TXT for details.
8*58b9f456SAndroid Build Coastguard Worker//
9*58b9f456SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
10*58b9f456SAndroid Build Coastguard Worker
11*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_CHARCONV
12*58b9f456SAndroid Build Coastguard Worker#define _LIBCPP_CHARCONV
13*58b9f456SAndroid Build Coastguard Worker
14*58b9f456SAndroid Build Coastguard Worker/*
15*58b9f456SAndroid Build Coastguard Worker    charconv synopsis
16*58b9f456SAndroid Build Coastguard Worker
17*58b9f456SAndroid Build Coastguard Workernamespace std {
18*58b9f456SAndroid Build Coastguard Worker
19*58b9f456SAndroid Build Coastguard Worker  // floating-point format for primitive numerical conversion
20*58b9f456SAndroid Build Coastguard Worker  enum class chars_format {
21*58b9f456SAndroid Build Coastguard Worker    scientific = unspecified,
22*58b9f456SAndroid Build Coastguard Worker    fixed = unspecified,
23*58b9f456SAndroid Build Coastguard Worker    hex = unspecified,
24*58b9f456SAndroid Build Coastguard Worker    general = fixed | scientific
25*58b9f456SAndroid Build Coastguard Worker  };
26*58b9f456SAndroid Build Coastguard Worker
27*58b9f456SAndroid Build Coastguard Worker  // 23.20.2, primitive numerical output conversion
28*58b9f456SAndroid Build Coastguard Worker  struct to_chars_result {
29*58b9f456SAndroid Build Coastguard Worker    char* ptr;
30*58b9f456SAndroid Build Coastguard Worker    errc ec;
31*58b9f456SAndroid Build Coastguard Worker  };
32*58b9f456SAndroid Build Coastguard Worker
33*58b9f456SAndroid Build Coastguard Worker  to_chars_result to_chars(char* first, char* last, see below value,
34*58b9f456SAndroid Build Coastguard Worker                           int base = 10);
35*58b9f456SAndroid Build Coastguard Worker
36*58b9f456SAndroid Build Coastguard Worker  to_chars_result to_chars(char* first, char* last, float value);
37*58b9f456SAndroid Build Coastguard Worker  to_chars_result to_chars(char* first, char* last, double value);
38*58b9f456SAndroid Build Coastguard Worker  to_chars_result to_chars(char* first, char* last, long double value);
39*58b9f456SAndroid Build Coastguard Worker
40*58b9f456SAndroid Build Coastguard Worker  to_chars_result to_chars(char* first, char* last, float value,
41*58b9f456SAndroid Build Coastguard Worker                           chars_format fmt);
42*58b9f456SAndroid Build Coastguard Worker  to_chars_result to_chars(char* first, char* last, double value,
43*58b9f456SAndroid Build Coastguard Worker                           chars_format fmt);
44*58b9f456SAndroid Build Coastguard Worker  to_chars_result to_chars(char* first, char* last, long double value,
45*58b9f456SAndroid Build Coastguard Worker                           chars_format fmt);
46*58b9f456SAndroid Build Coastguard Worker
47*58b9f456SAndroid Build Coastguard Worker  to_chars_result to_chars(char* first, char* last, float value,
48*58b9f456SAndroid Build Coastguard Worker                           chars_format fmt, int precision);
49*58b9f456SAndroid Build Coastguard Worker  to_chars_result to_chars(char* first, char* last, double value,
50*58b9f456SAndroid Build Coastguard Worker                           chars_format fmt, int precision);
51*58b9f456SAndroid Build Coastguard Worker  to_chars_result to_chars(char* first, char* last, long double value,
52*58b9f456SAndroid Build Coastguard Worker                           chars_format fmt, int precision);
53*58b9f456SAndroid Build Coastguard Worker
54*58b9f456SAndroid Build Coastguard Worker  // 23.20.3, primitive numerical input conversion
55*58b9f456SAndroid Build Coastguard Worker  struct from_chars_result {
56*58b9f456SAndroid Build Coastguard Worker    const char* ptr;
57*58b9f456SAndroid Build Coastguard Worker    errc ec;
58*58b9f456SAndroid Build Coastguard Worker  };
59*58b9f456SAndroid Build Coastguard Worker
60*58b9f456SAndroid Build Coastguard Worker  from_chars_result from_chars(const char* first, const char* last,
61*58b9f456SAndroid Build Coastguard Worker                               see below& value, int base = 10);
62*58b9f456SAndroid Build Coastguard Worker
63*58b9f456SAndroid Build Coastguard Worker  from_chars_result from_chars(const char* first, const char* last,
64*58b9f456SAndroid Build Coastguard Worker                               float& value,
65*58b9f456SAndroid Build Coastguard Worker                               chars_format fmt = chars_format::general);
66*58b9f456SAndroid Build Coastguard Worker  from_chars_result from_chars(const char* first, const char* last,
67*58b9f456SAndroid Build Coastguard Worker                               double& value,
68*58b9f456SAndroid Build Coastguard Worker                               chars_format fmt = chars_format::general);
69*58b9f456SAndroid Build Coastguard Worker  from_chars_result from_chars(const char* first, const char* last,
70*58b9f456SAndroid Build Coastguard Worker                               long double& value,
71*58b9f456SAndroid Build Coastguard Worker                               chars_format fmt = chars_format::general);
72*58b9f456SAndroid Build Coastguard Worker
73*58b9f456SAndroid Build Coastguard Worker} // namespace std
74*58b9f456SAndroid Build Coastguard Worker
75*58b9f456SAndroid Build Coastguard Worker*/
76*58b9f456SAndroid Build Coastguard Worker
77*58b9f456SAndroid Build Coastguard Worker#include <__errc>
78*58b9f456SAndroid Build Coastguard Worker#include <type_traits>
79*58b9f456SAndroid Build Coastguard Worker#include <limits>
80*58b9f456SAndroid Build Coastguard Worker#include <stdint.h>
81*58b9f456SAndroid Build Coastguard Worker#include <string.h>
82*58b9f456SAndroid Build Coastguard Worker#include <math.h>
83*58b9f456SAndroid Build Coastguard Worker
84*58b9f456SAndroid Build Coastguard Worker#include <__debug>
85*58b9f456SAndroid Build Coastguard Worker
86*58b9f456SAndroid Build Coastguard Worker#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
87*58b9f456SAndroid Build Coastguard Worker#pragma GCC system_header
88*58b9f456SAndroid Build Coastguard Worker#endif
89*58b9f456SAndroid Build Coastguard Worker
90*58b9f456SAndroid Build Coastguard Worker_LIBCPP_PUSH_MACROS
91*58b9f456SAndroid Build Coastguard Worker#include <__undef_macros>
92*58b9f456SAndroid Build Coastguard Worker
93*58b9f456SAndroid Build Coastguard Worker_LIBCPP_BEGIN_NAMESPACE_STD
94*58b9f456SAndroid Build Coastguard Worker
95*58b9f456SAndroid Build Coastguard Workernamespace __itoa {
96*58b9f456SAndroid Build Coastguard Worker_LIBCPP_FUNC_VIS char* __u64toa(uint64_t __value, char* __buffer);
97*58b9f456SAndroid Build Coastguard Worker_LIBCPP_FUNC_VIS char* __u32toa(uint32_t __value, char* __buffer);
98*58b9f456SAndroid Build Coastguard Worker}
99*58b9f456SAndroid Build Coastguard Worker
100*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
101*58b9f456SAndroid Build Coastguard Worker
102*58b9f456SAndroid Build Coastguard Workerenum class _LIBCPP_ENUM_VIS chars_format
103*58b9f456SAndroid Build Coastguard Worker{
104*58b9f456SAndroid Build Coastguard Worker    scientific = 0x1,
105*58b9f456SAndroid Build Coastguard Worker    fixed = 0x2,
106*58b9f456SAndroid Build Coastguard Worker    hex = 0x4,
107*58b9f456SAndroid Build Coastguard Worker    general = fixed | scientific
108*58b9f456SAndroid Build Coastguard Worker};
109*58b9f456SAndroid Build Coastguard Worker
110*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TYPE_VIS to_chars_result
111*58b9f456SAndroid Build Coastguard Worker{
112*58b9f456SAndroid Build Coastguard Worker    char* ptr;
113*58b9f456SAndroid Build Coastguard Worker    errc ec;
114*58b9f456SAndroid Build Coastguard Worker};
115*58b9f456SAndroid Build Coastguard Worker
116*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TYPE_VIS from_chars_result
117*58b9f456SAndroid Build Coastguard Worker{
118*58b9f456SAndroid Build Coastguard Worker    const char* ptr;
119*58b9f456SAndroid Build Coastguard Worker    errc ec;
120*58b9f456SAndroid Build Coastguard Worker};
121*58b9f456SAndroid Build Coastguard Worker
122*58b9f456SAndroid Build Coastguard Workervoid to_chars(char*, char*, bool, int = 10) = delete;
123*58b9f456SAndroid Build Coastguard Workervoid from_chars(const char*, const char*, bool, int = 10) = delete;
124*58b9f456SAndroid Build Coastguard Worker
125*58b9f456SAndroid Build Coastguard Workernamespace __itoa
126*58b9f456SAndroid Build Coastguard Worker{
127*58b9f456SAndroid Build Coastguard Worker
128*58b9f456SAndroid Build Coastguard Workerstatic constexpr uint64_t __pow10_64[] = {
129*58b9f456SAndroid Build Coastguard Worker    UINT64_C(0),
130*58b9f456SAndroid Build Coastguard Worker    UINT64_C(10),
131*58b9f456SAndroid Build Coastguard Worker    UINT64_C(100),
132*58b9f456SAndroid Build Coastguard Worker    UINT64_C(1000),
133*58b9f456SAndroid Build Coastguard Worker    UINT64_C(10000),
134*58b9f456SAndroid Build Coastguard Worker    UINT64_C(100000),
135*58b9f456SAndroid Build Coastguard Worker    UINT64_C(1000000),
136*58b9f456SAndroid Build Coastguard Worker    UINT64_C(10000000),
137*58b9f456SAndroid Build Coastguard Worker    UINT64_C(100000000),
138*58b9f456SAndroid Build Coastguard Worker    UINT64_C(1000000000),
139*58b9f456SAndroid Build Coastguard Worker    UINT64_C(10000000000),
140*58b9f456SAndroid Build Coastguard Worker    UINT64_C(100000000000),
141*58b9f456SAndroid Build Coastguard Worker    UINT64_C(1000000000000),
142*58b9f456SAndroid Build Coastguard Worker    UINT64_C(10000000000000),
143*58b9f456SAndroid Build Coastguard Worker    UINT64_C(100000000000000),
144*58b9f456SAndroid Build Coastguard Worker    UINT64_C(1000000000000000),
145*58b9f456SAndroid Build Coastguard Worker    UINT64_C(10000000000000000),
146*58b9f456SAndroid Build Coastguard Worker    UINT64_C(100000000000000000),
147*58b9f456SAndroid Build Coastguard Worker    UINT64_C(1000000000000000000),
148*58b9f456SAndroid Build Coastguard Worker    UINT64_C(10000000000000000000),
149*58b9f456SAndroid Build Coastguard Worker};
150*58b9f456SAndroid Build Coastguard Worker
151*58b9f456SAndroid Build Coastguard Workerstatic constexpr uint32_t __pow10_32[] = {
152*58b9f456SAndroid Build Coastguard Worker    UINT32_C(0),          UINT32_C(10),       UINT32_C(100),
153*58b9f456SAndroid Build Coastguard Worker    UINT32_C(1000),       UINT32_C(10000),    UINT32_C(100000),
154*58b9f456SAndroid Build Coastguard Worker    UINT32_C(1000000),    UINT32_C(10000000), UINT32_C(100000000),
155*58b9f456SAndroid Build Coastguard Worker    UINT32_C(1000000000),
156*58b9f456SAndroid Build Coastguard Worker};
157*58b9f456SAndroid Build Coastguard Worker
158*58b9f456SAndroid Build Coastguard Workertemplate <typename _Tp, typename = void>
159*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_HIDDEN __traits_base
160*58b9f456SAndroid Build Coastguard Worker{
161*58b9f456SAndroid Build Coastguard Worker    using type = uint64_t;
162*58b9f456SAndroid Build Coastguard Worker
163*58b9f456SAndroid Build Coastguard Worker#if !defined(_LIBCPP_COMPILER_MSVC)
164*58b9f456SAndroid Build Coastguard Worker    static _LIBCPP_INLINE_VISIBILITY int __width(_Tp __v)
165*58b9f456SAndroid Build Coastguard Worker    {
166*58b9f456SAndroid Build Coastguard Worker        auto __t = (64 - __builtin_clzll(__v | 1)) * 1233 >> 12;
167*58b9f456SAndroid Build Coastguard Worker        return __t - (__v < __pow10_64[__t]) + 1;
168*58b9f456SAndroid Build Coastguard Worker    }
169*58b9f456SAndroid Build Coastguard Worker#endif
170*58b9f456SAndroid Build Coastguard Worker
171*58b9f456SAndroid Build Coastguard Worker    static _LIBCPP_INLINE_VISIBILITY char* __convert(_Tp __v, char* __p)
172*58b9f456SAndroid Build Coastguard Worker    {
173*58b9f456SAndroid Build Coastguard Worker        return __u64toa(__v, __p);
174*58b9f456SAndroid Build Coastguard Worker    }
175*58b9f456SAndroid Build Coastguard Worker
176*58b9f456SAndroid Build Coastguard Worker    static _LIBCPP_INLINE_VISIBILITY auto& __pow() { return __pow10_64; }
177*58b9f456SAndroid Build Coastguard Worker};
178*58b9f456SAndroid Build Coastguard Worker
179*58b9f456SAndroid Build Coastguard Workertemplate <typename _Tp>
180*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_HIDDEN
181*58b9f456SAndroid Build Coastguard Worker    __traits_base<_Tp, decltype(void(uint32_t{declval<_Tp>()}))>
182*58b9f456SAndroid Build Coastguard Worker{
183*58b9f456SAndroid Build Coastguard Worker    using type = uint32_t;
184*58b9f456SAndroid Build Coastguard Worker
185*58b9f456SAndroid Build Coastguard Worker#if !defined(_LIBCPP_COMPILER_MSVC)
186*58b9f456SAndroid Build Coastguard Worker    static _LIBCPP_INLINE_VISIBILITY int __width(_Tp __v)
187*58b9f456SAndroid Build Coastguard Worker    {
188*58b9f456SAndroid Build Coastguard Worker        auto __t = (32 - __builtin_clz(__v | 1)) * 1233 >> 12;
189*58b9f456SAndroid Build Coastguard Worker        return __t - (__v < __pow10_32[__t]) + 1;
190*58b9f456SAndroid Build Coastguard Worker    }
191*58b9f456SAndroid Build Coastguard Worker#endif
192*58b9f456SAndroid Build Coastguard Worker
193*58b9f456SAndroid Build Coastguard Worker    static _LIBCPP_INLINE_VISIBILITY char* __convert(_Tp __v, char* __p)
194*58b9f456SAndroid Build Coastguard Worker    {
195*58b9f456SAndroid Build Coastguard Worker        return __u32toa(__v, __p);
196*58b9f456SAndroid Build Coastguard Worker    }
197*58b9f456SAndroid Build Coastguard Worker
198*58b9f456SAndroid Build Coastguard Worker    static _LIBCPP_INLINE_VISIBILITY auto& __pow() { return __pow10_32; }
199*58b9f456SAndroid Build Coastguard Worker};
200*58b9f456SAndroid Build Coastguard Worker
201*58b9f456SAndroid Build Coastguard Workertemplate <typename _Tp>
202*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY bool
203*58b9f456SAndroid Build Coastguard Worker__mul_overflowed(unsigned char __a, _Tp __b, unsigned char& __r)
204*58b9f456SAndroid Build Coastguard Worker{
205*58b9f456SAndroid Build Coastguard Worker    auto __c = __a * __b;
206*58b9f456SAndroid Build Coastguard Worker    __r = __c;
207*58b9f456SAndroid Build Coastguard Worker    return __c > (numeric_limits<unsigned char>::max)();
208*58b9f456SAndroid Build Coastguard Worker}
209*58b9f456SAndroid Build Coastguard Worker
210*58b9f456SAndroid Build Coastguard Workertemplate <typename _Tp>
211*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY bool
212*58b9f456SAndroid Build Coastguard Worker__mul_overflowed(unsigned short __a, _Tp __b, unsigned short& __r)
213*58b9f456SAndroid Build Coastguard Worker{
214*58b9f456SAndroid Build Coastguard Worker    auto __c = __a * __b;
215*58b9f456SAndroid Build Coastguard Worker    __r = __c;
216*58b9f456SAndroid Build Coastguard Worker    return __c > (numeric_limits<unsigned short>::max)();
217*58b9f456SAndroid Build Coastguard Worker}
218*58b9f456SAndroid Build Coastguard Worker
219*58b9f456SAndroid Build Coastguard Workertemplate <typename _Tp>
220*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY bool
221*58b9f456SAndroid Build Coastguard Worker__mul_overflowed(_Tp __a, _Tp __b, _Tp& __r)
222*58b9f456SAndroid Build Coastguard Worker{
223*58b9f456SAndroid Build Coastguard Worker    static_assert(is_unsigned<_Tp>::value, "");
224*58b9f456SAndroid Build Coastguard Worker#if !defined(_LIBCPP_COMPILER_MSVC)
225*58b9f456SAndroid Build Coastguard Worker    return __builtin_mul_overflow(__a, __b, &__r);
226*58b9f456SAndroid Build Coastguard Worker#else
227*58b9f456SAndroid Build Coastguard Worker    bool __did = __b && ((numeric_limits<_Tp>::max)() / __b) < __a;
228*58b9f456SAndroid Build Coastguard Worker    __r = __a * __b;
229*58b9f456SAndroid Build Coastguard Worker    return __did;
230*58b9f456SAndroid Build Coastguard Worker#endif
231*58b9f456SAndroid Build Coastguard Worker}
232*58b9f456SAndroid Build Coastguard Worker
233*58b9f456SAndroid Build Coastguard Workertemplate <typename _Tp, typename _Up>
234*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY bool
235*58b9f456SAndroid Build Coastguard Worker__mul_overflowed(_Tp __a, _Up __b, _Tp& __r)
236*58b9f456SAndroid Build Coastguard Worker{
237*58b9f456SAndroid Build Coastguard Worker    return __mul_overflowed(__a, static_cast<_Tp>(__b), __r);
238*58b9f456SAndroid Build Coastguard Worker}
239*58b9f456SAndroid Build Coastguard Worker
240*58b9f456SAndroid Build Coastguard Workertemplate <typename _Tp>
241*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_HIDDEN __traits : __traits_base<_Tp>
242*58b9f456SAndroid Build Coastguard Worker{
243*58b9f456SAndroid Build Coastguard Worker    static constexpr int digits = numeric_limits<_Tp>::digits10 + 1;
244*58b9f456SAndroid Build Coastguard Worker    using __traits_base<_Tp>::__pow;
245*58b9f456SAndroid Build Coastguard Worker    using typename __traits_base<_Tp>::type;
246*58b9f456SAndroid Build Coastguard Worker
247*58b9f456SAndroid Build Coastguard Worker    // precondition: at least one non-zero character available
248*58b9f456SAndroid Build Coastguard Worker    static _LIBCPP_INLINE_VISIBILITY char const*
249*58b9f456SAndroid Build Coastguard Worker    __read(char const* __p, char const* __ep, type& __a, type& __b)
250*58b9f456SAndroid Build Coastguard Worker    {
251*58b9f456SAndroid Build Coastguard Worker        type __cprod[digits];
252*58b9f456SAndroid Build Coastguard Worker        int __j = digits - 1;
253*58b9f456SAndroid Build Coastguard Worker        int __i = digits;
254*58b9f456SAndroid Build Coastguard Worker        do
255*58b9f456SAndroid Build Coastguard Worker        {
256*58b9f456SAndroid Build Coastguard Worker            if (!('0' <= *__p && *__p <= '9'))
257*58b9f456SAndroid Build Coastguard Worker                break;
258*58b9f456SAndroid Build Coastguard Worker            __cprod[--__i] = *__p++ - '0';
259*58b9f456SAndroid Build Coastguard Worker        } while (__p != __ep && __i != 0);
260*58b9f456SAndroid Build Coastguard Worker
261*58b9f456SAndroid Build Coastguard Worker        __a = __inner_product(__cprod + __i + 1, __cprod + __j, __pow() + 1,
262*58b9f456SAndroid Build Coastguard Worker                              __cprod[__i]);
263*58b9f456SAndroid Build Coastguard Worker        if (__mul_overflowed(__cprod[__j], __pow()[__j - __i], __b))
264*58b9f456SAndroid Build Coastguard Worker            --__p;
265*58b9f456SAndroid Build Coastguard Worker        return __p;
266*58b9f456SAndroid Build Coastguard Worker    }
267*58b9f456SAndroid Build Coastguard Worker
268*58b9f456SAndroid Build Coastguard Worker    template <typename _It1, typename _It2, class _Up>
269*58b9f456SAndroid Build Coastguard Worker    static _LIBCPP_INLINE_VISIBILITY _Up
270*58b9f456SAndroid Build Coastguard Worker    __inner_product(_It1 __first1, _It1 __last1, _It2 __first2, _Up __init)
271*58b9f456SAndroid Build Coastguard Worker    {
272*58b9f456SAndroid Build Coastguard Worker        for (; __first1 < __last1; ++__first1, ++__first2)
273*58b9f456SAndroid Build Coastguard Worker            __init = __init + *__first1 * *__first2;
274*58b9f456SAndroid Build Coastguard Worker        return __init;
275*58b9f456SAndroid Build Coastguard Worker    }
276*58b9f456SAndroid Build Coastguard Worker};
277*58b9f456SAndroid Build Coastguard Worker
278*58b9f456SAndroid Build Coastguard Worker}  // namespace __itoa
279*58b9f456SAndroid Build Coastguard Worker
280*58b9f456SAndroid Build Coastguard Workertemplate <typename _Tp>
281*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY _Tp
282*58b9f456SAndroid Build Coastguard Worker__complement(_Tp __x)
283*58b9f456SAndroid Build Coastguard Worker{
284*58b9f456SAndroid Build Coastguard Worker    static_assert(is_unsigned<_Tp>::value, "cast to unsigned first");
285*58b9f456SAndroid Build Coastguard Worker    return _Tp(~__x + 1);
286*58b9f456SAndroid Build Coastguard Worker}
287*58b9f456SAndroid Build Coastguard Worker
288*58b9f456SAndroid Build Coastguard Workertemplate <typename _Tp>
289*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY auto
290*58b9f456SAndroid Build Coastguard Worker__to_unsigned(_Tp __x)
291*58b9f456SAndroid Build Coastguard Worker{
292*58b9f456SAndroid Build Coastguard Worker    return static_cast<make_unsigned_t<_Tp>>(__x);
293*58b9f456SAndroid Build Coastguard Worker}
294*58b9f456SAndroid Build Coastguard Worker
295*58b9f456SAndroid Build Coastguard Workertemplate <typename _Tp>
296*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY to_chars_result
297*58b9f456SAndroid Build Coastguard Worker__to_chars_itoa(char* __first, char* __last, _Tp __value, true_type)
298*58b9f456SAndroid Build Coastguard Worker{
299*58b9f456SAndroid Build Coastguard Worker    auto __x = __to_unsigned(__value);
300*58b9f456SAndroid Build Coastguard Worker    if (__value < 0 && __first != __last)
301*58b9f456SAndroid Build Coastguard Worker    {
302*58b9f456SAndroid Build Coastguard Worker        *__first++ = '-';
303*58b9f456SAndroid Build Coastguard Worker        __x = __complement(__x);
304*58b9f456SAndroid Build Coastguard Worker    }
305*58b9f456SAndroid Build Coastguard Worker
306*58b9f456SAndroid Build Coastguard Worker    return __to_chars_itoa(__first, __last, __x, false_type());
307*58b9f456SAndroid Build Coastguard Worker}
308*58b9f456SAndroid Build Coastguard Worker
309*58b9f456SAndroid Build Coastguard Workertemplate <typename _Tp>
310*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY to_chars_result
311*58b9f456SAndroid Build Coastguard Worker__to_chars_itoa(char* __first, char* __last, _Tp __value, false_type)
312*58b9f456SAndroid Build Coastguard Worker{
313*58b9f456SAndroid Build Coastguard Worker    using __tx = __itoa::__traits<_Tp>;
314*58b9f456SAndroid Build Coastguard Worker    auto __diff = __last - __first;
315*58b9f456SAndroid Build Coastguard Worker
316*58b9f456SAndroid Build Coastguard Worker#if !defined(_LIBCPP_COMPILER_MSVC)
317*58b9f456SAndroid Build Coastguard Worker    if (__tx::digits <= __diff || __tx::__width(__value) <= __diff)
318*58b9f456SAndroid Build Coastguard Worker        return {__tx::__convert(__value, __first), {}};
319*58b9f456SAndroid Build Coastguard Worker    else
320*58b9f456SAndroid Build Coastguard Worker        return {__last, errc::value_too_large};
321*58b9f456SAndroid Build Coastguard Worker#else
322*58b9f456SAndroid Build Coastguard Worker    if (__tx::digits <= __diff)
323*58b9f456SAndroid Build Coastguard Worker        return {__tx::__convert(__value, __first), {}};
324*58b9f456SAndroid Build Coastguard Worker    else
325*58b9f456SAndroid Build Coastguard Worker    {
326*58b9f456SAndroid Build Coastguard Worker        char __buf[__tx::digits];
327*58b9f456SAndroid Build Coastguard Worker        auto __p = __tx::__convert(__value, __buf);
328*58b9f456SAndroid Build Coastguard Worker        auto __len = __p - __buf;
329*58b9f456SAndroid Build Coastguard Worker        if (__len <= __diff)
330*58b9f456SAndroid Build Coastguard Worker        {
331*58b9f456SAndroid Build Coastguard Worker            memcpy(__first, __buf, __len);
332*58b9f456SAndroid Build Coastguard Worker            return {__first + __len, {}};
333*58b9f456SAndroid Build Coastguard Worker        }
334*58b9f456SAndroid Build Coastguard Worker        else
335*58b9f456SAndroid Build Coastguard Worker            return {__last, errc::value_too_large};
336*58b9f456SAndroid Build Coastguard Worker    }
337*58b9f456SAndroid Build Coastguard Worker#endif
338*58b9f456SAndroid Build Coastguard Worker}
339*58b9f456SAndroid Build Coastguard Worker
340*58b9f456SAndroid Build Coastguard Workertemplate <typename _Tp>
341*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY to_chars_result
342*58b9f456SAndroid Build Coastguard Worker__to_chars_integral(char* __first, char* __last, _Tp __value, int __base,
343*58b9f456SAndroid Build Coastguard Worker                    true_type)
344*58b9f456SAndroid Build Coastguard Worker{
345*58b9f456SAndroid Build Coastguard Worker    auto __x = __to_unsigned(__value);
346*58b9f456SAndroid Build Coastguard Worker    if (__value < 0 && __first != __last)
347*58b9f456SAndroid Build Coastguard Worker    {
348*58b9f456SAndroid Build Coastguard Worker        *__first++ = '-';
349*58b9f456SAndroid Build Coastguard Worker        __x = __complement(__x);
350*58b9f456SAndroid Build Coastguard Worker    }
351*58b9f456SAndroid Build Coastguard Worker
352*58b9f456SAndroid Build Coastguard Worker    return __to_chars_integral(__first, __last, __x, __base, false_type());
353*58b9f456SAndroid Build Coastguard Worker}
354*58b9f456SAndroid Build Coastguard Worker
355*58b9f456SAndroid Build Coastguard Workertemplate <typename _Tp>
356*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY to_chars_result
357*58b9f456SAndroid Build Coastguard Worker__to_chars_integral(char* __first, char* __last, _Tp __value, int __base,
358*58b9f456SAndroid Build Coastguard Worker                    false_type)
359*58b9f456SAndroid Build Coastguard Worker{
360*58b9f456SAndroid Build Coastguard Worker    if (__base == 10)
361*58b9f456SAndroid Build Coastguard Worker        return __to_chars_itoa(__first, __last, __value, false_type());
362*58b9f456SAndroid Build Coastguard Worker
363*58b9f456SAndroid Build Coastguard Worker    auto __p = __last;
364*58b9f456SAndroid Build Coastguard Worker    while (__p != __first)
365*58b9f456SAndroid Build Coastguard Worker    {
366*58b9f456SAndroid Build Coastguard Worker        auto __c = __value % __base;
367*58b9f456SAndroid Build Coastguard Worker        __value /= __base;
368*58b9f456SAndroid Build Coastguard Worker        *--__p = "0123456789abcdefghijklmnopqrstuvwxyz"[__c];
369*58b9f456SAndroid Build Coastguard Worker        if (__value == 0)
370*58b9f456SAndroid Build Coastguard Worker            break;
371*58b9f456SAndroid Build Coastguard Worker    }
372*58b9f456SAndroid Build Coastguard Worker
373*58b9f456SAndroid Build Coastguard Worker    auto __len = __last - __p;
374*58b9f456SAndroid Build Coastguard Worker    if (__value != 0 || !__len)
375*58b9f456SAndroid Build Coastguard Worker        return {__last, errc::value_too_large};
376*58b9f456SAndroid Build Coastguard Worker    else
377*58b9f456SAndroid Build Coastguard Worker    {
378*58b9f456SAndroid Build Coastguard Worker        memmove(__first, __p, __len);
379*58b9f456SAndroid Build Coastguard Worker        return {__first + __len, {}};
380*58b9f456SAndroid Build Coastguard Worker    }
381*58b9f456SAndroid Build Coastguard Worker}
382*58b9f456SAndroid Build Coastguard Worker
383*58b9f456SAndroid Build Coastguard Workertemplate <typename _Tp, enable_if_t<is_integral<_Tp>::value, int> = 0>
384*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY to_chars_result
385*58b9f456SAndroid Build Coastguard Workerto_chars(char* __first, char* __last, _Tp __value)
386*58b9f456SAndroid Build Coastguard Worker{
387*58b9f456SAndroid Build Coastguard Worker    return __to_chars_itoa(__first, __last, __value, is_signed<_Tp>());
388*58b9f456SAndroid Build Coastguard Worker}
389*58b9f456SAndroid Build Coastguard Worker
390*58b9f456SAndroid Build Coastguard Workertemplate <typename _Tp, enable_if_t<is_integral<_Tp>::value, int> = 0>
391*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY to_chars_result
392*58b9f456SAndroid Build Coastguard Workerto_chars(char* __first, char* __last, _Tp __value, int __base)
393*58b9f456SAndroid Build Coastguard Worker{
394*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_ASSERT(2 <= __base && __base <= 36, "base not in [2, 36]");
395*58b9f456SAndroid Build Coastguard Worker    return __to_chars_integral(__first, __last, __value, __base,
396*58b9f456SAndroid Build Coastguard Worker                               is_signed<_Tp>());
397*58b9f456SAndroid Build Coastguard Worker}
398*58b9f456SAndroid Build Coastguard Worker
399*58b9f456SAndroid Build Coastguard Workertemplate <typename _It, typename _Tp, typename _Fn, typename... _Ts>
400*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY from_chars_result
401*58b9f456SAndroid Build Coastguard Worker__sign_combinator(_It __first, _It __last, _Tp& __value, _Fn __f, _Ts... __args)
402*58b9f456SAndroid Build Coastguard Worker{
403*58b9f456SAndroid Build Coastguard Worker    using __tl = numeric_limits<_Tp>;
404*58b9f456SAndroid Build Coastguard Worker    decltype(__to_unsigned(__value)) __x;
405*58b9f456SAndroid Build Coastguard Worker
406*58b9f456SAndroid Build Coastguard Worker    bool __neg = (__first != __last && *__first == '-');
407*58b9f456SAndroid Build Coastguard Worker    auto __r = __f(__neg ? __first + 1 : __first, __last, __x, __args...);
408*58b9f456SAndroid Build Coastguard Worker    switch (__r.ec)
409*58b9f456SAndroid Build Coastguard Worker    {
410*58b9f456SAndroid Build Coastguard Worker    case errc::invalid_argument:
411*58b9f456SAndroid Build Coastguard Worker        return {__first, __r.ec};
412*58b9f456SAndroid Build Coastguard Worker    case errc::result_out_of_range:
413*58b9f456SAndroid Build Coastguard Worker        return __r;
414*58b9f456SAndroid Build Coastguard Worker    default:
415*58b9f456SAndroid Build Coastguard Worker        break;
416*58b9f456SAndroid Build Coastguard Worker    }
417*58b9f456SAndroid Build Coastguard Worker
418*58b9f456SAndroid Build Coastguard Worker    if (__neg)
419*58b9f456SAndroid Build Coastguard Worker    {
420*58b9f456SAndroid Build Coastguard Worker        if (__x <= __complement(__to_unsigned(__tl::min())))
421*58b9f456SAndroid Build Coastguard Worker        {
422*58b9f456SAndroid Build Coastguard Worker            __x = __complement(__x);
423*58b9f456SAndroid Build Coastguard Worker            memcpy(&__value, &__x, sizeof(__x));
424*58b9f456SAndroid Build Coastguard Worker            return __r;
425*58b9f456SAndroid Build Coastguard Worker        }
426*58b9f456SAndroid Build Coastguard Worker    }
427*58b9f456SAndroid Build Coastguard Worker    else
428*58b9f456SAndroid Build Coastguard Worker    {
429*58b9f456SAndroid Build Coastguard Worker        if (__x <= (__tl::max)())
430*58b9f456SAndroid Build Coastguard Worker        {
431*58b9f456SAndroid Build Coastguard Worker            __value = __x;
432*58b9f456SAndroid Build Coastguard Worker            return __r;
433*58b9f456SAndroid Build Coastguard Worker        }
434*58b9f456SAndroid Build Coastguard Worker    }
435*58b9f456SAndroid Build Coastguard Worker
436*58b9f456SAndroid Build Coastguard Worker    return {__r.ptr, errc::result_out_of_range};
437*58b9f456SAndroid Build Coastguard Worker}
438*58b9f456SAndroid Build Coastguard Worker
439*58b9f456SAndroid Build Coastguard Workertemplate <typename _Tp>
440*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY bool
441*58b9f456SAndroid Build Coastguard Worker__in_pattern(_Tp __c)
442*58b9f456SAndroid Build Coastguard Worker{
443*58b9f456SAndroid Build Coastguard Worker    return '0' <= __c && __c <= '9';
444*58b9f456SAndroid Build Coastguard Worker}
445*58b9f456SAndroid Build Coastguard Worker
446*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_HIDDEN __in_pattern_result
447*58b9f456SAndroid Build Coastguard Worker{
448*58b9f456SAndroid Build Coastguard Worker    bool __ok;
449*58b9f456SAndroid Build Coastguard Worker    int __val;
450*58b9f456SAndroid Build Coastguard Worker
451*58b9f456SAndroid Build Coastguard Worker    explicit _LIBCPP_INLINE_VISIBILITY operator bool() const { return __ok; }
452*58b9f456SAndroid Build Coastguard Worker};
453*58b9f456SAndroid Build Coastguard Worker
454*58b9f456SAndroid Build Coastguard Workertemplate <typename _Tp>
455*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY __in_pattern_result
456*58b9f456SAndroid Build Coastguard Worker__in_pattern(_Tp __c, int __base)
457*58b9f456SAndroid Build Coastguard Worker{
458*58b9f456SAndroid Build Coastguard Worker    if (__base <= 10)
459*58b9f456SAndroid Build Coastguard Worker        return {'0' <= __c && __c < '0' + __base, __c - '0'};
460*58b9f456SAndroid Build Coastguard Worker    else if (__in_pattern(__c))
461*58b9f456SAndroid Build Coastguard Worker        return {true, __c - '0'};
462*58b9f456SAndroid Build Coastguard Worker    else if ('a' <= __c && __c < 'a' + __base - 10)
463*58b9f456SAndroid Build Coastguard Worker        return {true, __c - 'a' + 10};
464*58b9f456SAndroid Build Coastguard Worker    else
465*58b9f456SAndroid Build Coastguard Worker        return {'A' <= __c && __c < 'A' + __base - 10, __c - 'A' + 10};
466*58b9f456SAndroid Build Coastguard Worker}
467*58b9f456SAndroid Build Coastguard Worker
468*58b9f456SAndroid Build Coastguard Workertemplate <typename _It, typename _Tp, typename _Fn, typename... _Ts>
469*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY from_chars_result
470*58b9f456SAndroid Build Coastguard Worker__subject_seq_combinator(_It __first, _It __last, _Tp& __value, _Fn __f,
471*58b9f456SAndroid Build Coastguard Worker                         _Ts... __args)
472*58b9f456SAndroid Build Coastguard Worker{
473*58b9f456SAndroid Build Coastguard Worker    auto __find_non_zero = [](_It __first, _It __last) {
474*58b9f456SAndroid Build Coastguard Worker        for (; __first != __last; ++__first)
475*58b9f456SAndroid Build Coastguard Worker            if (*__first != '0')
476*58b9f456SAndroid Build Coastguard Worker                break;
477*58b9f456SAndroid Build Coastguard Worker        return __first;
478*58b9f456SAndroid Build Coastguard Worker    };
479*58b9f456SAndroid Build Coastguard Worker
480*58b9f456SAndroid Build Coastguard Worker    auto __p = __find_non_zero(__first, __last);
481*58b9f456SAndroid Build Coastguard Worker    if (__p == __last || !__in_pattern(*__p, __args...))
482*58b9f456SAndroid Build Coastguard Worker    {
483*58b9f456SAndroid Build Coastguard Worker        if (__p == __first)
484*58b9f456SAndroid Build Coastguard Worker            return {__first, errc::invalid_argument};
485*58b9f456SAndroid Build Coastguard Worker        else
486*58b9f456SAndroid Build Coastguard Worker        {
487*58b9f456SAndroid Build Coastguard Worker            __value = 0;
488*58b9f456SAndroid Build Coastguard Worker            return {__p, {}};
489*58b9f456SAndroid Build Coastguard Worker        }
490*58b9f456SAndroid Build Coastguard Worker    }
491*58b9f456SAndroid Build Coastguard Worker
492*58b9f456SAndroid Build Coastguard Worker    auto __r = __f(__p, __last, __value, __args...);
493*58b9f456SAndroid Build Coastguard Worker    if (__r.ec == errc::result_out_of_range)
494*58b9f456SAndroid Build Coastguard Worker    {
495*58b9f456SAndroid Build Coastguard Worker        for (; __r.ptr != __last; ++__r.ptr)
496*58b9f456SAndroid Build Coastguard Worker        {
497*58b9f456SAndroid Build Coastguard Worker            if (!__in_pattern(*__r.ptr, __args...))
498*58b9f456SAndroid Build Coastguard Worker                break;
499*58b9f456SAndroid Build Coastguard Worker        }
500*58b9f456SAndroid Build Coastguard Worker    }
501*58b9f456SAndroid Build Coastguard Worker
502*58b9f456SAndroid Build Coastguard Worker    return __r;
503*58b9f456SAndroid Build Coastguard Worker}
504*58b9f456SAndroid Build Coastguard Worker
505*58b9f456SAndroid Build Coastguard Workertemplate <typename _Tp, enable_if_t<is_unsigned<_Tp>::value, int> = 0>
506*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY from_chars_result
507*58b9f456SAndroid Build Coastguard Worker__from_chars_atoi(const char* __first, const char* __last, _Tp& __value)
508*58b9f456SAndroid Build Coastguard Worker{
509*58b9f456SAndroid Build Coastguard Worker    using __tx = __itoa::__traits<_Tp>;
510*58b9f456SAndroid Build Coastguard Worker    using __output_type = typename __tx::type;
511*58b9f456SAndroid Build Coastguard Worker
512*58b9f456SAndroid Build Coastguard Worker    return __subject_seq_combinator(
513*58b9f456SAndroid Build Coastguard Worker        __first, __last, __value,
514*58b9f456SAndroid Build Coastguard Worker        [](const char* __first, const char* __last,
515*58b9f456SAndroid Build Coastguard Worker           _Tp& __value) -> from_chars_result {
516*58b9f456SAndroid Build Coastguard Worker            __output_type __a, __b;
517*58b9f456SAndroid Build Coastguard Worker            auto __p = __tx::__read(__first, __last, __a, __b);
518*58b9f456SAndroid Build Coastguard Worker            if (__p == __last || !__in_pattern(*__p))
519*58b9f456SAndroid Build Coastguard Worker            {
520*58b9f456SAndroid Build Coastguard Worker                __output_type __m = (numeric_limits<_Tp>::max)();
521*58b9f456SAndroid Build Coastguard Worker                if (__m >= __a && __m - __a >= __b)
522*58b9f456SAndroid Build Coastguard Worker                {
523*58b9f456SAndroid Build Coastguard Worker                    __value = __a + __b;
524*58b9f456SAndroid Build Coastguard Worker                    return {__p, {}};
525*58b9f456SAndroid Build Coastguard Worker                }
526*58b9f456SAndroid Build Coastguard Worker            }
527*58b9f456SAndroid Build Coastguard Worker            return {__p, errc::result_out_of_range};
528*58b9f456SAndroid Build Coastguard Worker        });
529*58b9f456SAndroid Build Coastguard Worker}
530*58b9f456SAndroid Build Coastguard Worker
531*58b9f456SAndroid Build Coastguard Workertemplate <typename _Tp, enable_if_t<is_signed<_Tp>::value, int> = 0>
532*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY from_chars_result
533*58b9f456SAndroid Build Coastguard Worker__from_chars_atoi(const char* __first, const char* __last, _Tp& __value)
534*58b9f456SAndroid Build Coastguard Worker{
535*58b9f456SAndroid Build Coastguard Worker    using __t = decltype(__to_unsigned(__value));
536*58b9f456SAndroid Build Coastguard Worker    return __sign_combinator(__first, __last, __value, __from_chars_atoi<__t>);
537*58b9f456SAndroid Build Coastguard Worker}
538*58b9f456SAndroid Build Coastguard Worker
539*58b9f456SAndroid Build Coastguard Workertemplate <typename _Tp, enable_if_t<is_unsigned<_Tp>::value, int> = 0>
540*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY from_chars_result
541*58b9f456SAndroid Build Coastguard Worker__from_chars_integral(const char* __first, const char* __last, _Tp& __value,
542*58b9f456SAndroid Build Coastguard Worker                      int __base)
543*58b9f456SAndroid Build Coastguard Worker{
544*58b9f456SAndroid Build Coastguard Worker    if (__base == 10)
545*58b9f456SAndroid Build Coastguard Worker        return __from_chars_atoi(__first, __last, __value);
546*58b9f456SAndroid Build Coastguard Worker
547*58b9f456SAndroid Build Coastguard Worker    return __subject_seq_combinator(
548*58b9f456SAndroid Build Coastguard Worker        __first, __last, __value,
549*58b9f456SAndroid Build Coastguard Worker        [](const char* __p, const char* __last, _Tp& __value,
550*58b9f456SAndroid Build Coastguard Worker           int __base) -> from_chars_result {
551*58b9f456SAndroid Build Coastguard Worker            using __tl = numeric_limits<_Tp>;
552*58b9f456SAndroid Build Coastguard Worker            auto __digits = __tl::digits / log2f(float(__base));
553*58b9f456SAndroid Build Coastguard Worker            _Tp __a = __in_pattern(*__p++, __base).__val, __b = 0;
554*58b9f456SAndroid Build Coastguard Worker
555*58b9f456SAndroid Build Coastguard Worker            for (int __i = 1; __p != __last; ++__i, ++__p)
556*58b9f456SAndroid Build Coastguard Worker            {
557*58b9f456SAndroid Build Coastguard Worker                if (auto __c = __in_pattern(*__p, __base))
558*58b9f456SAndroid Build Coastguard Worker                {
559*58b9f456SAndroid Build Coastguard Worker                    if (__i < __digits - 1)
560*58b9f456SAndroid Build Coastguard Worker                        __a = __a * __base + __c.__val;
561*58b9f456SAndroid Build Coastguard Worker                    else
562*58b9f456SAndroid Build Coastguard Worker                    {
563*58b9f456SAndroid Build Coastguard Worker                        if (!__itoa::__mul_overflowed(__a, __base, __a))
564*58b9f456SAndroid Build Coastguard Worker                            ++__p;
565*58b9f456SAndroid Build Coastguard Worker                        __b = __c.__val;
566*58b9f456SAndroid Build Coastguard Worker                        break;
567*58b9f456SAndroid Build Coastguard Worker                    }
568*58b9f456SAndroid Build Coastguard Worker                }
569*58b9f456SAndroid Build Coastguard Worker                else
570*58b9f456SAndroid Build Coastguard Worker                    break;
571*58b9f456SAndroid Build Coastguard Worker            }
572*58b9f456SAndroid Build Coastguard Worker
573*58b9f456SAndroid Build Coastguard Worker            if (__p == __last || !__in_pattern(*__p, __base))
574*58b9f456SAndroid Build Coastguard Worker            {
575*58b9f456SAndroid Build Coastguard Worker                if ((__tl::max)() - __a >= __b)
576*58b9f456SAndroid Build Coastguard Worker                {
577*58b9f456SAndroid Build Coastguard Worker                    __value = __a + __b;
578*58b9f456SAndroid Build Coastguard Worker                    return {__p, {}};
579*58b9f456SAndroid Build Coastguard Worker                }
580*58b9f456SAndroid Build Coastguard Worker            }
581*58b9f456SAndroid Build Coastguard Worker            return {__p, errc::result_out_of_range};
582*58b9f456SAndroid Build Coastguard Worker        },
583*58b9f456SAndroid Build Coastguard Worker        __base);
584*58b9f456SAndroid Build Coastguard Worker}
585*58b9f456SAndroid Build Coastguard Worker
586*58b9f456SAndroid Build Coastguard Workertemplate <typename _Tp, enable_if_t<is_signed<_Tp>::value, int> = 0>
587*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY from_chars_result
588*58b9f456SAndroid Build Coastguard Worker__from_chars_integral(const char* __first, const char* __last, _Tp& __value,
589*58b9f456SAndroid Build Coastguard Worker                      int __base)
590*58b9f456SAndroid Build Coastguard Worker{
591*58b9f456SAndroid Build Coastguard Worker    using __t = decltype(__to_unsigned(__value));
592*58b9f456SAndroid Build Coastguard Worker    return __sign_combinator(__first, __last, __value,
593*58b9f456SAndroid Build Coastguard Worker                             __from_chars_integral<__t>, __base);
594*58b9f456SAndroid Build Coastguard Worker}
595*58b9f456SAndroid Build Coastguard Worker
596*58b9f456SAndroid Build Coastguard Workertemplate <typename _Tp, enable_if_t<is_integral<_Tp>::value, int> = 0>
597*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY from_chars_result
598*58b9f456SAndroid Build Coastguard Workerfrom_chars(const char* __first, const char* __last, _Tp& __value)
599*58b9f456SAndroid Build Coastguard Worker{
600*58b9f456SAndroid Build Coastguard Worker    return __from_chars_atoi(__first, __last, __value);
601*58b9f456SAndroid Build Coastguard Worker}
602*58b9f456SAndroid Build Coastguard Worker
603*58b9f456SAndroid Build Coastguard Workertemplate <typename _Tp, enable_if_t<is_integral<_Tp>::value, int> = 0>
604*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY from_chars_result
605*58b9f456SAndroid Build Coastguard Workerfrom_chars(const char* __first, const char* __last, _Tp& __value, int __base)
606*58b9f456SAndroid Build Coastguard Worker{
607*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_ASSERT(2 <= __base && __base <= 36, "base not in [2, 36]");
608*58b9f456SAndroid Build Coastguard Worker    return __from_chars_integral(__first, __last, __value, __base);
609*58b9f456SAndroid Build Coastguard Worker}
610*58b9f456SAndroid Build Coastguard Worker
611*58b9f456SAndroid Build Coastguard Worker#endif  // _LIBCPP_STD_VER > 11
612*58b9f456SAndroid Build Coastguard Worker
613*58b9f456SAndroid Build Coastguard Worker_LIBCPP_END_NAMESPACE_STD
614*58b9f456SAndroid Build Coastguard Worker
615*58b9f456SAndroid Build Coastguard Worker_LIBCPP_POP_MACROS
616*58b9f456SAndroid Build Coastguard Worker
617*58b9f456SAndroid Build Coastguard Worker#endif  // _LIBCPP_CHARCONV
618