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