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