1// Primitive numeric conversions (to_chars and from_chars) -*- C++ -*-
2
3// Copyright (C) 2017-2021 Free Software Foundation, Inc.
4//
5// This file is part of the GNU ISO C++ Library.  This library is free
6// software; you can redistribute it and/or modify it under the
7// terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 3, or (at your option)
9// any later version.
10
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14// GNU General Public License for more details.
15
16// Under Section 7 of GPL version 3, you are granted additional
17// permissions described in the GCC Runtime Library Exception, version
18// 3.1, as published by the Free Software Foundation.
19
20// You should have received a copy of the GNU General Public License and
21// a copy of the GCC Runtime Library Exception along with this program;
22// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23// <http://www.gnu.org/licenses/>.
24
25/** @file include/charconv
26 *  This is a Standard C++ Library header.
27 */
28
29#ifndef _GLIBCXX_CHARCONV
30#define _GLIBCXX_CHARCONV 1
31
32#pragma GCC system_header
33
34// As an extension we support <charconv> in C++14, but this header should not
35// be included by any other library headers in C++14 mode. This ensures that
36// the names defined in this header are not added to namespace std unless a
37// user explicitly includes <charconv> in C++14 code.
38#if __cplusplus >= 201402L
39
40#include <type_traits>
41#include <bit>			// for __bit_width
42#include <cctype>		// for isdigit
43#include <bits/charconv.h>	// for __to_chars_len, __to_chars_10_impl
44#include <bits/error_constants.h> // for std::errc
45#include <ext/numeric_traits.h>
46
47#if _GLIBCXX_HAVE_USELOCALE
48# define __cpp_lib_to_chars 201611L
49#endif
50
51namespace std _GLIBCXX_VISIBILITY(default)
52{
53_GLIBCXX_BEGIN_NAMESPACE_VERSION
54
55  /// Result type of std::to_chars
56  struct to_chars_result
57  {
58    char* ptr;
59    errc ec;
60
61#if __cplusplus > 201703L && __cpp_impl_three_way_comparison >= 201907L
62    friend bool
63    operator==(const to_chars_result&, const to_chars_result&) = default;
64#endif
65  };
66
67  /// Result type of std::from_chars
68  struct from_chars_result
69  {
70    const char* ptr;
71    errc ec;
72
73#if __cplusplus > 201703L && __cpp_impl_three_way_comparison >= 201907L
74    friend bool
75    operator==(const from_chars_result&, const from_chars_result&) = default;
76#endif
77  };
78
79namespace __detail
80{
81  template<typename _Tp>
82    using __integer_to_chars_result_type
83      = enable_if_t<__or_<__is_signed_integer<_Tp>,
84			  __is_unsigned_integer<_Tp>,
85			  is_same<char, remove_cv_t<_Tp>>>::value,
86		    to_chars_result>;
87
88  // Pick an unsigned type of suitable size. This is used to reduce the
89  // number of specializations of __to_chars_len, __to_chars etc. that
90  // get instantiated. For example, to_chars<char> and to_chars<short>
91  // and to_chars<unsigned> will all use the same code, and so will
92  // to_chars<long> when sizeof(int) == sizeof(long).
93  template<typename _Tp>
94    struct __to_chars_unsigned_type : __make_unsigned_selector_base
95    {
96      using _UInts = _List<unsigned int, unsigned long, unsigned long long
97#if _GLIBCXX_USE_INT128
98	, unsigned __int128
99#endif
100	>;
101      using type = typename __select<sizeof(_Tp), _UInts>::__type;
102    };
103
104  template<typename _Tp>
105    using __unsigned_least_t = typename __to_chars_unsigned_type<_Tp>::type;
106
107  // Generic implementation for arbitrary bases.
108  // Defined in <bits/charconv.h>.
109  template<typename _Tp>
110    constexpr unsigned
111    __to_chars_len(_Tp __value, int __base /* = 10 */) noexcept;
112
113  template<typename _Tp>
114    constexpr unsigned
115    __to_chars_len_2(_Tp __value) noexcept
116    { return std::__bit_width(__value); }
117
118  // Generic implementation for arbitrary bases.
119  template<typename _Tp>
120    to_chars_result
121    __to_chars(char* __first, char* __last, _Tp __val, int __base) noexcept
122    {
123      static_assert(is_integral<_Tp>::value, "implementation bug");
124      static_assert(is_unsigned<_Tp>::value, "implementation bug");
125
126      to_chars_result __res;
127
128      const unsigned __len = __to_chars_len(__val, __base);
129
130      if (__builtin_expect((__last - __first) < __len, 0))
131	{
132	  __res.ptr = __last;
133	  __res.ec = errc::value_too_large;
134	  return __res;
135	}
136
137      unsigned __pos = __len - 1;
138
139      static constexpr char __digits[] = {
140	'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
141	'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
142	'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
143	'u', 'v', 'w', 'x', 'y', 'z'
144      };
145
146      while (__val >= (unsigned)__base)
147	{
148	  auto const __quo = __val / __base;
149	  auto const __rem = __val % __base;
150	  __first[__pos--] = __digits[__rem];
151	  __val = __quo;
152	}
153      *__first = __digits[__val];
154
155      __res.ptr = __first + __len;
156      __res.ec = {};
157      return __res;
158    }
159
160  template<typename _Tp>
161    __integer_to_chars_result_type<_Tp>
162    __to_chars_16(char* __first, char* __last, _Tp __val) noexcept
163    {
164      static_assert(is_integral<_Tp>::value, "implementation bug");
165      static_assert(is_unsigned<_Tp>::value, "implementation bug");
166
167      to_chars_result __res;
168
169      const unsigned __len = (__to_chars_len_2(__val) + 3) / 4;
170
171      if (__builtin_expect((__last - __first) < __len, 0))
172	{
173	  __res.ptr = __last;
174	  __res.ec = errc::value_too_large;
175	  return __res;
176	}
177
178      static constexpr char __digits[] = {
179	'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
180	'a', 'b', 'c', 'd', 'e', 'f'
181      };
182      unsigned __pos = __len - 1;
183      while (__val >= 0x100)
184	{
185	  auto __num = __val & 0xF;
186	  __val >>= 4;
187	  __first[__pos] = __digits[__num];
188	  __num = __val & 0xF;
189	  __val >>= 4;
190	  __first[__pos - 1] = __digits[__num];
191	  __pos -= 2;
192	}
193      if (__val >= 0x10)
194	{
195	  const auto __num = __val & 0xF;
196	  __val >>= 4;
197	  __first[1] = __digits[__num];
198	  __first[0] = __digits[__val];
199	}
200      else
201	__first[0] = __digits[__val];
202      __res.ptr = __first + __len;
203      __res.ec = {};
204      return __res;
205    }
206
207  template<typename _Tp>
208    inline __integer_to_chars_result_type<_Tp>
209    __to_chars_10(char* __first, char* __last, _Tp __val) noexcept
210    {
211      static_assert(is_integral<_Tp>::value, "implementation bug");
212      static_assert(is_unsigned<_Tp>::value, "implementation bug");
213
214      to_chars_result __res;
215
216      const unsigned __len = __to_chars_len(__val, 10);
217
218      if (__builtin_expect((__last - __first) < __len, 0))
219	{
220	  __res.ptr = __last;
221	  __res.ec = errc::value_too_large;
222	  return __res;
223	}
224
225      __detail::__to_chars_10_impl(__first, __len, __val);
226      __res.ptr = __first + __len;
227      __res.ec = {};
228      return __res;
229    }
230
231  template<typename _Tp>
232    __integer_to_chars_result_type<_Tp>
233    __to_chars_8(char* __first, char* __last, _Tp __val) noexcept
234    {
235      static_assert(is_integral<_Tp>::value, "implementation bug");
236      static_assert(is_unsigned<_Tp>::value, "implementation bug");
237
238      to_chars_result __res;
239      unsigned __len;
240
241      if _GLIBCXX17_CONSTEXPR (__gnu_cxx::__int_traits<_Tp>::__digits <= 16)
242	{
243	  __len = __val > 077777u ? 6u
244	    : __val > 07777u ? 5u
245	    : __val > 0777u ? 4u
246	    : __val > 077u ? 3u
247	    : __val > 07u ? 2u
248	    : 1u;
249	}
250      else
251	__len = (__to_chars_len_2(__val) + 2) / 3;
252
253      if (__builtin_expect((__last - __first) < __len, 0))
254	{
255	  __res.ptr = __last;
256	  __res.ec = errc::value_too_large;
257	  return __res;
258	}
259
260      unsigned __pos = __len - 1;
261      while (__val >= 0100)
262	{
263	  auto __num = __val & 7;
264	  __val >>= 3;
265	  __first[__pos] = '0' + __num;
266	  __num = __val & 7;
267	  __val >>= 3;
268	  __first[__pos - 1] = '0' + __num;
269	  __pos -= 2;
270	}
271      if (__val >= 010)
272	{
273	  auto const __num = __val & 7;
274	  __val >>= 3;
275	  __first[1] = '0' + __num;
276	  __first[0] = '0' + __val;
277	}
278      else
279	__first[0] = '0' + __val;
280      __res.ptr = __first + __len;
281      __res.ec = {};
282      return __res;
283    }
284
285  template<typename _Tp>
286    __integer_to_chars_result_type<_Tp>
287    __to_chars_2(char* __first, char* __last, _Tp __val) noexcept
288    {
289      static_assert(is_integral<_Tp>::value, "implementation bug");
290      static_assert(is_unsigned<_Tp>::value, "implementation bug");
291
292      to_chars_result __res;
293
294      const unsigned __len = __to_chars_len_2(__val);
295
296      if (__builtin_expect((__last - __first) < __len, 0))
297	{
298	  __res.ptr = __last;
299	  __res.ec = errc::value_too_large;
300	  return __res;
301	}
302
303      unsigned __pos = __len - 1;
304
305      while (__pos)
306	{
307	  __first[__pos--] = '0' + (__val & 1);
308	  __val >>= 1;
309	}
310      // First digit is always '1' because __to_chars_len_2 skips
311      // leading zero bits and std::to_chars handles zero values
312      // directly.
313      __first[0] = '1';
314
315      __res.ptr = __first + __len;
316      __res.ec = {};
317      return __res;
318    }
319
320} // namespace __detail
321
322  template<typename _Tp>
323    __detail::__integer_to_chars_result_type<_Tp>
324    __to_chars_i(char* __first, char* __last, _Tp __value, int __base = 10)
325    {
326      __glibcxx_assert(2 <= __base && __base <= 36);
327
328      using _Up = __detail::__unsigned_least_t<_Tp>;
329      _Up __unsigned_val = __value;
330
331      if (__first == __last) [[__unlikely__]]
332	return { __last, errc::value_too_large };
333
334      if (__value == 0)
335	{
336	  *__first = '0';
337	  return { __first + 1, errc{} };
338	}
339
340      if _GLIBCXX17_CONSTEXPR (std::is_signed<_Tp>::value)
341	if (__value < 0)
342	  {
343	    if (__builtin_expect(__first != __last, 1))
344	      *__first++ = '-';
345	    __unsigned_val = _Up(~__value) + _Up(1);
346	  }
347
348      switch (__base)
349      {
350      case 16:
351	return __detail::__to_chars_16(__first, __last, __unsigned_val);
352      case 10:
353	return __detail::__to_chars_10(__first, __last, __unsigned_val);
354      case 8:
355	return __detail::__to_chars_8(__first, __last, __unsigned_val);
356      case 2:
357	return __detail::__to_chars_2(__first, __last, __unsigned_val);
358      default:
359	return __detail::__to_chars(__first, __last, __unsigned_val, __base);
360      }
361    }
362
363#define _GLIBCXX_TO_CHARS(T) \
364  inline to_chars_result \
365  to_chars(char* __first, char* __last, T __value, int __base = 10) \
366  { return std::__to_chars_i<T>(__first, __last, __value, __base); }
367_GLIBCXX_TO_CHARS(char)
368_GLIBCXX_TO_CHARS(signed char)
369_GLIBCXX_TO_CHARS(unsigned char)
370_GLIBCXX_TO_CHARS(signed short)
371_GLIBCXX_TO_CHARS(unsigned short)
372_GLIBCXX_TO_CHARS(signed int)
373_GLIBCXX_TO_CHARS(unsigned int)
374_GLIBCXX_TO_CHARS(signed long)
375_GLIBCXX_TO_CHARS(unsigned long)
376_GLIBCXX_TO_CHARS(signed long long)
377_GLIBCXX_TO_CHARS(unsigned long long)
378#if defined(__GLIBCXX_TYPE_INT_N_0)
379_GLIBCXX_TO_CHARS(signed __GLIBCXX_TYPE_INT_N_0)
380_GLIBCXX_TO_CHARS(unsigned __GLIBCXX_TYPE_INT_N_0)
381#endif
382#if defined(__GLIBCXX_TYPE_INT_N_1)
383_GLIBCXX_TO_CHARS(signed __GLIBCXX_TYPE_INT_N_1)
384_GLIBCXX_TO_CHARS(unsigned __GLIBCXX_TYPE_INT_N_1)
385#endif
386#if defined(__GLIBCXX_TYPE_INT_N_2)
387_GLIBCXX_TO_CHARS(signed __GLIBCXX_TYPE_INT_N_2)
388_GLIBCXX_TO_CHARS(unsigned __GLIBCXX_TYPE_INT_N_2)
389#endif
390#if defined(__GLIBCXX_TYPE_INT_N_3)
391_GLIBCXX_TO_CHARS(signed __GLIBCXX_TYPE_INT_N_3)
392_GLIBCXX_TO_CHARS(unsigned __GLIBCXX_TYPE_INT_N_3)
393#endif
394#undef _GLIBCXX_TO_CHARS
395
396  // _GLIBCXX_RESOLVE_LIB_DEFECTS
397  // 3266. to_chars(bool) should be deleted
398  to_chars_result to_chars(char*, char*, bool, int = 10) = delete;
399
400namespace __detail
401{
402  template<typename _Tp>
403    bool
404    __raise_and_add(_Tp& __val, int __base, unsigned char __c)
405    {
406      if (__builtin_mul_overflow(__val, __base, &__val)
407	  || __builtin_add_overflow(__val, __c, &__val))
408	return false;
409      return true;
410    }
411
412  /// std::from_chars implementation for integers in base 2.
413  template<typename _Tp>
414    bool
415    __from_chars_binary(const char*& __first, const char* __last, _Tp& __val)
416    {
417      static_assert(is_integral<_Tp>::value, "implementation bug");
418      static_assert(is_unsigned<_Tp>::value, "implementation bug");
419
420      const ptrdiff_t __len = __last - __first;
421      ptrdiff_t __i = 0;
422      while (__i < __len && __first[__i] == '0')
423	++__i;
424      const ptrdiff_t __leading_zeroes = __i;
425
426      while (__i < __len)
427	{
428	  const unsigned char __c = (unsigned)__first[__i] - '0';
429	  if (__c < 2)
430	    __val = (__val << 1) | __c;
431	  else
432	    break;
433	  __i++;
434	}
435      __first += __i;
436      return (__i - __leading_zeroes) <= __gnu_cxx::__int_traits<_Tp>::__digits;
437    }
438
439  /// std::from_chars implementation for integers in bases 3 to 10.
440  template<typename _Tp>
441    bool
442    __from_chars_digit(const char*& __first, const char* __last, _Tp& __val,
443		       int __base)
444    {
445      static_assert(is_integral<_Tp>::value, "implementation bug");
446      static_assert(is_unsigned<_Tp>::value, "implementation bug");
447
448      auto __matches = [__base](char __c) {
449	  return '0' <= __c && __c <= ('0' + (__base - 1));
450      };
451
452      while (__first != __last)
453	{
454	  const char __c = *__first;
455	  if (__matches(__c))
456	  {
457	    if (!__raise_and_add(__val, __base, __c - '0'))
458	      {
459		while (++__first != __last && __matches(*__first))
460		  ;
461		return false;
462	      }
463	    __first++;
464	  }
465	  else
466	    return true;
467	}
468      return true;
469    }
470
471  constexpr unsigned char
472  __from_chars_alpha_to_num(char __c)
473  {
474    switch (__c)
475    {
476    case 'a':
477    case 'A':
478      return 10;
479    case 'b':
480    case 'B':
481      return 11;
482    case 'c':
483    case 'C':
484      return 12;
485    case 'd':
486    case 'D':
487      return 13;
488    case 'e':
489    case 'E':
490      return 14;
491    case 'f':
492    case 'F':
493      return 15;
494    case 'g':
495    case 'G':
496      return 16;
497    case 'h':
498    case 'H':
499      return 17;
500    case 'i':
501    case 'I':
502      return 18;
503    case 'j':
504    case 'J':
505      return 19;
506    case 'k':
507    case 'K':
508      return 20;
509    case 'l':
510    case 'L':
511      return 21;
512    case 'm':
513    case 'M':
514      return 22;
515    case 'n':
516    case 'N':
517      return 23;
518    case 'o':
519    case 'O':
520      return 24;
521    case 'p':
522    case 'P':
523      return 25;
524    case 'q':
525    case 'Q':
526      return 26;
527    case 'r':
528    case 'R':
529      return 27;
530    case 's':
531    case 'S':
532      return 28;
533    case 't':
534    case 'T':
535      return 29;
536    case 'u':
537    case 'U':
538      return 30;
539    case 'v':
540    case 'V':
541      return 31;
542    case 'w':
543    case 'W':
544      return 32;
545    case 'x':
546    case 'X':
547      return 33;
548    case 'y':
549    case 'Y':
550      return 34;
551    case 'z':
552    case 'Z':
553      return 35;
554    }
555    return __gnu_cxx::__int_traits<unsigned char>::__max;
556  }
557
558  /// std::from_chars implementation for integers in bases 11 to 26.
559  template<typename _Tp>
560    bool
561    __from_chars_alnum(const char*& __first, const char* __last, _Tp& __val,
562		       int __base)
563    {
564      bool __valid = true;
565      while (__first != __last)
566	{
567	  unsigned char __c = *__first;
568	  if (std::isdigit(__c))
569	    __c -= '0';
570	  else
571	    {
572	      __c = __from_chars_alpha_to_num(__c);
573	      if (__c >= __base)
574		break;
575	    }
576
577	  if (__builtin_expect(__valid, 1))
578	    __valid = __raise_and_add(__val, __base, __c);
579	  __first++;
580	}
581      return __valid;
582    }
583
584  template<typename _Tp>
585    using __integer_from_chars_result_type
586      = enable_if_t<__or_<__is_signed_integer<_Tp>,
587			  __is_unsigned_integer<_Tp>,
588			  is_same<char, remove_cv_t<_Tp>>>::value,
589		    from_chars_result>;
590
591} // namespace __detail
592
593  /// std::from_chars for integral types.
594  template<typename _Tp>
595    __detail::__integer_from_chars_result_type<_Tp>
596    from_chars(const char* __first, const char* __last, _Tp& __value,
597	       int __base = 10)
598    {
599      __glibcxx_assert(2 <= __base && __base <= 36);
600
601      from_chars_result __res{__first, {}};
602
603      int __sign = 1;
604      if _GLIBCXX17_CONSTEXPR (std::is_signed<_Tp>::value)
605	if (__first != __last && *__first == '-')
606	  {
607	    __sign = -1;
608	    ++__first;
609	  }
610
611      using _Up = __detail::__unsigned_least_t<_Tp>;
612      _Up __val = 0;
613
614      const auto __start = __first;
615      bool __valid;
616      if (__base == 2)
617	__valid = __detail::__from_chars_binary(__first, __last, __val);
618      else if (__base <= 10)
619	__valid = __detail::__from_chars_digit(__first, __last, __val, __base);
620      else
621	__valid = __detail::__from_chars_alnum(__first, __last, __val, __base);
622
623      if (__builtin_expect(__first == __start, 0))
624	__res.ec = errc::invalid_argument;
625      else
626	{
627	  __res.ptr = __first;
628	  if (!__valid)
629	    __res.ec = errc::result_out_of_range;
630	  else
631	    {
632	      if _GLIBCXX17_CONSTEXPR (std::is_signed<_Tp>::value)
633		{
634		  _Tp __tmp;
635		  if (__builtin_mul_overflow(__val, __sign, &__tmp))
636		    __res.ec = errc::result_out_of_range;
637		  else
638		    __value = __tmp;
639		}
640	      else
641		{
642		  if _GLIBCXX17_CONSTEXPR (__gnu_cxx::__int_traits<_Up>::__max
643		      > __gnu_cxx::__int_traits<_Tp>::__max)
644		    {
645		      if (__val > __gnu_cxx::__int_traits<_Tp>::__max)
646			__res.ec = errc::result_out_of_range;
647		      else
648			__value = __val;
649		    }
650		  else
651		    __value = __val;
652		}
653	    }
654	}
655      return __res;
656    }
657
658  /// floating-point format for primitive numerical conversion
659  enum class chars_format
660  {
661    scientific = 1, fixed = 2, hex = 4, general = fixed | scientific
662  };
663
664  constexpr chars_format
665  operator|(chars_format __lhs, chars_format __rhs) noexcept
666  { return (chars_format)((unsigned)__lhs | (unsigned)__rhs); }
667
668  constexpr chars_format
669  operator&(chars_format __lhs, chars_format __rhs) noexcept
670  { return (chars_format)((unsigned)__lhs & (unsigned)__rhs); }
671
672  constexpr chars_format
673  operator^(chars_format __lhs, chars_format __rhs) noexcept
674  { return (chars_format)((unsigned)__lhs ^ (unsigned)__rhs); }
675
676  constexpr chars_format
677  operator~(chars_format __fmt) noexcept
678  { return (chars_format)~(unsigned)__fmt; }
679
680  constexpr chars_format&
681  operator|=(chars_format& __lhs, chars_format __rhs) noexcept
682  { return __lhs = __lhs | __rhs; }
683
684  constexpr chars_format&
685  operator&=(chars_format& __lhs, chars_format __rhs) noexcept
686  { return __lhs = __lhs & __rhs; }
687
688  constexpr chars_format&
689  operator^=(chars_format& __lhs, chars_format __rhs) noexcept
690  { return __lhs = __lhs ^ __rhs; }
691
692#if _GLIBCXX_HAVE_USELOCALE
693  from_chars_result
694  from_chars(const char* __first, const char* __last, float& __value,
695	     chars_format __fmt = chars_format::general) noexcept;
696
697  from_chars_result
698  from_chars(const char* __first, const char* __last, double& __value,
699	     chars_format __fmt = chars_format::general) noexcept;
700
701  from_chars_result
702  from_chars(const char* __first, const char* __last, long double& __value,
703	     chars_format __fmt = chars_format::general) noexcept;
704#endif
705
706#if _GLIBCXX_FLOAT_IS_IEEE_BINARY32 && _GLIBCXX_DOUBLE_IS_IEEE_BINARY64 \
707    && __SIZE_WIDTH__ >= 32
708  // Floating-point std::to_chars
709
710  // Overloads for float.
711  to_chars_result to_chars(char* __first, char* __last, float __value) noexcept;
712  to_chars_result to_chars(char* __first, char* __last, float __value,
713			   chars_format __fmt) noexcept;
714  to_chars_result to_chars(char* __first, char* __last, float __value,
715			   chars_format __fmt, int __precision) noexcept;
716
717  // Overloads for double.
718  to_chars_result to_chars(char* __first, char* __last, double __value) noexcept;
719  to_chars_result to_chars(char* __first, char* __last, double __value,
720			   chars_format __fmt) noexcept;
721  to_chars_result to_chars(char* __first, char* __last, double __value,
722			   chars_format __fmt, int __precision) noexcept;
723
724  // Overloads for long double.
725  to_chars_result to_chars(char* __first, char* __last, long double __value)
726    noexcept;
727  to_chars_result to_chars(char* __first, char* __last, long double __value,
728			   chars_format __fmt) noexcept;
729  to_chars_result to_chars(char* __first, char* __last, long double __value,
730			   chars_format __fmt, int __precision) noexcept;
731#endif
732
733_GLIBCXX_END_NAMESPACE_VERSION
734} // namespace std
735#endif // C++14
736#endif // _GLIBCXX_CHARCONV
737