1// Primitive numeric conversions (to_chars and from_chars) -*- C++ -*-
3// Copyright (C) 2017-2021 Free Software Foundation, Inc.
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)
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.
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.
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/>.
25/** @file include/charconv
26 * This is a Standard C++ Library header.
29#ifndef _GLIBCXX_CHARCONV
30#define _GLIBCXX_CHARCONV 1
32#pragma GCC system_header
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
41#include <bit> // for __bit_width
42#include <bits/charconv.h> // for __to_chars_len, __to_chars_10_impl
43#include <bits/error_constants.h> // for std::errc
44#include <ext/numeric_traits.h>
46#if _GLIBCXX_HAVE_USELOCALE
47# define __cpp_lib_to_chars 201611L
50namespace std _GLIBCXX_VISIBILITY(default)
52_GLIBCXX_BEGIN_NAMESPACE_VERSION
54 /// Result type of std::to_chars
55 struct to_chars_result
60#if __cplusplus > 201703L && __cpp_impl_three_way_comparison >= 201907L
62 operator==(const to_chars_result&, const to_chars_result&) = default;
66 /// Result type of std::from_chars
67 struct from_chars_result
72#if __cplusplus > 201703L && __cpp_impl_three_way_comparison >= 201907L
74 operator==(const from_chars_result&, const from_chars_result&) = default;
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,
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
95 using _UInts = _List<unsigned int, unsigned long, unsigned long long
96#if _GLIBCXX_USE_INT128
100 using type = typename __select<sizeof(_Tp), _UInts>::__type;
103 template<typename _Tp>
104 using __unsigned_least_t = typename __to_chars_unsigned_type<_Tp>::type;
106 // Generic implementation for arbitrary bases.
107 // Defined in <bits/charconv.h>.
108 template<typename _Tp>
110 __to_chars_len(_Tp __value, int __base /* = 10 */) noexcept;
112 template<typename _Tp>
114 __to_chars_len_2(_Tp __value) noexcept
115 { return std::__bit_width(__value); }
117 // Generic implementation for arbitrary bases.
118 template<typename _Tp>
120 __to_chars(char* __first, char* __last, _Tp __val, int __base) noexcept
122 static_assert(is_integral<_Tp>::value, "implementation bug");
123 static_assert(is_unsigned<_Tp>::value, "implementation bug");
125 to_chars_result __res;
127 const unsigned __len = __to_chars_len(__val, __base);
129 if (__builtin_expect((__last - __first) < __len, 0))
132 __res.ec = errc::value_too_large;
136 unsigned __pos = __len - 1;
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'
145 while (__val >= (unsigned)__base)
147 auto const __quo = __val / __base;
148 auto const __rem = __val % __base;
149 __first[__pos--] = __digits[__rem];
152 *__first = __digits[__val];
154 __res.ptr = __first + __len;
159 template<typename _Tp>
160 __integer_to_chars_result_type<_Tp>
161 __to_chars_16(char* __first, char* __last, _Tp __val) noexcept
163 static_assert(is_integral<_Tp>::value, "implementation bug");
164 static_assert(is_unsigned<_Tp>::value, "implementation bug");
166 to_chars_result __res;
168 const unsigned __len = (__to_chars_len_2(__val) + 3) / 4;
170 if (__builtin_expect((__last - __first) < __len, 0))
173 __res.ec = errc::value_too_large;
177 static constexpr char __digits[] = {
178 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
179 'a', 'b', 'c', 'd', 'e', 'f'
181 unsigned __pos = __len - 1;
182 while (__val >= 0x100)
184 auto __num = __val & 0xF;
186 __first[__pos] = __digits[__num];
189 __first[__pos - 1] = __digits[__num];
194 const auto __num = __val & 0xF;
196 __first[1] = __digits[__num];
197 __first[0] = __digits[__val];
200 __first[0] = __digits[__val];
201 __res.ptr = __first + __len;
206 template<typename _Tp>
207 inline __integer_to_chars_result_type<_Tp>
208 __to_chars_10(char* __first, char* __last, _Tp __val) noexcept
210 static_assert(is_integral<_Tp>::value, "implementation bug");
211 static_assert(is_unsigned<_Tp>::value, "implementation bug");
213 to_chars_result __res;
215 const unsigned __len = __to_chars_len(__val, 10);
217 if (__builtin_expect((__last - __first) < __len, 0))
220 __res.ec = errc::value_too_large;
224 __detail::__to_chars_10_impl(__first, __len, __val);
225 __res.ptr = __first + __len;
230 template<typename _Tp>
231 __integer_to_chars_result_type<_Tp>
232 __to_chars_8(char* __first, char* __last, _Tp __val) noexcept
234 static_assert(is_integral<_Tp>::value, "implementation bug");
235 static_assert(is_unsigned<_Tp>::value, "implementation bug");
237 to_chars_result __res;
240 if _GLIBCXX17_CONSTEXPR (__gnu_cxx::__int_traits<_Tp>::__digits <= 16)
242 __len = __val > 077777u ? 6u
243 : __val > 07777u ? 5u
250 __len = (__to_chars_len_2(__val) + 2) / 3;
252 if (__builtin_expect((__last - __first) < __len, 0))
255 __res.ec = errc::value_too_large;
259 unsigned __pos = __len - 1;
260 while (__val >= 0100)
262 auto __num = __val & 7;
264 __first[__pos] = '0' + __num;
267 __first[__pos - 1] = '0' + __num;
272 auto const __num = __val & 7;
274 __first[1] = '0' + __num;
275 __first[0] = '0' + __val;
278 __first[0] = '0' + __val;
279 __res.ptr = __first + __len;
284 template<typename _Tp>
285 __integer_to_chars_result_type<_Tp>
286 __to_chars_2(char* __first, char* __last, _Tp __val) noexcept
288 static_assert(is_integral<_Tp>::value, "implementation bug");
289 static_assert(is_unsigned<_Tp>::value, "implementation bug");
291 to_chars_result __res;
293 const unsigned __len = __to_chars_len_2(__val);
295 if (__builtin_expect((__last - __first) < __len, 0))
298 __res.ec = errc::value_too_large;
302 unsigned __pos = __len - 1;
306 __first[__pos--] = '0' + (__val & 1);
309 // First digit is always '1' because __to_chars_len_2 skips
310 // leading zero bits and std::to_chars handles zero values
314 __res.ptr = __first + __len;
319} // namespace __detail
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)
325 __glibcxx_assert(2 <= __base && __base <= 36);
327 using _Up = __detail::__unsigned_least_t<_Tp>;
328 _Up __unsigned_val = __value;
330 if (__first == __last) [[__unlikely__]]
331 return { __last, errc::value_too_large };
336 return { __first + 1, errc{} };
338 else if _GLIBCXX17_CONSTEXPR (std::is_signed<_Tp>::value)
342 __unsigned_val = _Up(~__value) + _Up(1);
348 return __detail::__to_chars_16(__first, __last, __unsigned_val);
350 return __detail::__to_chars_10(__first, __last, __unsigned_val);
352 return __detail::__to_chars_8(__first, __last, __unsigned_val);
354 return __detail::__to_chars_2(__first, __last, __unsigned_val);
356 return __detail::__to_chars(__first, __last, __unsigned_val, __base);
360#define _GLIBCXX_TO_CHARS(T) \
361 inline to_chars_result \
362 to_chars(char* __first, char* __last, T __value, int __base = 10) \
363 { return std::__to_chars_i<T>(__first, __last, __value, __base); }
364_GLIBCXX_TO_CHARS(char)
365_GLIBCXX_TO_CHARS(signed char)
366_GLIBCXX_TO_CHARS(unsigned char)
367_GLIBCXX_TO_CHARS(signed short)
368_GLIBCXX_TO_CHARS(unsigned short)
369_GLIBCXX_TO_CHARS(signed int)
370_GLIBCXX_TO_CHARS(unsigned int)
371_GLIBCXX_TO_CHARS(signed long)
372_GLIBCXX_TO_CHARS(unsigned long)
373_GLIBCXX_TO_CHARS(signed long long)
374_GLIBCXX_TO_CHARS(unsigned long long)
375#if defined(__GLIBCXX_TYPE_INT_N_0)
376_GLIBCXX_TO_CHARS(signed __GLIBCXX_TYPE_INT_N_0)
377_GLIBCXX_TO_CHARS(unsigned __GLIBCXX_TYPE_INT_N_0)
379#if defined(__GLIBCXX_TYPE_INT_N_1)
380_GLIBCXX_TO_CHARS(signed __GLIBCXX_TYPE_INT_N_1)
381_GLIBCXX_TO_CHARS(unsigned __GLIBCXX_TYPE_INT_N_1)
383#if defined(__GLIBCXX_TYPE_INT_N_2)
384_GLIBCXX_TO_CHARS(signed __GLIBCXX_TYPE_INT_N_2)
385_GLIBCXX_TO_CHARS(unsigned __GLIBCXX_TYPE_INT_N_2)
387#if defined(__GLIBCXX_TYPE_INT_N_3)
388_GLIBCXX_TO_CHARS(signed __GLIBCXX_TYPE_INT_N_3)
389_GLIBCXX_TO_CHARS(unsigned __GLIBCXX_TYPE_INT_N_3)
391#undef _GLIBCXX_TO_CHARS
393 // _GLIBCXX_RESOLVE_LIB_DEFECTS
394 // 3266. to_chars(bool) should be deleted
395 to_chars_result to_chars(char*, char*, bool, int = 10) = delete;
399 template<typename _Tp>
401 __raise_and_add(_Tp& __val, int __base, unsigned char __c)
403 if (__builtin_mul_overflow(__val, __base, &__val)
404 || __builtin_add_overflow(__val, __c, &__val))
409 /// std::from_chars implementation for integers in base 2.
410 template<typename _Tp>
412 __from_chars_binary(const char*& __first, const char* __last, _Tp& __val)
414 static_assert(is_integral<_Tp>::value, "implementation bug");
415 static_assert(is_unsigned<_Tp>::value, "implementation bug");
417 const ptrdiff_t __len = __last - __first;
419 while (__i < __len && __first[__i] == '0')
421 const ptrdiff_t __leading_zeroes = __i;
425 const unsigned char __c = (unsigned)__first[__i] - '0';
427 __val = (__val << 1) | __c;
433 return (__i - __leading_zeroes) <= __gnu_cxx::__int_traits<_Tp>::__digits;
436 /// std::from_chars implementation for integers in bases 3 to 10.
437 template<typename _Tp>
439 __from_chars_digit(const char*& __first, const char* __last, _Tp& __val,
442 static_assert(is_integral<_Tp>::value, "implementation bug");
443 static_assert(is_unsigned<_Tp>::value, "implementation bug");
445 auto __matches = [__base](char __c) {
446 return '0' <= __c && __c <= ('0' + (__base - 1));
449 while (__first != __last)
451 const char __c = *__first;
454 if (!__raise_and_add(__val, __base, __c - '0'))
456 while (++__first != __last && __matches(*__first))
469 __from_chars_alpha_to_num(char __c)
555 /// std::from_chars implementation for integers in bases 11 to 36.
556 template<typename _Tp>
558 __from_chars_alnum(const char*& __first, const char* __last, _Tp& __val,
562 while (__first != __last)
565 if ('0' <= __c && __c <= '9') // isdigit
569 __c = __from_chars_alpha_to_num(__c);
574 if (__builtin_expect(__valid, 1))
575 __valid = __raise_and_add(__val, __base, __c);
581 template<typename _Tp>
582 using __integer_from_chars_result_type
583 = enable_if_t<__or_<__is_signed_integer<_Tp>,
584 __is_unsigned_integer<_Tp>,
585 is_same<char, remove_cv_t<_Tp>>>::value,
588} // namespace __detail
590 /// std::from_chars for integral types.
591 template<typename _Tp>
592 __detail::__integer_from_chars_result_type<_Tp>
593 from_chars(const char* __first, const char* __last, _Tp& __value,
596 __glibcxx_assert(2 <= __base && __base <= 36);
598 from_chars_result __res{__first, {}};
601 if _GLIBCXX17_CONSTEXPR (std::is_signed<_Tp>::value)
602 if (__first != __last && *__first == '-')
608 using _Up = __detail::__unsigned_least_t<_Tp>;
611 const auto __start = __first;
614 __valid = __detail::__from_chars_binary(__first, __last, __val);
615 else if (__base <= 10)
616 __valid = __detail::__from_chars_digit(__first, __last, __val, __base);
618 __valid = __detail::__from_chars_alnum(__first, __last, __val, __base);
620 if (__builtin_expect(__first == __start, 0))
621 __res.ec = errc::invalid_argument;
626 __res.ec = errc::result_out_of_range;
629 if _GLIBCXX17_CONSTEXPR (std::is_signed<_Tp>::value)
632 if (__builtin_mul_overflow(__val, __sign, &__tmp))
633 __res.ec = errc::result_out_of_range;
639 if _GLIBCXX17_CONSTEXPR (__gnu_cxx::__int_traits<_Up>::__max
640 > __gnu_cxx::__int_traits<_Tp>::__max)
642 if (__val > __gnu_cxx::__int_traits<_Tp>::__max)
643 __res.ec = errc::result_out_of_range;
655 /// floating-point format for primitive numerical conversion
656 enum class chars_format
658 scientific = 1, fixed = 2, hex = 4, general = fixed | scientific
661 constexpr chars_format
662 operator|(chars_format __lhs, chars_format __rhs) noexcept
663 { return (chars_format)((unsigned)__lhs | (unsigned)__rhs); }
665 constexpr chars_format
666 operator&(chars_format __lhs, chars_format __rhs) noexcept
667 { return (chars_format)((unsigned)__lhs & (unsigned)__rhs); }
669 constexpr chars_format
670 operator^(chars_format __lhs, chars_format __rhs) noexcept
671 { return (chars_format)((unsigned)__lhs ^ (unsigned)__rhs); }
673 constexpr chars_format
674 operator~(chars_format __fmt) noexcept
675 { return (chars_format)~(unsigned)__fmt; }
677 constexpr chars_format&
678 operator|=(chars_format& __lhs, chars_format __rhs) noexcept
679 { return __lhs = __lhs | __rhs; }
681 constexpr chars_format&
682 operator&=(chars_format& __lhs, chars_format __rhs) noexcept
683 { return __lhs = __lhs & __rhs; }
685 constexpr chars_format&
686 operator^=(chars_format& __lhs, chars_format __rhs) noexcept
687 { return __lhs = __lhs ^ __rhs; }
689#if _GLIBCXX_HAVE_USELOCALE
691 from_chars(const char* __first, const char* __last, float& __value,
692 chars_format __fmt = chars_format::general) noexcept;
695 from_chars(const char* __first, const char* __last, double& __value,
696 chars_format __fmt = chars_format::general) noexcept;
699 from_chars(const char* __first, const char* __last, long double& __value,
700 chars_format __fmt = chars_format::general) noexcept;
703#if _GLIBCXX_FLOAT_IS_IEEE_BINARY32 && _GLIBCXX_DOUBLE_IS_IEEE_BINARY64 \
704 && __SIZE_WIDTH__ >= 32
705 // Floating-point std::to_chars
707 // Overloads for float.
708 to_chars_result to_chars(char* __first, char* __last, float __value) noexcept;
709 to_chars_result to_chars(char* __first, char* __last, float __value,
710 chars_format __fmt) noexcept;
711 to_chars_result to_chars(char* __first, char* __last, float __value,
712 chars_format __fmt, int __precision) noexcept;
714 // Overloads for double.
715 to_chars_result to_chars(char* __first, char* __last, double __value) noexcept;
716 to_chars_result to_chars(char* __first, char* __last, double __value,
717 chars_format __fmt) noexcept;
718 to_chars_result to_chars(char* __first, char* __last, double __value,
719 chars_format __fmt, int __precision) noexcept;
721 // Overloads for long double.
722 to_chars_result to_chars(char* __first, char* __last, long double __value)
724 to_chars_result to_chars(char* __first, char* __last, long double __value,
725 chars_format __fmt) noexcept;
726 to_chars_result to_chars(char* __first, char* __last, long double __value,
727 chars_format __fmt, int __precision) noexcept;
730_GLIBCXX_END_NAMESPACE_VERSION
733#endif // _GLIBCXX_CHARCONV