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