181 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			181 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C++
		
	
	
	
// -*- C++ -*-
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
//
 | 
						|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 | 
						|
// See https://llvm.org/LICENSE.txt for license information.
 | 
						|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
 | 
						|
#ifndef _LIBCPP___CHARCONV_TABLES
 | 
						|
#define _LIBCPP___CHARCONV_TABLES
 | 
						|
 | 
						|
#include <__config>
 | 
						|
#include <cstdint>
 | 
						|
 | 
						|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 | 
						|
#  pragma GCC system_header
 | 
						|
#endif
 | 
						|
 | 
						|
_LIBCPP_BEGIN_NAMESPACE_STD
 | 
						|
 | 
						|
#ifndef _LIBCPP_CXX03_LANG
 | 
						|
 | 
						|
namespace __itoa {
 | 
						|
 | 
						|
/// Contains the charconv helper tables.
 | 
						|
///
 | 
						|
/// In C++17 these could be inline constexpr variable, but libc++ supports
 | 
						|
/// charconv for integrals in C++11 mode.
 | 
						|
template <class = void>
 | 
						|
struct __table {
 | 
						|
  static const char __base_2_lut[64];
 | 
						|
  static const char __base_8_lut[128];
 | 
						|
  static const char __base_16_lut[512];
 | 
						|
 | 
						|
  static const uint32_t __pow10_32[10];
 | 
						|
  static const uint64_t __pow10_64[20];
 | 
						|
#  ifndef _LIBCPP_HAS_NO_INT128
 | 
						|
  // TODO FMT Reduce the number of entries in this table.
 | 
						|
  static const __uint128_t __pow10_128[40];
 | 
						|
  static const int __pow10_128_offset = 0;
 | 
						|
#  endif
 | 
						|
  static const char __digits_base_10[200];
 | 
						|
};
 | 
						|
 | 
						|
template <class _Tp>
 | 
						|
const char __table<_Tp>::__base_2_lut[64] = {
 | 
						|
    '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '1', '0', '0', '0', '1', '1', '0', '1', '0', '0', '0', '1',
 | 
						|
    '0', '1', '0', '1', '1', '0', '0', '1', '1', '1', '1', '0', '0', '0', '1', '0', '0', '1', '1', '0', '1', '0',
 | 
						|
    '1', '0', '1', '1', '1', '1', '0', '0', '1', '1', '0', '1', '1', '1', '1', '0', '1', '1', '1', '1'};
 | 
						|
 | 
						|
template <class _Tp>
 | 
						|
const char __table<_Tp>::__base_8_lut[128] = {
 | 
						|
    '0', '0', '0', '1', '0', '2', '0', '3', '0', '4', '0', '5', '0', '6', '0', '7', '1', '0', '1', '1', '1', '2',
 | 
						|
    '1', '3', '1', '4', '1', '5', '1', '6', '1', '7', '2', '0', '2', '1', '2', '2', '2', '3', '2', '4', '2', '5',
 | 
						|
    '2', '6', '2', '7', '3', '0', '3', '1', '3', '2', '3', '3', '3', '4', '3', '5', '3', '6', '3', '7', '4', '0',
 | 
						|
    '4', '1', '4', '2', '4', '3', '4', '4', '4', '5', '4', '6', '4', '7', '5', '0', '5', '1', '5', '2', '5', '3',
 | 
						|
    '5', '4', '5', '5', '5', '6', '5', '7', '6', '0', '6', '1', '6', '2', '6', '3', '6', '4', '6', '5', '6', '6',
 | 
						|
    '6', '7', '7', '0', '7', '1', '7', '2', '7', '3', '7', '4', '7', '5', '7', '6', '7', '7'};
 | 
						|
 | 
						|
template <class _Tp>
 | 
						|
const char __table<_Tp>::__base_16_lut[512] = {
 | 
						|
    '0', '0', '0', '1', '0', '2', '0', '3', '0', '4', '0', '5', '0', '6', '0', '7', '0', '8', '0', '9', '0', 'a', '0',
 | 
						|
    'b', '0', 'c', '0', 'd', '0', 'e', '0', 'f', '1', '0', '1', '1', '1', '2', '1', '3', '1', '4', '1', '5', '1', '6',
 | 
						|
    '1', '7', '1', '8', '1', '9', '1', 'a', '1', 'b', '1', 'c', '1', 'd', '1', 'e', '1', 'f', '2', '0', '2', '1', '2',
 | 
						|
    '2', '2', '3', '2', '4', '2', '5', '2', '6', '2', '7', '2', '8', '2', '9', '2', 'a', '2', 'b', '2', 'c', '2', 'd',
 | 
						|
    '2', 'e', '2', 'f', '3', '0', '3', '1', '3', '2', '3', '3', '3', '4', '3', '5', '3', '6', '3', '7', '3', '8', '3',
 | 
						|
    '9', '3', 'a', '3', 'b', '3', 'c', '3', 'd', '3', 'e', '3', 'f', '4', '0', '4', '1', '4', '2', '4', '3', '4', '4',
 | 
						|
    '4', '5', '4', '6', '4', '7', '4', '8', '4', '9', '4', 'a', '4', 'b', '4', 'c', '4', 'd', '4', 'e', '4', 'f', '5',
 | 
						|
    '0', '5', '1', '5', '2', '5', '3', '5', '4', '5', '5', '5', '6', '5', '7', '5', '8', '5', '9', '5', 'a', '5', 'b',
 | 
						|
    '5', 'c', '5', 'd', '5', 'e', '5', 'f', '6', '0', '6', '1', '6', '2', '6', '3', '6', '4', '6', '5', '6', '6', '6',
 | 
						|
    '7', '6', '8', '6', '9', '6', 'a', '6', 'b', '6', 'c', '6', 'd', '6', 'e', '6', 'f', '7', '0', '7', '1', '7', '2',
 | 
						|
    '7', '3', '7', '4', '7', '5', '7', '6', '7', '7', '7', '8', '7', '9', '7', 'a', '7', 'b', '7', 'c', '7', 'd', '7',
 | 
						|
    'e', '7', 'f', '8', '0', '8', '1', '8', '2', '8', '3', '8', '4', '8', '5', '8', '6', '8', '7', '8', '8', '8', '9',
 | 
						|
    '8', 'a', '8', 'b', '8', 'c', '8', 'd', '8', 'e', '8', 'f', '9', '0', '9', '1', '9', '2', '9', '3', '9', '4', '9',
 | 
						|
    '5', '9', '6', '9', '7', '9', '8', '9', '9', '9', 'a', '9', 'b', '9', 'c', '9', 'd', '9', 'e', '9', 'f', 'a', '0',
 | 
						|
    'a', '1', 'a', '2', 'a', '3', 'a', '4', 'a', '5', 'a', '6', 'a', '7', 'a', '8', 'a', '9', 'a', 'a', 'a', 'b', 'a',
 | 
						|
    'c', 'a', 'd', 'a', 'e', 'a', 'f', 'b', '0', 'b', '1', 'b', '2', 'b', '3', 'b', '4', 'b', '5', 'b', '6', 'b', '7',
 | 
						|
    'b', '8', 'b', '9', 'b', 'a', 'b', 'b', 'b', 'c', 'b', 'd', 'b', 'e', 'b', 'f', 'c', '0', 'c', '1', 'c', '2', 'c',
 | 
						|
    '3', 'c', '4', 'c', '5', 'c', '6', 'c', '7', 'c', '8', 'c', '9', 'c', 'a', 'c', 'b', 'c', 'c', 'c', 'd', 'c', 'e',
 | 
						|
    'c', 'f', 'd', '0', 'd', '1', 'd', '2', 'd', '3', 'd', '4', 'd', '5', 'd', '6', 'd', '7', 'd', '8', 'd', '9', 'd',
 | 
						|
    'a', 'd', 'b', 'd', 'c', 'd', 'd', 'd', 'e', 'd', 'f', 'e', '0', 'e', '1', 'e', '2', 'e', '3', 'e', '4', 'e', '5',
 | 
						|
    'e', '6', 'e', '7', 'e', '8', 'e', '9', 'e', 'a', 'e', 'b', 'e', 'c', 'e', 'd', 'e', 'e', 'e', 'f', 'f', '0', 'f',
 | 
						|
    '1', 'f', '2', 'f', '3', 'f', '4', 'f', '5', 'f', '6', 'f', '7', 'f', '8', 'f', '9', 'f', 'a', 'f', 'b', 'f', 'c',
 | 
						|
    'f', 'd', 'f', 'e', 'f', 'f'};
 | 
						|
 | 
						|
template <class _Tp>
 | 
						|
const uint32_t __table<_Tp>::__pow10_32[10] = {
 | 
						|
    UINT32_C(0),      UINT32_C(10),      UINT32_C(100),      UINT32_C(1000),      UINT32_C(10000),
 | 
						|
    UINT32_C(100000), UINT32_C(1000000), UINT32_C(10000000), UINT32_C(100000000), UINT32_C(1000000000)};
 | 
						|
 | 
						|
template <class _Tp>
 | 
						|
const uint64_t __table<_Tp>::__pow10_64[20] = {UINT64_C(0),
 | 
						|
                                               UINT64_C(10),
 | 
						|
                                               UINT64_C(100),
 | 
						|
                                               UINT64_C(1000),
 | 
						|
                                               UINT64_C(10000),
 | 
						|
                                               UINT64_C(100000),
 | 
						|
                                               UINT64_C(1000000),
 | 
						|
                                               UINT64_C(10000000),
 | 
						|
                                               UINT64_C(100000000),
 | 
						|
                                               UINT64_C(1000000000),
 | 
						|
                                               UINT64_C(10000000000),
 | 
						|
                                               UINT64_C(100000000000),
 | 
						|
                                               UINT64_C(1000000000000),
 | 
						|
                                               UINT64_C(10000000000000),
 | 
						|
                                               UINT64_C(100000000000000),
 | 
						|
                                               UINT64_C(1000000000000000),
 | 
						|
                                               UINT64_C(10000000000000000),
 | 
						|
                                               UINT64_C(100000000000000000),
 | 
						|
                                               UINT64_C(1000000000000000000),
 | 
						|
                                               UINT64_C(10000000000000000000)};
 | 
						|
 | 
						|
#  ifndef _LIBCPP_HAS_NO_INT128
 | 
						|
template <class _Tp>
 | 
						|
const __uint128_t __table<_Tp>::__pow10_128[40] = {
 | 
						|
    UINT64_C(0),
 | 
						|
    UINT64_C(10),
 | 
						|
    UINT64_C(100),
 | 
						|
    UINT64_C(1000),
 | 
						|
    UINT64_C(10000),
 | 
						|
    UINT64_C(100000),
 | 
						|
    UINT64_C(1000000),
 | 
						|
    UINT64_C(10000000),
 | 
						|
    UINT64_C(100000000),
 | 
						|
    UINT64_C(1000000000),
 | 
						|
    UINT64_C(10000000000),
 | 
						|
    UINT64_C(100000000000),
 | 
						|
    UINT64_C(1000000000000),
 | 
						|
    UINT64_C(10000000000000),
 | 
						|
    UINT64_C(100000000000000),
 | 
						|
    UINT64_C(1000000000000000),
 | 
						|
    UINT64_C(10000000000000000),
 | 
						|
    UINT64_C(100000000000000000),
 | 
						|
    UINT64_C(1000000000000000000),
 | 
						|
    UINT64_C(10000000000000000000),
 | 
						|
    __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(10),
 | 
						|
    __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(100),
 | 
						|
    __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(1000),
 | 
						|
    __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(10000),
 | 
						|
    __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(100000),
 | 
						|
    __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(1000000),
 | 
						|
    __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(10000000),
 | 
						|
    __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(100000000),
 | 
						|
    __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(1000000000),
 | 
						|
    __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(10000000000),
 | 
						|
    __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(100000000000),
 | 
						|
    __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(1000000000000),
 | 
						|
    __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(10000000000000),
 | 
						|
    __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(100000000000000),
 | 
						|
    __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(1000000000000000),
 | 
						|
    __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(10000000000000000),
 | 
						|
    __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(100000000000000000),
 | 
						|
    __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(1000000000000000000),
 | 
						|
    __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(10000000000000000000),
 | 
						|
    (__uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(10000000000000000000)) * 10};
 | 
						|
#  endif
 | 
						|
 | 
						|
template <class _Tp>
 | 
						|
const char __table<_Tp>::__digits_base_10[200] = {
 | 
						|
    // clang-format off
 | 
						|
    '0', '0', '0', '1', '0', '2', '0', '3', '0', '4', '0', '5', '0', '6', '0', '7', '0', '8', '0', '9',
 | 
						|
    '1', '0', '1', '1', '1', '2', '1', '3', '1', '4', '1', '5', '1', '6', '1', '7', '1', '8', '1', '9',
 | 
						|
    '2', '0', '2', '1', '2', '2', '2', '3', '2', '4', '2', '5', '2', '6', '2', '7', '2', '8', '2', '9',
 | 
						|
    '3', '0', '3', '1', '3', '2', '3', '3', '3', '4', '3', '5', '3', '6', '3', '7', '3', '8', '3', '9',
 | 
						|
    '4', '0', '4', '1', '4', '2', '4', '3', '4', '4', '4', '5', '4', '6', '4', '7', '4', '8', '4', '9',
 | 
						|
    '5', '0', '5', '1', '5', '2', '5', '3', '5', '4', '5', '5', '5', '6', '5', '7', '5', '8', '5', '9',
 | 
						|
    '6', '0', '6', '1', '6', '2', '6', '3', '6', '4', '6', '5', '6', '6', '6', '7', '6', '8', '6', '9',
 | 
						|
    '7', '0', '7', '1', '7', '2', '7', '3', '7', '4', '7', '5', '7', '6', '7', '7', '7', '8', '7', '9',
 | 
						|
    '8', '0', '8', '1', '8', '2', '8', '3', '8', '4', '8', '5', '8', '6', '8', '7', '8', '8', '8', '9',
 | 
						|
    '9', '0', '9', '1', '9', '2', '9', '3', '9', '4', '9', '5', '9', '6', '9', '7', '9', '8', '9', '9'};
 | 
						|
// clang-format on
 | 
						|
 | 
						|
} // namespace __itoa
 | 
						|
 | 
						|
#endif // _LIBCPP_CXX03_LANG
 | 
						|
 | 
						|
_LIBCPP_END_NAMESPACE_STD
 | 
						|
 | 
						|
#endif // _LIBCPP___CHARCONV_TABLES
 |