// Formatting library for C++ - implementation
//
// Copyright (c) 2012 - 2016, Victor Zverovich
// All rights reserved.
//
// For the license information refer to format.h.
#ifndef FMT_FORMAT_INL_H_
#define FMT_FORMAT_INL_H_
#ifndef FMT_MODULE
# include <algorithm>
# include <cerrno>
// errno
# include <climits>
# include <cmath>
# include <exception>
#endif
#if defined (_WIN32) && !
defined (FMT_USE_WRITE_CONSOLE)
# include <io.h>
// _isatty
#endif
#include "format.h"
#if FMT_USE_LOCALE
# include <locale>
#endif
#ifndef FMT_FUNC
# define FMT_FUNC
#endif
FMT_BEGIN_NAMESPACE
namespace detail {
FMT_FUNC
void assert_fail(
const char * file,
int line,
const char * message) {
// Use unchecked std::fprintf to avoid triggering another assertion when
// writing to stderr fails.
fprintf(stderr,
"%s:%d: assertion failed: %s" , file, line, message);
abort();
}
FMT_FUNC
void format_error_code(detail::buffer<
char >& out,
int error_code,
string_view message) noexcept {
// Report error code making sure that the output fits into
// inline_buffer_size to avoid dynamic memory allocation and potential
// bad_alloc.
out.try_resize(
0 );
static const char SEP[] =
": " ;
static const char ERROR_STR[] =
"error " ;
// Subtract 2 to account for terminating null characters in SEP and ERROR_STR.
size_t error_code_size =
sizeof (SEP) +
sizeof (ERROR_STR) -
2 ;
auto abs_value =
static_cast <uint32_or_64_or_128_t<
int >>(error_code);
if (detail::is_negative(error_code)) {
abs_value =
0 - abs_value;
++error_code_size;
}
error_code_size += detail::to_unsigned(detail::count_digits(abs_value));
auto it = appender(out);
if (message.size() <= inline_buffer_size - error_code_size)
fmt::format_to(it, FMT_STRING(
"{}{}" ), message, SEP);
fmt::format_to(it, FMT_STRING(
"{}{}" ), ERROR_STR, error_code);
FMT_ASSERT(out.size() <= inline_buffer_size,
"" );
}
FMT_FUNC
void do_report_error(format_func func,
int error_code,
const char * message) noexcept {
memory_buffer full_message;
func(full_message, error_code, message);
// Don't use fwrite_all because the latter may throw.
if (std::fwrite(full_message.data(), full_message.size(),
1 , stderr) >
0 )
std::fputc(
'\n' , stderr);
}
// A wrapper around fwrite that throws on error.
inline void fwrite_all(
const void * ptr, size_t count, FILE* stream) {
std::fwrite(ptr,
1 , count, stream);
// size_t written = std::fwrite(ptr, 1, count, stream);
// if (written < count)
// FMT_THROW(system_error(errno, FMT_STRING("cannot write to file")));
}
#if FMT_USE_LOCALE
using std::locale;
using std::numpunct;
using std::use_facet;
template <
typename Locale, enable_if_t<(
sizeof (Locale::collate) !=
0 ),
int >>
locale_ref::locale_ref(
const Locale& loc) : locale_(&loc) {
static_assert(std::is_same<Locale, locale>::value,
"" );
}
#else
struct locale {};
template <
typename Char >
struct numpunct {
auto grouping()
const -> std::string {
return "\03" ; }
auto thousands_sep()
const ->
Char {
return ',' ; }
auto decimal_point()
const ->
Char {
return '.' ; }
};
template <
typename Facet> Facet use_facet(locale) {
return {}; }
#endif // FMT_USE_LOCALE
template <
typename Locale>
auto locale_ref::get()
const -> Locale {
static_assert(std::is_same<Locale, locale>::value,
"" );
#if FMT_USE_LOCALE
if (locale_)
return *
static_cast <
const locale*>(locale_);
#endif
return locale();
}
template <
typename Char >
FMT_FUNC
auto thousands_sep_impl(locale_ref loc) -> thousands_sep_result<
Char > {
auto && facet = use_facet<numpunct<
Char >>(loc.get<locale>());
auto grouping = facet.grouping();
auto thousands_sep = grouping.empty() ?
Char () : facet.thousands_sep();
return {std::move(grouping), thousands_sep};
}
template <
typename Char >
FMT_FUNC
auto decimal_point_impl(locale_ref loc) ->
Char {
return use_facet<numpunct<
Char >>(loc.get<locale>()).decimal_point();
}
#if FMT_USE_LOCALE
FMT_FUNC
auto write_loc(appender out, loc_value value,
const format_specs& specs, locale_ref loc) ->
bool {
auto locale = loc.get<std::locale>();
// We cannot use the num_put<char> facet because it may produce output in
// a wrong encoding.
using facet = format_facet<std::locale>;
if (std::has_facet<facet>(locale))
return use_facet<facet>(locale).put(out, value, specs);
return facet(locale).put(out, value, specs);
}
#endif
}
// namespace detail
FMT_FUNC
void report_error(
const char * message) {
#if FMT_USE_EXCEPTIONS
throw format_error(message);
#else
fputs(message, stderr);
abort();
#endif
}
template <
typename Locale>
typename Locale::id format_facet<Locale>::id;
template <
typename Locale> format_facet<Locale>::format_facet(Locale& loc) {
auto & np = detail::use_facet<detail::numpunct<
char >>(loc);
grouping_ = np.grouping();
if (!grouping_.empty()) separator_ = std::string(
1 , np.thousands_sep());
}
#if FMT_USE_LOCALE
template <>
FMT_API FMT_FUNC
auto format_facet<std::locale>::do_put(
appender out, loc_value val,
const format_specs& specs)
const ->
bool {
return val.visit(
detail::loc_writer<>{out, specs, separator_, grouping_, decimal_point_});
}
#endif
// FMT_FUNC auto vsystem_error(int error_code, string_view fmt, format_args args)
// -> std::system_error {
// auto ec = std::error_code(error_code, std::generic_category());
// return std::system_error(ec, vformat(fmt, args));
// }
namespace detail {
template <
typename F>
inline auto operator ==(basic_fp<F> x, basic_fp<F> y) ->
bool {
return x.f == y.f && x.e == y.e;
}
// Compilers should be able to optimize this into the ror instruction.
FMT_CONSTEXPR
inline auto rotr(uint32_t n, uint32_t r) noexcept -> uint32_t {
r &=
31 ;
return (n >> r) | (n << (
32 - r));
}
FMT_CONSTEXPR
inline auto rotr(uint64_t n, uint32_t r) noexcept -> uint64_t {
r &=
63 ;
return (n >> r) | (n << (
64 - r));
}
// Implementation of Dragonbox algorithm: https://github.com/jk-jeon/dragonbox.
namespace dragonbox {
// Computes upper 64 bits of multiplication of a 32-bit unsigned integer and a
// 64-bit unsigned integer.
inline auto umul96_upper64(uint32_t x, uint64_t y) noexcept -> uint64_t {
return umul128_upper64(
static_cast <uint64_t>(x) <<
32 , y);
}
// Computes lower 128 bits of multiplication of a 64-bit unsigned integer and a
// 128-bit unsigned integer.
inline auto umul192_lower128(uint64_t x, uint128_fallback y) noexcept
-> uint128_fallback {
uint64_t high = x * y.high();
uint128_fallback high_low = umul128(x, y.low());
return {high + high_low.high(), high_low.low()};
}
// Computes lower 64 bits of multiplication of a 32-bit unsigned integer and a
// 64-bit unsigned integer.
inline auto umul96_lower64(uint32_t x, uint64_t y) noexcept -> uint64_t {
return x * y;
}
// Various fast log computations.
inline auto floor_log10_pow2_minus_log10_4_over_3(
int e) noexcept ->
int {
FMT_ASSERT(e <=
2936 && e >= -
2985 ,
"too large exponent" );
return (e *
631305 -
261663 ) >>
21 ;
}
FMT_INLINE_VARIABLE constexpr
struct {
uint32_t divisor;
int shift_amount;
} div_small_pow10_infos[] = {{
10 ,
16 }, {
100 ,
16 }};
// Replaces n by floor(n / pow(10, N)) returning true if and only if n is
// divisible by pow(10, N).
// Precondition: n <= pow(10, N + 1).
template <
int N>
auto check_divisibility_and_divide_by_pow10(uint32_t& n) noexcept ->
bool {
// The numbers below are chosen such that:
// 1. floor(n/d) = floor(nm / 2^k) where d=10 or d=100,
// 2. nm mod 2^k < m if and only if n is divisible by d,
// where m is magic_number, k is shift_amount
// and d is divisor.
//
// Item 1 is a common technique of replacing division by a constant with
// multiplication, see e.g. "Division by Invariant Integers Using
// Multiplication" by Granlund and Montgomery (1994). magic_number (m) is set
// to ceil(2^k/d) for large enough k.
// The idea for item 2 originates from Schubfach.
constexpr
auto info = div_small_pow10_infos[N -
1 ];
FMT_ASSERT(n <= info.divisor *
10 ,
"n is too large" );
constexpr uint32_t magic_number =
(
1 u << info.shift_amount) / info.divisor +
1 ;
n *= magic_number;
const uint32_t comparison_mask = (
1 u << info.shift_amount) -
1 ;
bool result = (n & comparison_mask) < magic_number;
n >>= info.shift_amount;
return result;
}
// Computes floor(n / pow(10, N)) for small n and N.
// Precondition: n <= pow(10, N + 1).
template <
int N>
auto small_division_by_pow10(uint32_t n) noexcept -> uint32_t {
constexpr
auto info = div_small_pow10_infos[N -
1 ];
FMT_ASSERT(n <= info.divisor *
10 ,
"n is too large" );
constexpr uint32_t magic_number =
(
1 u << info.shift_amount) / info.divisor +
1 ;
return (n * magic_number) >> info.shift_amount;
}
// Computes floor(n / 10^(kappa + 1)) (float)
inline auto divide_by_10_to_kappa_plus_1(uint32_t n) noexcept -> uint32_t {
// 1374389535 = ceil(2^37/100)
return static_cast <uint32_t>((
static_cast <uint64_t>(n) *
1374389535 ) >>
37 );
}
// Computes floor(n / 10^(kappa + 1)) (double)
inline auto divide_by_10_to_kappa_plus_1(uint64_t n) noexcept -> uint64_t {
// 2361183241434822607 = ceil(2^(64+7)/1000)
return umul128_upper64(n,
2361183241434822607 ull) >>
7 ;
}
// Various subroutines using pow10 cache
template <
typename T>
struct cache_accessor;
template <>
struct cache_accessor<
float > {
using carrier_uint = float_info<
float >::carrier_uint;
using cache_entry_type = uint64_t;
static auto get_cached_power(
int k) noexcept -> uint64_t {
FMT_ASSERT(k >= float_info<
float >::min_k && k <= float_info<
float >::max_k,
"k is out of range" );
static constexpr
const uint64_t pow10_significands[] = {
0 x81ceb32c4b43fcf5,
0 xa2425ff75e14fc32,
0 xcad2f7f5359a3b3f,
0 xfd87b5f28300ca0e,
0 x9e74d1b791e07e49,
0 xc612062576589ddb,
0 xf79687aed3eec552,
0 x9abe14cd44753b53,
0 xc16d9a0095928a28,
0 xf1c90080baf72cb2,
0 x971da05074da7bef,
0 xbce5086492111aeb,
0 xec1e4a7db69561a6,
0 x9392ee8e921d5d08,
0 xb877aa3236a4b44a,
0 xe69594bec44de15c,
0 x901d7cf73ab0acda,
0 xb424dc35095cd810,
0 xe12e13424bb40e14,
0 x8cbccc096f5088cc,
0 xafebff0bcb24aaff,
0 xdbe6fecebdedd5bf,
0 x89705f4136b4a598,
0 xabcc77118461cefd,
0 xd6bf94d5e57a42bd,
0 x8637bd05af6c69b6,
0 xa7c5ac471b478424,
0 xd1b71758e219652c,
0 x83126e978d4fdf3c,
0 xa3d70a3d70a3d70b,
0 xcccccccccccccccd,
0 x8000000000000000,
0 xa000000000000000,
0 xc800000000000000,
0 xfa00000000000000,
0 x9c40000000000000,
0 xc350000000000000,
0 xf424000000000000,
0 x9896800000000000,
0 xbebc200000000000,
0 xee6b280000000000,
0 x9502f90000000000,
0 xba43b74000000000,
0 xe8d4a51000000000,
0 x9184e72a00000000,
0 xb5e620f480000000,
0 xe35fa931a0000000,
0 x8e1bc9bf04000000,
0 xb1a2bc2ec5000000,
0 xde0b6b3a76400000,
0 x8ac7230489e80000,
0 xad78ebc5ac620000,
0 xd8d726b7177a8000,
0 x878678326eac9000,
0 xa968163f0a57b400,
0 xd3c21bcecceda100,
0 x84595161401484a0,
0 xa56fa5b99019a5c8,
0 xcecb8f27f4200f3a,
0 x813f3978f8940985,
0 xa18f07d736b90be6,
0 xc9f2c9cd04674edf,
0 xfc6f7c4045812297,
0 x9dc5ada82b70b59e,
0 xc5371912364ce306,
0 xf684df56c3e01bc7,
0 x9a130b963a6c115d,
0 xc097ce7bc90715b4,
0 xf0bdc21abb48db21,
0 x96769950b50d88f5,
0 xbc143fa4e250eb32,
0 xeb194f8e1ae525fe,
0 x92efd1b8d0cf37bf,
0 xb7abc627050305ae,
0 xe596b7b0c643c71a,
0 x8f7e32ce7bea5c70,
0 xb35dbf821ae4f38c,
0 xe0352f62a19e306f};
return pow10_significands[k - float_info<
float >::min_k];
}
struct compute_mul_result {
carrier_uint result;
bool is_integer;
};
struct compute_mul_parity_result {
bool parity;
bool is_integer;
};
static auto compute_mul(carrier_uint u,
const cache_entry_type& cache) noexcept
-> compute_mul_result {
auto r = umul96_upper64(u, cache);
return {
static_cast <carrier_uint>(r >>
32 ),
static_cast <carrier_uint>(r) ==
0 };
}
static auto compute_delta(
const cache_entry_type& cache,
int beta) noexcept
-> uint32_t {
return static_cast <uint32_t>(cache >> (
64 -
1 - beta));
}
static auto compute_mul_parity(carrier_uint two_f,
const cache_entry_type& cache,
int beta) noexcept
-> compute_mul_parity_result {
FMT_ASSERT(beta >=
1 ,
"" );
FMT_ASSERT(beta <
64 ,
"" );
auto r = umul96_lower64(two_f, cache);
return {((r >> (
64 - beta)) &
1 ) !=
0 ,
static_cast <uint32_t>(r >> (
32 - beta)) ==
0 };
}
static auto compute_left_endpoint_for_shorter_interval_case(
const cache_entry_type& cache,
int beta) noexcept -> carrier_uint {
return static_cast <carrier_uint>(
(cache - (cache >> (num_significand_bits<
float >() +
2 ))) >>
(
64 - num_significand_bits<
float >() -
1 - beta));
}
static auto compute_right_endpoint_for_shorter_interval_case(
const cache_entry_type& cache,
int beta) noexcept -> carrier_uint {
return static_cast <carrier_uint>(
(cache + (cache >> (num_significand_bits<
float >() +
1 ))) >>
(
64 - num_significand_bits<
float >() -
1 - beta));
}
static auto compute_round_up_for_shorter_interval_case(
const cache_entry_type& cache,
int beta) noexcept -> carrier_uint {
return (
static_cast <carrier_uint>(
cache >> (
64 - num_significand_bits<
float >() -
2 - beta)) +
1 ) /
2 ;
}
};
template <>
struct cache_accessor<
double > {
using carrier_uint = float_info<
double >::carrier_uint;
using cache_entry_type = uint128_fallback;
static auto get_cached_power(
int k) noexcept -> uint128_fallback {
FMT_ASSERT(k >= float_info<
double >::min_k && k <= float_info<
double >::max_k,
"k is out of range" );
static constexpr
const uint128_fallback pow10_significands[] = {
#if FMT_USE_FULL_CACHE_DRAGONBOX
{
0 xff77b1fcbebcdc4f,
0 x25e8e89c13bb0f7b},
{
0 x9faacf3df73609b1,
0 x77b191618c54e9ad},
{
0 xc795830d75038c1d,
0 xd59df5b9ef6a2418},
{
0 xf97ae3d0d2446f25,
0 x4b0573286b44ad1e},
{
0 x9becce62836ac577,
0 x4ee367f9430aec33},
{
0 xc2e801fb244576d5,
0 x229c41f793cda740},
{
0 xf3a20279ed56d48a,
0 x6b43527578c11110},
{
0 x9845418c345644d6,
0 x830a13896b78aaaa},
{
0 xbe5691ef416bd60c,
0 x23cc986bc656d554},
{
0 xedec366b11c6cb8f,
0 x2cbfbe86b7ec8aa9},
{
0 x94b3a202eb1c3f39,
0 x7bf7d71432f3d6aa},
{
0 xb9e08a83a5e34f07,
0 xdaf5ccd93fb0cc54},
{
0 xe858ad248f5c22c9,
0 xd1b3400f8f9cff69},
{
0 x91376c36d99995be,
0 x23100809b9c21fa2},
{
0 xb58547448ffffb2d,
0 xabd40a0c2832a78b},
{
0 xe2e69915b3fff9f9,
0 x16c90c8f323f516d},
{
0 x8dd01fad907ffc3b,
0 xae3da7d97f6792e4},
{
0 xb1442798f49ffb4a,
0 x99cd11cfdf41779d},
{
0 xdd95317f31c7fa1d,
0 x40405643d711d584},
{
0 x8a7d3eef7f1cfc52,
0 x482835ea666b2573},
{
0 xad1c8eab5ee43b66,
0 xda3243650005eed0},
{
0 xd863b256369d4a40,
0 x90bed43e40076a83},
{
0 x873e4f75e2224e68,
0 x5a7744a6e804a292},
{
0 xa90de3535aaae202,
0 x711515d0a205cb37},
{
0 xd3515c2831559a83,
0 x0d5a5b44ca873e04},
{
0 x8412d9991ed58091,
0 xe858790afe9486c3},
{
0 xa5178fff668ae0b6,
0 x626e974dbe39a873},
{
0 xce5d73ff402d98e3,
0 xfb0a3d212dc81290},
{
0 x80fa687f881c7f8e,
0 x7ce66634bc9d0b9a},
{
0 xa139029f6a239f72,
0 x1c1fffc1ebc44e81},
{
0 xc987434744ac874e,
0 xa327ffb266b56221},
{
0 xfbe9141915d7a922,
0 x4bf1ff9f0062baa9},
{
0 x9d71ac8fada6c9b5,
0 x6f773fc3603db4aa},
{
0 xc4ce17b399107c22,
0 xcb550fb4384d21d4},
{
0 xf6019da07f549b2b,
0 x7e2a53a146606a49},
{
0 x99c102844f94e0fb,
0 x2eda7444cbfc426e},
{
0 xc0314325637a1939,
0 xfa911155fefb5309},
{
0 xf03d93eebc589f88,
0 x793555ab7eba27cb},
{
0 x96267c7535b763b5,
0 x4bc1558b2f3458df},
{
0 xbbb01b9283253ca2,
0 x9eb1aaedfb016f17},
{
0 xea9c227723ee8bcb,
0 x465e15a979c1cadd},
{
0 x92a1958a7675175f,
0 x0bfacd89ec191eca},
{
0 xb749faed14125d36,
0 xcef980ec671f667c},
{
0 xe51c79a85916f484,
0 x82b7e12780e7401b},
{
0 x8f31cc0937ae58d2,
0 xd1b2ecb8b0908811},
{
0 xb2fe3f0b8599ef07,
0 x861fa7e6dcb4aa16},
{
0 xdfbdcece67006ac9,
0 x67a791e093e1d49b},
{
0 x8bd6a141006042bd,
0 xe0c8bb2c5c6d24e1},
{
0 xaecc49914078536d,
0 x58fae9f773886e19},
{
0 xda7f5bf590966848,
0 xaf39a475506a899f},
{
0 x888f99797a5e012d,
0 x6d8406c952429604},
{
0 xaab37fd7d8f58178,
0 xc8e5087ba6d33b84},
{
0 xd5605fcdcf32e1d6,
0 xfb1e4a9a90880a65},
{
0 x855c3be0a17fcd26,
0 x5cf2eea09a550680},
{
0 xa6b34ad8c9dfc06f,
0 xf42faa48c0ea481f},
{
0 xd0601d8efc57b08b,
0 xf13b94daf124da27},
{
0 x823c12795db6ce57,
0 x76c53d08d6b70859},
{
0 xa2cb1717b52481ed,
0 x54768c4b0c64ca6f},
{
0 xcb7ddcdda26da268,
0 xa9942f5dcf7dfd0a},
{
0 xfe5d54150b090b02,
0 xd3f93b35435d7c4d},
{
0 x9efa548d26e5a6e1,
0 xc47bc5014a1a6db0},
{
0 xc6b8e9b0709f109a,
0 x359ab6419ca1091c},
{
0 xf867241c8cc6d4c0,
0 xc30163d203c94b63},
{
0 x9b407691d7fc44f8,
0 x79e0de63425dcf1e},
{
0 xc21094364dfb5636,
0 x985915fc12f542e5},
{
0 xf294b943e17a2bc4,
0 x3e6f5b7b17b2939e},
{
0 x979cf3ca6cec5b5a,
0 xa705992ceecf9c43},
{
0 xbd8430bd08277231,
0 x50c6ff782a838354},
{
0 xece53cec4a314ebd,
0 xa4f8bf5635246429},
{
0 x940f4613ae5ed136,
0 x871b7795e136be9a},
{
0 xb913179899f68584,
0 x28e2557b59846e40},
{
0 xe757dd7ec07426e5,
0 x331aeada2fe589d0},
{
0 x9096ea6f3848984f,
0 x3ff0d2c85def7622},
{
0 xb4bca50b065abe63,
0 x0fed077a756b53aa},
{
0 xe1ebce4dc7f16dfb,
0 xd3e8495912c62895},
{
0 x8d3360f09cf6e4bd,
0 x64712dd7abbbd95d},
{
0 xb080392cc4349dec,
0 xbd8d794d96aacfb4},
{
0 xdca04777f541c567,
0 xecf0d7a0fc5583a1},
{
0 x89e42caaf9491b60,
0 xf41686c49db57245},
{
0 xac5d37d5b79b6239,
0 x311c2875c522ced6},
{
0 xd77485cb25823ac7,
0 x7d633293366b828c},
{
0 x86a8d39ef77164bc,
0 xae5dff9c02033198},
{
0 xa8530886b54dbdeb,
0 xd9f57f830283fdfd},
{
0 xd267caa862a12d66,
0 xd072df63c324fd7c},
{
0 x8380dea93da4bc60,
0 x4247cb9e59f71e6e},
{
0 xa46116538d0deb78,
0 x52d9be85f074e609},
{
0 xcd795be870516656,
0 x67902e276c921f8c},
{
0 x806bd9714632dff6,
0 x00ba1cd8a3db53b7},
{
0 xa086cfcd97bf97f3,
0 x80e8a40eccd228a5},
{
0 xc8a883c0fdaf7df0,
0 x6122cd128006b2ce},
{
0 xfad2a4b13d1b5d6c,
0 x796b805720085f82},
{
0 x9cc3a6eec6311a63,
0 xcbe3303674053bb1},
{
0 xc3f490aa77bd60fc,
0 xbedbfc4411068a9d},
{
0 xf4f1b4d515acb93b,
0 xee92fb5515482d45},
{
0 x991711052d8bf3c5,
0 x751bdd152d4d1c4b},
{
0 xbf5cd54678eef0b6,
0 xd262d45a78a0635e},
{
0 xef340a98172aace4,
0 x86fb897116c87c35},
{
0 x9580869f0e7aac0e,
0 xd45d35e6ae3d4da1},
{
0 xbae0a846d2195712,
0 x8974836059cca10a},
{
0 xe998d258869facd7,
0 x2bd1a438703fc94c},
{
0 x91ff83775423cc06,
0 x7b6306a34627ddd0},
{
0 xb67f6455292cbf08,
0 x1a3bc84c17b1d543},
{
0 xe41f3d6a7377eeca,
0 x20caba5f1d9e4a94},
{
0 x8e938662882af53e,
0 x547eb47b7282ee9d},
{
0 xb23867fb2a35b28d,
0 xe99e619a4f23aa44},
{
0 xdec681f9f4c31f31,
0 x6405fa00e2ec94d5},
{
0 x8b3c113c38f9f37e,
0 xde83bc408dd3dd05},
{
0 xae0b158b4738705e,
0 x9624ab50b148d446},
{
0 xd98ddaee19068c76,
0 x3badd624dd9b0958},
{
0 x87f8a8d4cfa417c9,
0 xe54ca5d70a80e5d7},
{
0 xa9f6d30a038d1dbc,
0 x5e9fcf4ccd211f4d},
{
0 xd47487cc8470652b,
0 x7647c32000696720},
{
0 x84c8d4dfd2c63f3b,
0 x29ecd9f40041e074},
{
0 xa5fb0a17c777cf09,
0 xf468107100525891},
{
0 xcf79cc9db955c2cc,
0 x7182148d4066eeb5},
{
0 x81ac1fe293d599bf,
0 xc6f14cd848405531},
{
0 xa21727db38cb002f,
0 xb8ada00e5a506a7d},
{
0 xca9cf1d206fdc03b,
0 xa6d90811f0e4851d},
{
0 xfd442e4688bd304a,
0 x908f4a166d1da664},
{
0 x9e4a9cec15763e2e,
0 x9a598e4e043287ff},
{
0 xc5dd44271ad3cdba,
0 x40eff1e1853f29fe},
{
0 xf7549530e188c128,
0 xd12bee59e68ef47d},
{
0 x9a94dd3e8cf578b9,
0 x82bb74f8301958cf},
{
0 xc13a148e3032d6e7,
0 xe36a52363c1faf02},
{
0 xf18899b1bc3f8ca1,
0 xdc44e6c3cb279ac2},
{
0 x96f5600f15a7b7e5,
0 x29ab103a5ef8c0ba},
{
0 xbcb2b812db11a5de,
0 x7415d448f6b6f0e8},
{
0 xebdf661791d60f56,
0 x111b495b3464ad22},
{
0 x936b9fcebb25c995,
0 xcab10dd900beec35},
{
0 xb84687c269ef3bfb,
0 x3d5d514f40eea743},
{
0 xe65829b3046b0afa,
0 x0cb4a5a3112a5113},
{
0 x8ff71a0fe2c2e6dc,
0 x47f0e785eaba72ac},
{
0 xb3f4e093db73a093,
0 x59ed216765690f57},
{
0 xe0f218b8d25088b8,
0 x306869c13ec3532d},
{
0 x8c974f7383725573,
0 x1e414218c73a13fc},
{
0 xafbd2350644eeacf,
0 xe5d1929ef90898fb},
{
0 xdbac6c247d62a583,
0 xdf45f746b74abf3a},
{
0 x894bc396ce5da772,
0 x6b8bba8c328eb784},
{
0 xab9eb47c81f5114f,
0 x066ea92f3f326565},
{
0 xd686619ba27255a2,
0 xc80a537b0efefebe},
{
0 x8613fd0145877585,
0 xbd06742ce95f5f37},
{
0 xa798fc4196e952e7,
0 x2c48113823b73705},
{
0 xd17f3b51fca3a7a0,
0 xf75a15862ca504c6},
{
0 x82ef85133de648c4,
0 x9a984d73dbe722fc},
{
0 xa3ab66580d5fdaf5,
0 xc13e60d0d2e0ebbb},
{
0 xcc963fee10b7d1b3,
0 x318df905079926a9},
{
0 xffbbcfe994e5c61f,
0 xfdf17746497f7053},
{
0 x9fd561f1fd0f9bd3,
0 xfeb6ea8bedefa634},
{
0 xc7caba6e7c5382c8,
0 xfe64a52ee96b8fc1},
{
0 xf9bd690a1b68637b,
0 x3dfdce7aa3c673b1},
{
0 x9c1661a651213e2d,
0 x06bea10ca65c084f},
{
0 xc31bfa0fe5698db8,
0 x486e494fcff30a63},
{
0 xf3e2f893dec3f126,
0 x5a89dba3c3efccfb},
{
0 x986ddb5c6b3a76b7,
0 xf89629465a75e01d},
{
0 xbe89523386091465,
0 xf6bbb397f1135824},
{
0 xee2ba6c0678b597f,
0 x746aa07ded582e2d},
{
0 x94db483840b717ef,
0 xa8c2a44eb4571cdd},
{
0 xba121a4650e4ddeb,
0 x92f34d62616ce414},
{
0 xe896a0d7e51e1566,
0 x77b020baf9c81d18},
{
0 x915e2486ef32cd60,
0 x0ace1474dc1d122f},
{
0 xb5b5ada8aaff80b8,
0 x0d819992132456bb},
{
0 xe3231912d5bf60e6,
0 x10e1fff697ed6c6a},
{
0 x8df5efabc5979c8f,
0 xca8d3ffa1ef463c2},
{
0 xb1736b96b6fd83b3,
0 xbd308ff8a6b17cb3},
{
0 xddd0467c64bce4a0,
0 xac7cb3f6d05ddbdf},
{
0 x8aa22c0dbef60ee4,
0 x6bcdf07a423aa96c},
{
0 xad4ab7112eb3929d,
0 x86c16c98d2c953c7},
{
0 xd89d64d57a607744,
0 xe871c7bf077ba8b8},
{
0 x87625f056c7c4a8b,
0 x11471cd764ad4973},
{
0 xa93af6c6c79b5d2d,
0 xd598e40d3dd89bd0},
{
0 xd389b47879823479,
0 x4aff1d108d4ec2c4},
{
0 x843610cb4bf160cb,
0 xcedf722a585139bb},
{
0 xa54394fe1eedb8fe,
0 xc2974eb4ee658829},
{
0 xce947a3da6a9273e,
0 x733d226229feea33},
{
0 x811ccc668829b887,
0 x0806357d5a3f5260},
{
0 xa163ff802a3426a8,
0 xca07c2dcb0cf26f8},
{
0 xc9bcff6034c13052,
0 xfc89b393dd02f0b6},
{
0 xfc2c3f3841f17c67,
0 xbbac2078d443ace3},
{
0 x9d9ba7832936edc0,
0 xd54b944b84aa4c0e},
{
0 xc5029163f384a931,
0 x0a9e795e65d4df12},
{
0 xf64335bcf065d37d,
0 x4d4617b5ff4a16d6},
{
0 x99ea0196163fa42e,
0 x504bced1bf8e4e46},
{
0 xc06481fb9bcf8d39,
0 xe45ec2862f71e1d7},
{
0 xf07da27a82c37088,
0 x5d767327bb4e5a4d},
{
0 x964e858c91ba2655,
0 x3a6a07f8d510f870},
{
0 xbbe226efb628afea,
0 x890489f70a55368c},
{
0 xeadab0aba3b2dbe5,
0 x2b45ac74ccea842f},
{
0 x92c8ae6b464fc96f,
0 x3b0b8bc90012929e},
{
0 xb77ada0617e3bbcb,
0 x09ce6ebb40173745},
{
0 xe55990879ddcaabd,
0 xcc420a6a101d0516},
{
0 x8f57fa54c2a9eab6,
0 x9fa946824a12232e},
{
0 xb32df8e9f3546564,
0 x47939822dc96abfa},
{
0 xdff9772470297ebd,
0 x59787e2b93bc56f8},
{
0 x8bfbea76c619ef36,
0 x57eb4edb3c55b65b},
{
0 xaefae51477a06b03,
0 xede622920b6b23f2},
{
0 xdab99e59958885c4,
0 xe95fab368e45ecee},
{
0 x88b402f7fd75539b,
0 x11dbcb0218ebb415},
{
0 xaae103b5fcd2a881,
0 xd652bdc29f26a11a},
{
0 xd59944a37c0752a2,
0 x4be76d3346f04960},
{
0 x857fcae62d8493a5,
0 x6f70a4400c562ddc},
{
0 xa6dfbd9fb8e5b88e,
0 xcb4ccd500f6bb953},
{
0 xd097ad07a71f26b2,
0 x7e2000a41346a7a8},
{
0 x825ecc24c873782f,
0 x8ed400668c0c28c9},
{
0 xa2f67f2dfa90563b,
0 x728900802f0f32fb},
{
0 xcbb41ef979346bca,
0 x4f2b40a03ad2ffba},
{
0 xfea126b7d78186bc,
0 xe2f610c84987bfa9},
{
0 x9f24b832e6b0f436,
0 x0dd9ca7d2df4d7ca},
{
0 xc6ede63fa05d3143,
0 x91503d1c79720dbc},
{
0 xf8a95fcf88747d94,
0 x75a44c6397ce912b},
{
0 x9b69dbe1b548ce7c,
0 xc986afbe3ee11abb},
{
0 xc24452da229b021b,
0 xfbe85badce996169},
{
0 xf2d56790ab41c2a2,
0 xfae27299423fb9c4},
{
0 x97c560ba6b0919a5,
0 xdccd879fc967d41b},
{
0 xbdb6b8e905cb600f,
0 x5400e987bbc1c921},
{
0 xed246723473e3813,
0 x290123e9aab23b69},
{
0 x9436c0760c86e30b,
0 xf9a0b6720aaf6522},
{
0 xb94470938fa89bce,
0 xf808e40e8d5b3e6a},
{
0 xe7958cb87392c2c2,
0 xb60b1d1230b20e05},
{
0 x90bd77f3483bb9b9,
0 xb1c6f22b5e6f48c3},
{
0 xb4ecd5f01a4aa828,
0 x1e38aeb6360b1af4},
{
0 xe2280b6c20dd5232,
0 x25c6da63c38de1b1},
{
0 x8d590723948a535f,
0 x579c487e5a38ad0f},
{
0 xb0af48ec79ace837,
0 x2d835a9df0c6d852},
{
0 xdcdb1b2798182244,
0 xf8e431456cf88e66},
{
0 x8a08f0f8bf0f156b,
0 x1b8e9ecb641b5900},
{
0 xac8b2d36eed2dac5,
0 xe272467e3d222f40},
{
0 xd7adf884aa879177,
0 x5b0ed81dcc6abb10},
{
0 x86ccbb52ea94baea,
0 x98e947129fc2b4ea},
{
0 xa87fea27a539e9a5,
0 x3f2398d747b36225},
{
0 xd29fe4b18e88640e,
0 x8eec7f0d19a03aae},
{
0 x83a3eeeef9153e89,
0 x1953cf68300424ad},
{
0 xa48ceaaab75a8e2b,
0 x5fa8c3423c052dd8},
{
0 xcdb02555653131b6,
0 x3792f412cb06794e},
{
0 x808e17555f3ebf11,
0 xe2bbd88bbee40bd1},
{
0 xa0b19d2ab70e6ed6,
0 x5b6aceaeae9d0ec5},
{
0 xc8de047564d20a8b,
0 xf245825a5a445276},
{
0 xfb158592be068d2e,
0 xeed6e2f0f0d56713},
{
0 x9ced737bb6c4183d,
0 x55464dd69685606c},
{
0 xc428d05aa4751e4c,
0 xaa97e14c3c26b887},
{
0 xf53304714d9265df,
0 xd53dd99f4b3066a9},
{
0 x993fe2c6d07b7fab,
0 xe546a8038efe402a},
{
0 xbf8fdb78849a5f96,
0 xde98520472bdd034},
{
0 xef73d256a5c0f77c,
0 x963e66858f6d4441},
{
0 x95a8637627989aad,
0 xdde7001379a44aa9},
{
0 xbb127c53b17ec159,
0 x5560c018580d5d53},
{
0 xe9d71b689dde71af,
0 xaab8f01e6e10b4a7},
{
0 x9226712162ab070d,
0 xcab3961304ca70e9},
{
0 xb6b00d69bb55c8d1,
0 x3d607b97c5fd0d23},
{
0 xe45c10c42a2b3b05,
0 x8cb89a7db77c506b},
{
0 x8eb98a7a9a5b04e3,
0 x77f3608e92adb243},
{
0 xb267ed1940f1c61c,
0 x55f038b237591ed4},
{
0 xdf01e85f912e37a3,
0 x6b6c46dec52f6689},
{
0 x8b61313bbabce2c6,
0 x2323ac4b3b3da016},
{
0 xae397d8aa96c1b77,
0 xabec975e0a0d081b},
{
0 xd9c7dced53c72255,
0 x96e7bd358c904a22},
{
0 x881cea14545c7575,
0 x7e50d64177da2e55},
{
0 xaa242499697392d2,
0 xdde50bd1d5d0b9ea},
{
0 xd4ad2dbfc3d07787,
0 x955e4ec64b44e865},
{
0 x84ec3c97da624ab4,
0 xbd5af13bef0b113f},
{
0 xa6274bbdd0fadd61,
0 xecb1ad8aeacdd58f},
{
0 xcfb11ead453994ba,
0 x67de18eda5814af3},
{
0 x81ceb32c4b43fcf4,
0 x80eacf948770ced8},
{
0 xa2425ff75e14fc31,
0 xa1258379a94d028e},
{
0 xcad2f7f5359a3b3e,
0 x096ee45813a04331},
{
0 xfd87b5f28300ca0d,
0 x8bca9d6e188853fd},
{
0 x9e74d1b791e07e48,
0 x775ea264cf55347e},
{
0 xc612062576589dda,
0 x95364afe032a819e},
{
0 xf79687aed3eec551,
0 x3a83ddbd83f52205},
{
0 x9abe14cd44753b52,
0 xc4926a9672793543},
{
0 xc16d9a0095928a27,
0 x75b7053c0f178294},
{
0 xf1c90080baf72cb1,
0 x5324c68b12dd6339},
{
0 x971da05074da7bee,
0 xd3f6fc16ebca5e04},
{
0 xbce5086492111aea,
0 x88f4bb1ca6bcf585},
{
0 xec1e4a7db69561a5,
0 x2b31e9e3d06c32e6},
{
0 x9392ee8e921d5d07,
0 x3aff322e62439fd0},
{
0 xb877aa3236a4b449,
0 x09befeb9fad487c3},
{
0 xe69594bec44de15b,
0 x4c2ebe687989a9b4},
{
0 x901d7cf73ab0acd9,
0 x0f9d37014bf60a11},
{
0 xb424dc35095cd80f,
0 x538484c19ef38c95},
{
0 xe12e13424bb40e13,
0 x2865a5f206b06fba},
{
0 x8cbccc096f5088cb,
0 xf93f87b7442e45d4},
{
0 xafebff0bcb24aafe,
0 xf78f69a51539d749},
{
0 xdbe6fecebdedd5be,
0 xb573440e5a884d1c},
{
0 x89705f4136b4a597,
0 x31680a88f8953031},
{
0 xabcc77118461cefc,
0 xfdc20d2b36ba7c3e},
{
0 xd6bf94d5e57a42bc,
0 x3d32907604691b4d},
{
0 x8637bd05af6c69b5,
0 xa63f9a49c2c1b110},
{
0 xa7c5ac471b478423,
0 x0fcf80dc33721d54},
{
0 xd1b71758e219652b,
0 xd3c36113404ea4a9},
{
0 x83126e978d4fdf3b,
0 x645a1cac083126ea},
{
0 xa3d70a3d70a3d70a,
0 x3d70a3d70a3d70a4},
{
0 xcccccccccccccccc,
0 xcccccccccccccccd},
{
0 x8000000000000000,
0 x0000000000000000},
{
0 xa000000000000000,
0 x0000000000000000},
{
0 xc800000000000000,
0 x0000000000000000},
{
0 xfa00000000000000,
0 x0000000000000000},
{
0 x9c40000000000000,
0 x0000000000000000},
{
0 xc350000000000000,
0 x0000000000000000},
{
0 xf424000000000000,
0 x0000000000000000},
{
0 x9896800000000000,
0 x0000000000000000},
{
0 xbebc200000000000,
0 x0000000000000000},
{
0 xee6b280000000000,
0 x0000000000000000},
{
0 x9502f90000000000,
0 x0000000000000000},
{
0 xba43b74000000000,
0 x0000000000000000},
{
0 xe8d4a51000000000,
0 x0000000000000000},
{
0 x9184e72a00000000,
0 x0000000000000000},
{
0 xb5e620f480000000,
0 x0000000000000000},
{
0 xe35fa931a0000000,
0 x0000000000000000},
{
0 x8e1bc9bf04000000,
0 x0000000000000000},
{
0 xb1a2bc2ec5000000,
0 x0000000000000000},
{
0 xde0b6b3a76400000,
0 x0000000000000000},
{
0 x8ac7230489e80000,
0 x0000000000000000},
{
0 xad78ebc5ac620000,
0 x0000000000000000},
{
0 xd8d726b7177a8000,
0 x0000000000000000},
{
0 x878678326eac9000,
0 x0000000000000000},
{
0 xa968163f0a57b400,
0 x0000000000000000},
{
0 xd3c21bcecceda100,
0 x0000000000000000},
{
0 x84595161401484a0,
0 x0000000000000000},
{
0 xa56fa5b99019a5c8,
0 x0000000000000000},
{
0 xcecb8f27f4200f3a,
0 x0000000000000000},
{
0 x813f3978f8940984,
0 x4000000000000000},
{
0 xa18f07d736b90be5,
0 x5000000000000000},
{
0 xc9f2c9cd04674ede,
0 xa400000000000000},
{
0 xfc6f7c4045812296,
0 x4d00000000000000},
{
0 x9dc5ada82b70b59d,
0 xf020000000000000},
{
0 xc5371912364ce305,
0 x6c28000000000000},
{
0 xf684df56c3e01bc6,
0 xc732000000000000},
{
0 x9a130b963a6c115c,
0 x3c7f400000000000},
{
0 xc097ce7bc90715b3,
0 x4b9f100000000000},
{
0 xf0bdc21abb48db20,
0 x1e86d40000000000},
{
0 x96769950b50d88f4,
0 x1314448000000000},
{
0 xbc143fa4e250eb31,
0 x17d955a000000000},
{
0 xeb194f8e1ae525fd,
0 x5dcfab0800000000},
{
0 x92efd1b8d0cf37be,
0 x5aa1cae500000000},
{
0 xb7abc627050305ad,
0 xf14a3d9e40000000},
{
0 xe596b7b0c643c719,
0 x6d9ccd05d0000000},
{
0 x8f7e32ce7bea5c6f,
0 xe4820023a2000000},
{
0 xb35dbf821ae4f38b,
0 xdda2802c8a800000},
{
0 xe0352f62a19e306e,
0 xd50b2037ad200000},
{
0 x8c213d9da502de45,
0 x4526f422cc340000},
{
0 xaf298d050e4395d6,
0 x9670b12b7f410000},
{
0 xdaf3f04651d47b4c,
0 x3c0cdd765f114000},
{
0 x88d8762bf324cd0f,
0 xa5880a69fb6ac800},
{
0 xab0e93b6efee0053,
0 x8eea0d047a457a00},
{
0 xd5d238a4abe98068,
0 x72a4904598d6d880},
{
0 x85a36366eb71f041,
0 x47a6da2b7f864750},
{
0 xa70c3c40a64e6c51,
0 x999090b65f67d924},
{
0 xd0cf4b50cfe20765,
0 xfff4b4e3f741cf6d},
{
0 x82818f1281ed449f,
0 xbff8f10e7a8921a5},
{
0 xa321f2d7226895c7,
0 xaff72d52192b6a0e},
{
0 xcbea6f8ceb02bb39,
0 x9bf4f8a69f764491},
{
0 xfee50b7025c36a08,
0 x02f236d04753d5b5},
{
0 x9f4f2726179a2245,
0 x01d762422c946591},
{
0 xc722f0ef9d80aad6,
0 x424d3ad2b7b97ef6},
{
0 xf8ebad2b84e0d58b,
0 xd2e0898765a7deb3},
{
0 x9b934c3b330c8577,
0 x63cc55f49f88eb30},
{
0 xc2781f49ffcfa6d5,
0 x3cbf6b71c76b25fc},
{
0 xf316271c7fc3908a,
0 x8bef464e3945ef7b},
{
0 x97edd871cfda3a56,
0 x97758bf0e3cbb5ad},
{
0 xbde94e8e43d0c8ec,
0 x3d52eeed1cbea318},
{
0 xed63a231d4c4fb27,
0 x4ca7aaa863ee4bde},
{
0 x945e455f24fb1cf8,
0 x8fe8caa93e74ef6b},
{
0 xb975d6b6ee39e436,
0 xb3e2fd538e122b45},
{
0 xe7d34c64a9c85d44,
0 x60dbbca87196b617},
{
0 x90e40fbeea1d3a4a,
0 xbc8955e946fe31ce},
{
0 xb51d13aea4a488dd,
0 x6babab6398bdbe42},
{
0 xe264589a4dcdab14,
0 xc696963c7eed2dd2},
{
0 x8d7eb76070a08aec,
0 xfc1e1de5cf543ca3},
{
0 xb0de65388cc8ada8,
0 x3b25a55f43294bcc},
{
0 xdd15fe86affad912,
0 x49ef0eb713f39ebf},
{
0 x8a2dbf142dfcc7ab,
0 x6e3569326c784338},
{
0 xacb92ed9397bf996,
0 x49c2c37f07965405},
{
0 xd7e77a8f87daf7fb,
0 xdc33745ec97be907},
{
0 x86f0ac99b4e8dafd,
0 x69a028bb3ded71a4},
{
0 xa8acd7c0222311bc,
0 xc40832ea0d68ce0d},
{
0 xd2d80db02aabd62b,
0 xf50a3fa490c30191},
{
0 x83c7088e1aab65db,
0 x792667c6da79e0fb},
{
0 xa4b8cab1a1563f52,
0 x577001b891185939},
{
0 xcde6fd5e09abcf26,
0 xed4c0226b55e6f87},
{
0 x80b05e5ac60b6178,
0 x544f8158315b05b5},
{
0 xa0dc75f1778e39d6,
0 x696361ae3db1c722},
{
0 xc913936dd571c84c,
0 x03bc3a19cd1e38ea},
{
0 xfb5878494ace3a5f,
0 x04ab48a04065c724},
{
0 x9d174b2dcec0e47b,
0 x62eb0d64283f9c77},
{
0 xc45d1df942711d9a,
0 x3ba5d0bd324f8395},
{
0 xf5746577930d6500,
0 xca8f44ec7ee3647a},
{
0 x9968bf6abbe85f20,
0 x7e998b13cf4e1ecc},
{
0 xbfc2ef456ae276e8,
0 x9e3fedd8c321a67f},
{
0 xefb3ab16c59b14a2,
0 xc5cfe94ef3ea101f},
{
0 x95d04aee3b80ece5,
0 xbba1f1d158724a13},
{
0 xbb445da9ca61281f,
0 x2a8a6e45ae8edc98},
{
0 xea1575143cf97226,
0 xf52d09d71a3293be},
{
0 x924d692ca61be758,
0 x593c2626705f9c57},
{
0 xb6e0c377cfa2e12e,
0 x6f8b2fb00c77836d},
{
0 xe498f455c38b997a,
0 x0b6dfb9c0f956448},
{
0 x8edf98b59a373fec,
0 x4724bd4189bd5ead},
{
0 xb2977ee300c50fe7,
0 x58edec91ec2cb658},
{
0 xdf3d5e9bc0f653e1,
0 x2f2967b66737e3ee},
{
0 x8b865b215899f46c,
0 xbd79e0d20082ee75},
{
0 xae67f1e9aec07187,
0 xecd8590680a3aa12},
{
0 xda01ee641a708de9,
0 xe80e6f4820cc9496},
{
0 x884134fe908658b2,
0 x3109058d147fdcde},
{
0 xaa51823e34a7eede,
0 xbd4b46f0599fd416},
{
0 xd4e5e2cdc1d1ea96,
0 x6c9e18ac7007c91b},
{
0 x850fadc09923329e,
0 x03e2cf6bc604ddb1},
{
0 xa6539930bf6bff45,
0 x84db8346b786151d},
{
0 xcfe87f7cef46ff16,
0 xe612641865679a64},
{
0 x81f14fae158c5f6e,
0 x4fcb7e8f3f60c07f},
{
0 xa26da3999aef7749,
0 xe3be5e330f38f09e},
{
0 xcb090c8001ab551c,
0 x5cadf5bfd3072cc6},
{
0 xfdcb4fa002162a63,
0 x73d9732fc7c8f7f7},
{
0 x9e9f11c4014dda7e,
0 x2867e7fddcdd9afb},
{
0 xc646d63501a1511d,
0 xb281e1fd541501b9},
{
0 xf7d88bc24209a565,
0 x1f225a7ca91a4227},
{
0 x9ae757596946075f,
0 x3375788de9b06959},
{
0 xc1a12d2fc3978937,
0 x0052d6b1641c83af},
{
0 xf209787bb47d6b84,
0 xc0678c5dbd23a49b},
{
0 x9745eb4d50ce6332,
0 xf840b7ba963646e1},
{
0 xbd176620a501fbff,
0 xb650e5a93bc3d899},
{
0 xec5d3fa8ce427aff,
0 xa3e51f138ab4cebf},
{
0 x93ba47c980e98cdf,
0 xc66f336c36b10138},
{
0 xb8a8d9bbe123f017,
0 xb80b0047445d4185},
{
0 xe6d3102ad96cec1d,
0 xa60dc059157491e6},
{
0 x9043ea1ac7e41392,
0 x87c89837ad68db30},
{
0 xb454e4a179dd1877,
0 x29babe4598c311fc},
{
0 xe16a1dc9d8545e94,
0 xf4296dd6fef3d67b},
{
0 x8ce2529e2734bb1d,
0 x1899e4a65f58660d},
{
0 xb01ae745b101e9e4,
0 x5ec05dcff72e7f90},
{
0 xdc21a1171d42645d,
0 x76707543f4fa1f74},
{
0 x899504ae72497eba,
0 x6a06494a791c53a9},
{
0 xabfa45da0edbde69,
0 x0487db9d17636893},
{
0 xd6f8d7509292d603,
0 x45a9d2845d3c42b7},
{
0 x865b86925b9bc5c2,
0 x0b8a2392ba45a9b3},
{
0 xa7f26836f282b732,
0 x8e6cac7768d7141f},
{
0 xd1ef0244af2364ff,
0 x3207d795430cd927},
{
0 x8335616aed761f1f,
0 x7f44e6bd49e807b9},
{
0 xa402b9c5a8d3a6e7,
0 x5f16206c9c6209a7},
{
0 xcd036837130890a1,
0 x36dba887c37a8c10},
{
0 x802221226be55a64,
0 xc2494954da2c978a},
{
0 xa02aa96b06deb0fd,
0 xf2db9baa10b7bd6d},
{
0 xc83553c5c8965d3d,
0 x6f92829494e5acc8},
{
0 xfa42a8b73abbf48c,
0 xcb772339ba1f17fa},
{
0 x9c69a97284b578d7,
0 xff2a760414536efc},
{
0 xc38413cf25e2d70d,
0 xfef5138519684abb},
{
0 xf46518c2ef5b8cd1,
0 x7eb258665fc25d6a},
{
0 x98bf2f79d5993802,
0 xef2f773ffbd97a62},
{
0 xbeeefb584aff8603,
0 xaafb550ffacfd8fb},
{
0 xeeaaba2e5dbf6784,
0 x95ba2a53f983cf39},
{
0 x952ab45cfa97a0b2,
0 xdd945a747bf26184},
{
0 xba756174393d88df,
0 x94f971119aeef9e5},
{
0 xe912b9d1478ceb17,
0 x7a37cd5601aab85e},
{
0 x91abb422ccb812ee,
0 xac62e055c10ab33b},
{
0 xb616a12b7fe617aa,
0 x577b986b314d600a},
{
0 xe39c49765fdf9d94,
0 xed5a7e85fda0b80c},
{
0 x8e41ade9fbebc27d,
0 x14588f13be847308},
{
0 xb1d219647ae6b31c,
0 x596eb2d8ae258fc9},
{
0 xde469fbd99a05fe3,
0 x6fca5f8ed9aef3bc},
{
0 x8aec23d680043bee,
0 x25de7bb9480d5855},
{
0 xada72ccc20054ae9,
0 xaf561aa79a10ae6b},
{
0 xd910f7ff28069da4,
0 x1b2ba1518094da05},
{
0 x87aa9aff79042286,
0 x90fb44d2f05d0843},
{
0 xa99541bf57452b28,
0 x353a1607ac744a54},
{
0 xd3fa922f2d1675f2,
0 x42889b8997915ce9},
{
0 x847c9b5d7c2e09b7,
0 x69956135febada12},
{
0 xa59bc234db398c25,
0 x43fab9837e699096},
{
0 xcf02b2c21207ef2e,
0 x94f967e45e03f4bc},
{
0 x8161afb94b44f57d,
0 x1d1be0eebac278f6},
{
0 xa1ba1ba79e1632dc,
0 x6462d92a69731733},
{
0 xca28a291859bbf93,
0 x7d7b8f7503cfdcff},
{
0 xfcb2cb35e702af78,
0 x5cda735244c3d43f},
{
0 x9defbf01b061adab,
0 x3a0888136afa64a8},
{
0 xc56baec21c7a1916,
0 x088aaa1845b8fdd1},
{
0 xf6c69a72a3989f5b,
0 x8aad549e57273d46},
{
0 x9a3c2087a63f6399,
0 x36ac54e2f678864c},
{
0 xc0cb28a98fcf3c7f,
0 x84576a1bb416a7de},
{
0 xf0fdf2d3f3c30b9f,
0 x656d44a2a11c51d6},
{
0 x969eb7c47859e743,
0 x9f644ae5a4b1b326},
{
0 xbc4665b596706114,
0 x873d5d9f0dde1fef},
{
0 xeb57ff22fc0c7959,
0 xa90cb506d155a7eb},
{
0 x9316ff75dd87cbd8,
0 x09a7f12442d588f3},
{
0 xb7dcbf5354e9bece,
0 x0c11ed6d538aeb30},
{
0 xe5d3ef282a242e81,
0 x8f1668c8a86da5fb},
{
0 x8fa475791a569d10,
0 xf96e017d694487bd},
{
0 xb38d92d760ec4455,
0 x37c981dcc395a9ad},
{
0 xe070f78d3927556a,
0 x85bbe253f47b1418},
{
0 x8c469ab843b89562,
0 x93956d7478ccec8f},
{
0 xaf58416654a6babb,
0 x387ac8d1970027b3},
{
0 xdb2e51bfe9d0696a,
0 x06997b05fcc0319f},
{
0 x88fcf317f22241e2,
0 x441fece3bdf81f04},
{
0 xab3c2fddeeaad25a,
0 xd527e81cad7626c4},
{
0 xd60b3bd56a5586f1,
0 x8a71e223d8d3b075},
{
0 x85c7056562757456,
0 xf6872d5667844e4a},
{
0 xa738c6bebb12d16c,
0 xb428f8ac016561dc},
{
0 xd106f86e69d785c7,
0 xe13336d701beba53},
{
0 x82a45b450226b39c,
0 xecc0024661173474},
{
0 xa34d721642b06084,
0 x27f002d7f95d0191},
{
0 xcc20ce9bd35c78a5,
0 x31ec038df7b441f5},
{
0 xff290242c83396ce,
0 x7e67047175a15272},
{
0 x9f79a169bd203e41,
0 x0f0062c6e984d387},
{
0 xc75809c42c684dd1,
0 x52c07b78a3e60869},
{
0 xf92e0c3537826145,
0 xa7709a56ccdf8a83},
{
0 x9bbcc7a142b17ccb,
0 x88a66076400bb692},
{
0 xc2abf989935ddbfe,
0 x6acff893d00ea436},
{
0 xf356f7ebf83552fe,
0 x0583f6b8c4124d44},
{
0 x98165af37b2153de,
0 xc3727a337a8b704b},
{
0 xbe1bf1b059e9a8d6,
0 x744f18c0592e4c5d},
{
0 xeda2ee1c7064130c,
0 x1162def06f79df74},
{
0 x9485d4d1c63e8be7,
0 x8addcb5645ac2ba9},
{
0 xb9a74a0637ce2ee1,
0 x6d953e2bd7173693},
{
0 xe8111c87c5c1ba99,
0 xc8fa8db6ccdd0438},
{
0 x910ab1d4db9914a0,
0 x1d9c9892400a22a3},
{
0 xb54d5e4a127f59c8,
0 x2503beb6d00cab4c},
{
0 xe2a0b5dc971f303a,
0 x2e44ae64840fd61e},
{
0 x8da471a9de737e24,
0 x5ceaecfed289e5d3},
{
0 xb10d8e1456105dad,
0 x7425a83e872c5f48},
{
0 xdd50f1996b947518,
0 xd12f124e28f7771a},
{
0 x8a5296ffe33cc92f,
0 x82bd6b70d99aaa70},
{
0 xace73cbfdc0bfb7b,
0 x636cc64d1001550c},
{
0 xd8210befd30efa5a,
0 x3c47f7e05401aa4f},
{
0 x8714a775e3e95c78,
0 x65acfaec34810a72},
{
0 xa8d9d1535ce3b396,
0 x7f1839a741a14d0e},
{
0 xd31045a8341ca07c,
0 x1ede48111209a051},
{
0 x83ea2b892091e44d,
0 x934aed0aab460433},
{
0 xa4e4b66b68b65d60,
0 xf81da84d56178540},
{
0 xce1de40642e3f4b9,
0 x36251260ab9d668f},
{
0 x80d2ae83e9ce78f3,
0 xc1d72b7c6b42601a},
{
0 xa1075a24e4421730,
0 xb24cf65b8612f820},
{
0 xc94930ae1d529cfc,
0 xdee033f26797b628},
{
0 xfb9b7cd9a4a7443c,
0 x169840ef017da3b2},
{
0 x9d412e0806e88aa5,
0 x8e1f289560ee864f},
{
0 xc491798a08a2ad4e,
0 xf1a6f2bab92a27e3},
{
0 xf5b5d7ec8acb58a2,
0 xae10af696774b1dc},
{
0 x9991a6f3d6bf1765,
0 xacca6da1e0a8ef2a},
{
0 xbff610b0cc6edd3f,
0 x17fd090a58d32af4},
{
0 xeff394dcff8a948e,
0 xddfc4b4cef07f5b1},
{
0 x95f83d0a1fb69cd9,
0 x4abdaf101564f98f},
{
0 xbb764c4ca7a4440f,
0 x9d6d1ad41abe37f2},
{
0 xea53df5fd18d5513,
0 x84c86189216dc5ee},
{
0 x92746b9be2f8552c,
0 x32fd3cf5b4e49bb5},
{
0 xb7118682dbb66a77,
0 x3fbc8c33221dc2a2},
{
0 xe4d5e82392a40515,
0 x0fabaf3feaa5334b},
{
0 x8f05b1163ba6832d,
0 x29cb4d87f2a7400f},
{
0 xb2c71d5bca9023f8,
0 x743e20e9ef511013},
{
0 xdf78e4b2bd342cf6,
0 x914da9246b255417},
{
0 x8bab8eefb6409c1a,
0 x1ad089b6c2f7548f},
{
0 xae9672aba3d0c320,
0 xa184ac2473b529b2},
{
0 xda3c0f568cc4f3e8,
0 xc9e5d72d90a2741f},
{
0 x8865899617fb1871,
0 x7e2fa67c7a658893},
{
0 xaa7eebfb9df9de8d,
0 xddbb901b98feeab8},
{
0 xd51ea6fa85785631,
0 x552a74227f3ea566},
{
0 x8533285c936b35de,
0 xd53a88958f872760},
{
0 xa67ff273b8460356,
0 x8a892abaf368f138},
{
0 xd01fef10a657842c,
0 x2d2b7569b0432d86},
{
0 x8213f56a67f6b29b,
0 x9c3b29620e29fc74},
{
0 xa298f2c501f45f42,
0 x8349f3ba91b47b90},
{
0 xcb3f2f7642717713,
0 x241c70a936219a74},
{
0 xfe0efb53d30dd4d7,
0 xed238cd383aa0111},
{
0 x9ec95d1463e8a506,
0 xf4363804324a40ab},
{
0 xc67bb4597ce2ce48,
0 xb143c6053edcd0d6},
{
0 xf81aa16fdc1b81da,
0 xdd94b7868e94050b},
{
0 x9b10a4e5e9913128,
0 xca7cf2b4191c8327},
{
0 xc1d4ce1f63f57d72,
0 xfd1c2f611f63a3f1},
{
0 xf24a01a73cf2dccf,
0 xbc633b39673c8ced},
{
0 x976e41088617ca01,
0 xd5be0503e085d814},
{
0 xbd49d14aa79dbc82,
0 x4b2d8644d8a74e19},
{
0 xec9c459d51852ba2,
0 xddf8e7d60ed1219f},
{
0 x93e1ab8252f33b45,
0 xcabb90e5c942b504},
{
0 xb8da1662e7b00a17,
0 x3d6a751f3b936244},
{
0 xe7109bfba19c0c9d,
0 x0cc512670a783ad5},
{
0 x906a617d450187e2,
0 x27fb2b80668b24c6},
{
0 xb484f9dc9641e9da,
0 xb1f9f660802dedf7},
{
0 xe1a63853bbd26451,
0 x5e7873f8a0396974},
{
0 x8d07e33455637eb2,
0 xdb0b487b6423e1e9},
{
0 xb049dc016abc5e5f,
0 x91ce1a9a3d2cda63},
{
0 xdc5c5301c56b75f7,
0 x7641a140cc7810fc},
{
0 x89b9b3e11b6329ba,
0 xa9e904c87fcb0a9e},
{
0 xac2820d9623bf429,
0 x546345fa9fbdcd45},
{
0 xd732290fbacaf133,
0 xa97c177947ad4096},
{
0 x867f59a9d4bed6c0,
0 x49ed8eabcccc485e},
{
0 xa81f301449ee8c70,
0 x5c68f256bfff5a75},
{
0 xd226fc195c6a2f8c,
0 x73832eec6fff3112},
{
0 x83585d8fd9c25db7,
0 xc831fd53c5ff7eac},
{
0 xa42e74f3d032f525,
0 xba3e7ca8b77f5e56},
{
0 xcd3a1230c43fb26f,
0 x28ce1bd2e55f35ec},
{
0 x80444b5e7aa7cf85,
0 x7980d163cf5b81b4},
{
0 xa0555e361951c366,
0 xd7e105bcc3326220},
{
0 xc86ab5c39fa63440,
0 x8dd9472bf3fefaa8},
{
0 xfa856334878fc150,
0 xb14f98f6f0feb952},
{
0 x9c935e00d4b9d8d2,
0 x6ed1bf9a569f33d4},
{
0 xc3b8358109e84f07,
0 x0a862f80ec4700c9},
{
0 xf4a642e14c6262c8,
0 xcd27bb612758c0fb},
{
0 x98e7e9cccfbd7dbd,
0 x8038d51cb897789d},
{
0 xbf21e44003acdd2c,
0 xe0470a63e6bd56c4},
{
0 xeeea5d5004981478,
0 x1858ccfce06cac75},
{
0 x95527a5202df0ccb,
0 x0f37801e0c43ebc9},
{
0 xbaa718e68396cffd,
0 xd30560258f54e6bb},
{
0 xe950df20247c83fd,
0 x47c6b82ef32a206a},
{
0 x91d28b7416cdd27e,
0 x4cdc331d57fa5442},
{
0 xb6472e511c81471d,
0 xe0133fe4adf8e953},
{
0 xe3d8f9e563a198e5,
0 x58180fddd97723a7},
{
0 x8e679c2f5e44ff8f,
0 x570f09eaa7ea7649},
{
0 xb201833b35d63f73,
0 x2cd2cc6551e513db},
{
0 xde81e40a034bcf4f,
0 xf8077f7ea65e58d2},
{
0 x8b112e86420f6191,
0 xfb04afaf27faf783},
{
0 xadd57a27d29339f6,
0 x79c5db9af1f9b564},
{
0 xd94ad8b1c7380874,
0 x18375281ae7822bd},
{
0 x87cec76f1c830548,
0 x8f2293910d0b15b6},
{
0 xa9c2794ae3a3c69a,
0 xb2eb3875504ddb23},
{
0 xd433179d9c8cb841,
0 x5fa60692a46151ec},
{
0 x849feec281d7f328,
0 xdbc7c41ba6bcd334},
{
0 xa5c7ea73224deff3,
0 x12b9b522906c0801},
{
0 xcf39e50feae16bef,
0 xd768226b34870a01},
{
0 x81842f29f2cce375,
0 xe6a1158300d46641},
{
0 xa1e53af46f801c53,
0 x60495ae3c1097fd1},
{
0 xca5e89b18b602368,
0 x385bb19cb14bdfc5},
{
0 xfcf62c1dee382c42,
0 x46729e03dd9ed7b6},
{
0 x9e19db92b4e31ba9,
0 x6c07a2c26a8346d2},
{
0 xc5a05277621be293,
0 xc7098b7305241886},
{
0 xf70867153aa2db38,
0 xb8cbee4fc66d1ea8},
{
0 x9a65406d44a5c903,
0 x737f74f1dc043329},
{
0 xc0fe908895cf3b44,
0 x505f522e53053ff3},
{
0 xf13e34aabb430a15,
0 x647726b9e7c68ff0},
{
0 x96c6e0eab509e64d,
0 x5eca783430dc19f6},
{
0 xbc789925624c5fe0,
0 xb67d16413d132073},
{
0 xeb96bf6ebadf77d8,
0 xe41c5bd18c57e890},
{
0 x933e37a534cbaae7,
0 x8e91b962f7b6f15a},
{
0 xb80dc58e81fe95a1,
0 x723627bbb5a4adb1},
{
0 xe61136f2227e3b09,
0 xcec3b1aaa30dd91d},
{
0 x8fcac257558ee4e6,
0 x213a4f0aa5e8a7b2},
{
0 xb3bd72ed2af29e1f,
0 xa988e2cd4f62d19e},
{
0 xe0accfa875af45a7,
0 x93eb1b80a33b8606},
{
0 x8c6c01c9498d8b88,
0 xbc72f130660533c4},
{
0 xaf87023b9bf0ee6a,
0 xeb8fad7c7f8680b5},
{
0 xdb68c2ca82ed2a05,
0 xa67398db9f6820e2},
#else
{
0 xff77b1fcbebcdc4f,
0 x25e8e89c13bb0f7b},
{
0 xce5d73ff402d98e3,
0 xfb0a3d212dc81290},
{
0 xa6b34ad8c9dfc06f,
0 xf42faa48c0ea481f},
{
0 x86a8d39ef77164bc,
0 xae5dff9c02033198},
{
0 xd98ddaee19068c76,
0 x3badd624dd9b0958},
{
0 xafbd2350644eeacf,
0 xe5d1929ef90898fb},
{
0 x8df5efabc5979c8f,
0 xca8d3ffa1ef463c2},
{
0 xe55990879ddcaabd,
0 xcc420a6a101d0516},
{
0 xb94470938fa89bce,
0 xf808e40e8d5b3e6a},
{
0 x95a8637627989aad,
0 xdde7001379a44aa9},
{
0 xf1c90080baf72cb1,
0 x5324c68b12dd6339},
{
0 xc350000000000000,
0 x0000000000000000},
{
0 x9dc5ada82b70b59d,
0 xf020000000000000},
{
0 xfee50b7025c36a08,
0 x02f236d04753d5b5},
{
0 xcde6fd5e09abcf26,
0 xed4c0226b55e6f87},
{
0 xa6539930bf6bff45,
0 x84db8346b786151d},
{
0 x865b86925b9bc5c2,
0 x0b8a2392ba45a9b3},
{
0 xd910f7ff28069da4,
0 x1b2ba1518094da05},
{
0 xaf58416654a6babb,
0 x387ac8d1970027b3},
{
0 x8da471a9de737e24,
0 x5ceaecfed289e5d3},
{
0 xe4d5e82392a40515,
0 x0fabaf3feaa5334b},
{
0 xb8da1662e7b00a17,
0 x3d6a751f3b936244},
{
0 x95527a5202df0ccb,
0 x0f37801e0c43ebc9},
{
0 xf13e34aabb430a15,
0 x647726b9e7c68ff0}
#endif
};
#if FMT_USE_FULL_CACHE_DRAGONBOX
return pow10_significands[k - float_info<
double >::min_k];
#else
static constexpr
const uint64_t powers_of_5_64[] = {
0 x0000000000000001,
0 x0000000000000005,
0 x0000000000000019,
0 x000000000000007d,
0 x0000000000000271,
0 x0000000000000c35,
0 x0000000000003d09,
0 x000000000001312d,
0 x000000000005f5e1,
0 x00000000001dcd65,
0 x00000000009502f9,
0 x0000000002e90edd,
0 x000000000e8d4a51,
0 x0000000048c27395,
0 x000000016bcc41e9,
0 x000000071afd498d,
0 x0000002386f26fc1,
0 x000000b1a2bc2ec5,
0 x000003782dace9d9,
0 x00001158e460913d,
0 x000056bc75e2d631,
0 x0001b1ae4d6e2ef5,
0 x000878678326eac9,
0 x002a5a058fc295ed,
0 x00d3c21bcecceda1,
0 x0422ca8b0a00a425,
0 x14adf4b7320334b9};
static const int compression_ratio =
27 ;
// Compute base index.
int cache_index = (k - float_info<
double >::min_k) / compression_ratio;
int kb = cache_index * compression_ratio + float_info<
double >::min_k;
int offset = k - kb;
// Get base cache.
uint128_fallback base_cache = pow10_significands[cache_index];
if (offset ==
0 )
return base_cache;
// Compute the required amount of bit-shift.
int alpha = floor_log2_pow10(kb + offset) - floor_log2_pow10(kb) - offset;
FMT_ASSERT(alpha >
0 && alpha <
64 ,
"shifting error detected" );
// Try to recover the real cache.
uint64_t pow5 = powers_of_5_64[offset];
uint128_fallback recovered_cache = umul128(base_cache.high(), pow5);
uint128_fallback middle_low = umul128(base_cache.low(), pow5);
recovered_cache += middle_low.high();
uint64_t high_to_middle = recovered_cache.high() << (
64 - alpha);
uint64_t middle_to_low = recovered_cache.low() << (
64 - alpha);
recovered_cache =
uint128_fallback{(recovered_cache.low() >> alpha) | high_to_middle,
((middle_low.low() >> alpha) | middle_to_low)};
FMT_ASSERT(recovered_cache.low() +
1 !=
0 ,
"" );
return {recovered_cache.high(), recovered_cache.low() +
1 };
#endif
}
struct compute_mul_result {
carrier_uint result;
bool is_integer;
};
struct compute_mul_parity_result {
bool parity;
bool is_integer;
};
static auto compute_mul(carrier_uint u,
const cache_entry_type& cache) noexcept
-> compute_mul_result {
auto r = umul192_upper128(u, cache);
return {r.high(), r.low() ==
0 };
}
static auto compute_delta(cache_entry_type
const & cache,
int beta) noexcept
-> uint32_t {
return static_cast <uint32_t>(cache.high() >> (
64 -
1 - beta));
}
static auto compute_mul_parity(carrier_uint two_f,
const cache_entry_type& cache,
int beta) noexcept
-> compute_mul_parity_result {
FMT_ASSERT(beta >=
1 ,
"" );
FMT_ASSERT(beta <
64 ,
"" );
auto r = umul192_lower128(two_f, cache);
return {((r.high() >> (
64 - beta)) &
1 ) !=
0 ,
((r.high() << beta) | (r.low() >> (
64 - beta))) ==
0 };
}
static auto compute_left_endpoint_for_shorter_interval_case(
const cache_entry_type& cache,
int beta) noexcept -> carrier_uint {
return (cache.high() -
(cache.high() >> (num_significand_bits<
double >() +
2 ))) >>
(
64 - num_significand_bits<
double >() -
1 - beta);
}
static auto compute_right_endpoint_for_shorter_interval_case(
const cache_entry_type& cache,
int beta) noexcept -> carrier_uint {
return (cache.high() +
(cache.high() >> (num_significand_bits<
double >() +
1 ))) >>
(
64 - num_significand_bits<
double >() -
1 - beta);
}
static auto compute_round_up_for_shorter_interval_case(
const cache_entry_type& cache,
int beta) noexcept -> carrier_uint {
return ((cache.high() >> (
64 - num_significand_bits<
double >() -
2 - beta)) +
1 ) /
2 ;
}
};
FMT_FUNC
auto get_cached_power(
int k) noexcept -> uint128_fallback {
return cache_accessor<
double >::get_cached_power(k);
}
// Various integer checks
template <
typename T>
auto is_left_endpoint_integer_shorter_interval(
int exponent) noexcept ->
bool {
const int case_shorter_interval_left_endpoint_lower_threshold =
2 ;
const int case_shorter_interval_left_endpoint_upper_threshold =
3 ;
return exponent >= case_shorter_interval_left_endpoint_lower_threshold &&
exponent <= case_shorter_interval_left_endpoint_upper_threshold;
}
// Remove trailing zeros from n and return the number of zeros removed (float)
FMT_INLINE
int remove_trailing_zeros(uint32_t& n,
int s =
0 ) noexcept {
FMT_ASSERT(n !=
0 ,
"" );
// Modular inverse of 5 (mod 2^32): (mod_inv_5 * 5) mod 2^32 = 1.
constexpr uint32_t mod_inv_5 =
0 xcccccccd;
constexpr uint32_t mod_inv_25 =
0 xc28f5c29;
// = mod_inv_5 * mod_inv_5
while (
true ) {
auto q = rotr(n * mod_inv_25,
2 );
if (q > max_value<uint32_t>() /
100 )
break ;
n = q;
s +=
2 ;
}
auto q = rotr(n * mod_inv_5,
1 );
if (q <= max_value<uint32_t>() /
10 ) {
n = q;
s |=
1 ;
}
return s;
}
// Removes trailing zeros and returns the number of zeros removed (double)
FMT_INLINE
int remove_trailing_zeros(uint64_t& n) noexcept {
FMT_ASSERT(n !=
0 ,
"" );
// This magic number is ceil(2^90 / 10^8).
constexpr uint64_t magic_number =
12379400392853802749 ull;
auto nm = umul128(n, magic_number);
// Is n is divisible by 10^8?
if ((nm.high() & ((
1 ull << (
90 -
64 )) -
1 )) ==
0 && nm.low() < magic_number) {
// If yes, work with the quotient...
auto n32 =
static_cast <uint32_t>(nm.high() >> (
90 -
64 ));
// ... and use the 32 bit variant of the function
int s = remove_trailing_zeros(n32,
8 );
n = n32;
return s;
}
// If n is not divisible by 10^8, work with n itself.
constexpr uint64_t mod_inv_5 =
0 xcccccccccccccccd;
constexpr uint64_t mod_inv_25 =
0 x8f5c28f5c28f5c29;
// mod_inv_5 * mod_inv_5
int s =
0 ;
while (
true ) {
auto q = rotr(n * mod_inv_25,
2 );
if (q > max_value<uint64_t>() /
100 )
break ;
n = q;
s +=
2 ;
}
auto q = rotr(n * mod_inv_5,
1 );
if (q <= max_value<uint64_t>() /
10 ) {
n = q;
s |=
1 ;
}
return s;
}
// The main algorithm for shorter interval case
template <
typename T>
FMT_INLINE decimal_fp<T> shorter_interval_case(
int exponent) noexcept {
decimal_fp<T> ret_value;
// Compute k and beta
const int minus_k = floor_log10_pow2_minus_log10_4_over_3(exponent);
const int beta = exponent + floor_log2_pow10(-minus_k);
// Compute xi and zi
using cache_entry_type =
typename cache_accessor<T>::cache_entry_type;
const cache_entry_type cache = cache_accessor<T>::get_cached_power(-minus_k);
auto xi = cache_accessor<T>::compute_left_endpoint_for_shorter_interval_case(
cache, beta);
auto zi = cache_accessor<T>::compute_right_endpoint_for_shorter_interval_case(
cache, beta);
// If the left endpoint is not an integer, increase it
if (!is_left_endpoint_integer_shorter_interval<T>(exponent)) ++xi;
// Try bigger divisor
ret_value.significand = zi /
10 ;
// If succeed, remove trailing zeros if necessary and return
if (ret_value.significand *
10 >= xi) {
ret_value.exponent = minus_k +
1 ;
ret_value.exponent += remove_trailing_zeros(ret_value.significand);
return ret_value;
}
// Otherwise, compute the round-up of y
ret_value.significand =
cache_accessor<T>::compute_round_up_for_shorter_interval_case(cache,
beta);
ret_value.exponent = minus_k;
// When tie occurs, choose one of them according to the rule
if (exponent >= float_info<T>::shorter_interval_tie_lower_threshold &&
exponent <= float_info<T>::shorter_interval_tie_upper_threshold) {
ret_value.significand = ret_value.significand %
2 ==
0
? ret_value.significand
: ret_value.significand -
1 ;
}
else if (ret_value.significand < xi) {
++ret_value.significand;
}
return ret_value;
}
template <
typename T>
auto to_decimal(T x) noexcept -> decimal_fp<T> {
// Step 1: integer promotion & Schubfach multiplier calculation.
using carrier_uint =
typename float_info<T>::carrier_uint;
using cache_entry_type =
typename cache_accessor<T>::cache_entry_type;
auto br = bit_cast<carrier_uint>(x);
// Extract significand bits and exponent bits.
const carrier_uint significand_mask =
(
static_cast <carrier_uint>(
1 ) << num_significand_bits<T>()) -
1 ;
carrier_uint significand = (br & significand_mask);
int exponent =
static_cast <
int >((br & exponent_mask<T>()) >> num_significand_bits<T>());
if (exponent !=
0 ) {
// Check if normal.
exponent -= exponent_bias<T>() + num_significand_bits<T>();
// Shorter interval case; proceed like Schubfach.
// In fact, when exponent == 1 and significand == 0, the interval is
// regular. However, it can be shown that the end-results are anyway same.
if (significand ==
0 )
return shorter_interval_case<T>(exponent);
significand |= (
static_cast <carrier_uint>(
1 ) << num_significand_bits<T>());
}
else {
// Subnormal case; the interval is always regular.
if (significand ==
0 )
return {
0 ,
0 };
exponent =
std::numeric_limits<T>::min_exponent - num_significand_bits<T>() -
1 ;
}
const bool include_left_endpoint = (significand %
2 ==
0 );
const bool include_right_endpoint = include_left_endpoint;
// Compute k and beta.
const int minus_k = floor_log10_pow2(exponent) - float_info<T>::kappa;
const cache_entry_type cache = cache_accessor<T>::get_cached_power(-minus_k);
const int beta = exponent + floor_log2_pow10(-minus_k);
// Compute zi and deltai.
// 10^kappa <= deltai < 10^(kappa + 1)
const uint32_t deltai = cache_accessor<T>::compute_delta(cache, beta);
const carrier_uint two_fc = significand <<
1 ;
// For the case of binary32, the result of integer check is not correct for
// 29711844 * 2^-82
// = 6.1442653300000000008655037797566933477355632930994033813476... * 10^-18
// and 29711844 * 2^-81
// = 1.2288530660000000001731007559513386695471126586198806762695... * 10^-17,
// and they are the unique counterexamples. However, since 29711844 is even,
// this does not cause any problem for the endpoints calculations; it can only
// cause a problem when we need to perform integer check for the center.
// Fortunately, with these inputs, that branch is never executed, so we are
// fine.
const typename cache_accessor<T>::compute_mul_result z_mul =
cache_accessor<T>::compute_mul((two_fc |
1 ) << beta, cache);
// Step 2: Try larger divisor; remove trailing zeros if necessary.
// Using an upper bound on zi, we might be able to optimize the division
// better than the compiler; we are computing zi / big_divisor here.
decimal_fp<T> ret_value;
ret_value.significand = divide_by_10_to_kappa_plus_1(z_mul.result);
uint32_t r =
static_cast <uint32_t>(z_mul.result - float_info<T>::big_divisor *
ret_value.significand);
if (r < deltai) {
// Exclude the right endpoint if necessary.
if (r ==
0 && (z_mul.is_integer & !include_right_endpoint)) {
--ret_value.significand;
r = float_info<T>::big_divisor;
goto small_divisor_case_label;
}
}
else if (r > deltai) {
goto small_divisor_case_label;
}
else {
// r == deltai; compare fractional parts.
const typename cache_accessor<T>::compute_mul_parity_result x_mul =
cache_accessor<T>::compute_mul_parity(two_fc -
1 , cache, beta);
if (!(x_mul.parity | (x_mul.is_integer & include_left_endpoint)))
goto small_divisor_case_label;
}
ret_value.exponent = minus_k + float_info<T>::kappa +
1 ;
// We may need to remove trailing zeros.
ret_value.exponent += remove_trailing_zeros(ret_value.significand);
return ret_value;
// Step 3: Find the significand with the smaller divisor.
small_divisor_case_label:
ret_value.significand *=
10 ;
ret_value.exponent = minus_k + float_info<T>::kappa;
uint32_t dist = r - (deltai /
2 ) + (float_info<T>::small_divisor /
2 );
const bool approx_y_parity =
((dist ^ (float_info<T>::small_divisor /
2 )) &
1 ) !=
0 ;
// Is dist divisible by 10^kappa?
const bool divisible_by_small_divisor =
check_divisibility_and_divide_by_pow10<float_info<T>::kappa>(dist);
// Add dist / 10^kappa to the significand.
ret_value.significand += dist;
if (!divisible_by_small_divisor)
return ret_value;
// Check z^(f) >= epsilon^(f).
// We have either yi == zi - epsiloni or yi == (zi - epsiloni) - 1,
// where yi == zi - epsiloni if and only if z^(f) >= epsilon^(f).
// Since there are only 2 possibilities, we only need to care about the
// parity. Also, zi and r should have the same parity since the divisor
// is an even number.
const auto y_mul = cache_accessor<T>::compute_mul_parity(two_fc, cache, beta);
// If z^(f) >= epsilon^(f), we might have a tie when z^(f) == epsilon^(f),
// or equivalently, when y is an integer.
if (y_mul.parity != approx_y_parity)
--ret_value.significand;
else if (y_mul.is_integer & (ret_value.significand %
2 !=
0 ))
--ret_value.significand;
return ret_value;
}
}
// namespace dragonbox
}
// namespace detail
template <>
struct formatter<detail::bigint> {
FMT_CONSTEXPR
auto parse(format_parse_context& ctx)
-> format_parse_context::iterator {
return ctx.begin();
}
auto format(
const detail::bigint& n, format_context& ctx)
const
-> format_context::iterator {
auto out = ctx.out();
bool first =
true ;
for (
auto i = n.bigits_.size(); i >
0 ; --i) {
auto value = n.bigits_[i -
1 u];
if (first) {
out = fmt::format_to(out, FMT_STRING(
"{:x}" ), value);
first =
false ;
continue ;
}
out = fmt::format_to(out, FMT_STRING(
"{:08x}" ), value);
}
if (n.exp_ >
0 )
out = fmt::format_to(out, FMT_STRING(
"p{}" ),
n.exp_ * detail::bigint::bigit_bits);
return out;
}
};
FMT_FUNC detail::utf8_to_utf16::utf8_to_utf16(string_view s) {
for_each_codepoint(s, [
this ](uint32_t cp, string_view) {
if (cp == invalid_code_point) FMT_THROW(std::runtime_error(
"invalid utf8" ));
if (cp <=
0 xFFFF) {
buffer_.push_back(
static_cast <
wchar_t >(cp));
}
else {
cp -=
0 x10000;
buffer_.push_back(
static_cast <
wchar_t >(
0 xD800 + (cp >>
10 )));
buffer_.push_back(
static_cast <
wchar_t >(
0 xDC00 + (cp &
0 x3FF)));
}
return true ;
});
buffer_.push_back(
0 );
}
FMT_FUNC
void format_system_error(detail::buffer<
char >& out,
int error_code,
const char * message) noexcept {
// FMT_TRY {
// auto ec = std::error_code(error_code, std::generic_category());
// detail::write(appender(out), std::system_error(ec, message).what());
// return;
// }
// FMT_CATCH(...) {}
format_error_code(out, error_code, message);
}
FMT_FUNC
void report_system_error(
int error_code,
const char * message) noexcept {
do_report_error(format_system_error, error_code, message);
}
FMT_FUNC
auto vformat(string_view fmt, format_args args) -> std::string {
// Don't optimize the "{}" case to keep the binary size small and because it
// can be better optimized in fmt::format anyway.
auto buffer = memory_buffer();
detail::vformat_to(buffer, fmt, args);
return to_string(buffer);
}
namespace detail {
FMT_FUNC
void vformat_to(buffer<
char >& buf, string_view fmt, format_args args,
locale_ref loc) {
auto out = appender(buf);
if (fmt.size() ==
2 && equal2(fmt.data(),
"{}" ))
return args.get(
0 ).visit(default_arg_formatter<
char >{out});
parse_format_string(
fmt, format_handler<
char >{parse_context<
char >(fmt), {out, args, loc}});
}
template <
typename T>
struct span {
T* data;
size_t size;
};
template <
typename F>
auto flockfile(F* f) -> decltype(_lock_file(f)) {
_lock_file(f);
}
template <
typename F>
auto funlockfile(F* f) -> decltype(_unlock_file(f)) {
_unlock_file(f);
}
#ifndef getc_unlocked
template <
typename F>
auto getc_unlocked(F* f) -> decltype(_fgetc_nolock(f)) {
return _fgetc_nolock(f);
}
#endif
template <
typename F = FILE,
typename Enable =
void >
struct has_flockfile : std::false_type {};
template <
typename F>
struct has_flockfile<F, void_t<decltype(flockfile(&std::declval<F&>()))>>
: std::true_type {};
// A FILE wrapper. F is FILE defined as a template parameter to make system API
// detection work.
template <
typename F>
class file_base {
public :
F* file_;
public :
file_base(F* file) : file_(file) {}
operator F*()
const {
return file_; }
// Reads a code unit from the stream.
auto get() ->
int {
int result = getc_unlocked(file_);
if (result == EOF && ferror(file_) !=
0 )
FMT_THROW(system_error(errno, FMT_STRING(
"getc failed" )));
return result;
}
// Puts the code unit back into the stream buffer.
void unget(
char c) {
if (ungetc(c, file_) == EOF)
FMT_THROW(system_error(errno, FMT_STRING(
"ungetc failed" )));
}
void flush() { fflush(
this ->file_); }
};
// A FILE wrapper for glibc.
template <
typename F>
class glibc_file :
public file_base<F> {
private :
enum {
line_buffered =
0 x200,
// _IO_LINE_BUF
unbuffered =
2 // _IO_UNBUFFERED
};
public :
using file_base<F>::file_base;
auto is_buffered()
const ->
bool {
return (
this ->file_->_flags & unbuffered) ==
0 ;
}
void init_buffer() {
if (
this ->file_->_IO_write_ptr)
return ;
// Force buffer initialization by placing and removing a char in a buffer.
assume(
this ->file_->_IO_write_ptr >=
this ->file_->_IO_write_end);
putc_unlocked(
0 ,
this ->file_);
--
this ->file_->_IO_write_ptr;
}
// Returns the file's read buffer.
auto get_read_buffer()
const -> span<
const char > {
auto ptr =
this ->file_->_IO_read_ptr;
return {ptr, to_unsigned(
this ->file_->_IO_read_end - ptr)};
}
// Returns the file's write buffer.
auto get_write_buffer()
const -> span<
char > {
auto ptr =
this ->file_->_IO_write_ptr;
return {ptr, to_unsigned(
this ->file_->_IO_buf_end - ptr)};
}
void advance_write_buffer(size_t size) {
this ->file_->_IO_write_ptr += size; }
bool needs_flush()
const {
if ((
this ->file_->_flags & line_buffered) ==
0 )
return false ;
char * end =
this ->file_->_IO_write_end;
return memchr(end,
'\n' , to_unsigned(
this ->file_->_IO_write_ptr - end));
}
void flush() { fflush_unlocked(
this ->file_); }
};
// A FILE wrapper for Apple's libc.
template <
typename F>
class apple_file :
public file_base<F> {
private :
enum {
line_buffered =
1 ,
// __SNBF
unbuffered =
2 // __SLBF
};
public :
using file_base<F>::file_base;
auto is_buffered()
const ->
bool {
return (
this ->file_->_flags & unbuffered) ==
0 ;
}
void init_buffer() {
if (
this ->file_->_p)
return ;
// Force buffer initialization by placing and removing a char in a buffer.
putc_unlocked(
0 ,
this ->file_);
--
this ->file_->_p;
++
this ->file_->_w;
}
auto get_read_buffer()
const -> span<
const char > {
return {
reinterpret_cast <
char *>(
this ->file_->_p),
to_unsigned(
this ->file_->_r)};
}
auto get_write_buffer()
const -> span<
char > {
return {
reinterpret_cast <
char *>(
this ->file_->_p),
to_unsigned(
this ->file_->_bf._base +
this ->file_->_bf._size -
this ->file_->_p)};
}
void advance_write_buffer(size_t size) {
this ->file_->_p += size;
this ->file_->_w -= size;
}
bool needs_flush()
const {
if ((
this ->file_->_flags & line_buffered) ==
0 )
return false ;
return memchr(
this ->file_->_p +
this ->file_->_w,
'\n' ,
to_unsigned(-
this ->file_->_w));
}
};
// A fallback FILE wrapper.
template <
typename F>
class fallback_file :
public file_base<F> {
private :
char next_;
// The next unconsumed character in the buffer.
bool has_next_ =
false ;
public :
using file_base<F>::file_base;
auto is_buffered()
const ->
bool {
return false ; }
auto needs_flush()
const ->
bool {
return false ; }
void init_buffer() {}
auto get_read_buffer()
const -> span<
const char > {
return {&next_, has_next_ ?
1 u :
0 u};
}
auto get_write_buffer()
const -> span<
char > {
return {nullptr,
0 }; }
void advance_write_buffer(size_t) {}
auto get() ->
int {
has_next_ =
false ;
return file_base<F>::get();
}
void unget(
char c) {
file_base<F>::unget(c);
next_ = c;
has_next_ =
true ;
}
};
#ifndef FMT_USE_FALLBACK_FILE
# define FMT_USE_FALLBACK_FILE
0
#endif
template <
typename F,
FMT_ENABLE_IF(
sizeof (F::_p) !=
0 && !FMT_USE_FALLBACK_FILE)>
auto get_file(F* f,
int ) -> apple_file<F> {
return f;
}
template <
typename F,
FMT_ENABLE_IF(
sizeof (F::_IO_read_ptr) !=
0 && !FMT_USE_FALLBACK_FILE)>
inline auto get_file(F* f,
int ) -> glibc_file<F> {
return f;
}
inline auto get_file(FILE* f, ...) -> fallback_file<FILE> {
return f; }
using file_ref = decltype(get_file(
static_cast <FILE*>(nullptr),
0 ));
template <
typename F = FILE,
typename Enable =
void >
class file_print_buffer :
public buffer<
char > {
public :
explicit file_print_buffer(F*) : buffer(nullptr, size_t()) {}
};
template <
typename F>
class file_print_buffer<F, enable_if_t<has_flockfile<F>::value>>
:
public buffer<
char > {
private :
file_ref file_;
static void grow(buffer<
char >& base, size_t) {
auto & self =
static_cast <file_print_buffer&>(base);
self.file_.advance_write_buffer(self.size());
if (self.file_.get_write_buffer().size ==
0 ) self.file_.flush();
auto buf = self.file_.get_write_buffer();
FMT_ASSERT(buf.size >
0 ,
"" );
self.set(buf.data, buf.size);
self.clear();
}
public :
explicit file_print_buffer(F* f) : buffer(grow, size_t()), file_(f) {
flockfile(f);
file_.init_buffer();
auto buf = file_.get_write_buffer();
set(buf.data, buf.size);
}
~file_print_buffer() {
file_.advance_write_buffer(size());
bool flush = file_.needs_flush();
F* f = file_;
// Make funlockfile depend on the template parameter F
funlockfile(f);
// for the system API detection to work.
if (flush) fflush(file_);
}
};
#if !
defined (_WIN32) ||
defined (FMT_USE_WRITE_CONSOLE)
FMT_FUNC
auto write_console(
int , string_view) ->
bool {
return false ; }
#else
using dword = conditional_t<
sizeof (
long ) ==
4 ,
unsigned long ,
unsigned >;
extern "C" __declspec(dllimport)
int __stdcall WriteConsoleW(
//
void *,
const void *, dword, dword*,
void *);
FMT_FUNC
bool write_console(
int fd, string_view text) {
auto u16 = utf8_to_utf16(text);
return WriteConsoleW(
reinterpret_cast <
void *>(_get_osfhandle(fd)), u16.c_str(),
static_cast <dword>(u16.size()), nullptr, nullptr) !=
0 ;
}
#endif
#ifdef _WIN32
// Print assuming legacy (non-Unicode) encoding.
FMT_FUNC
void vprint_mojibake(std::FILE* f, string_view fmt, format_args args,
bool newline) {
auto buffer = memory_buffer();
detail::vformat_to(buffer, fmt, args);
if (newline) buffer.push_back(
'\n' );
fwrite_all(buffer.data(), buffer.size(), f);
}
#endif
FMT_FUNC
void print(std::FILE* f, string_view text) {
#if defined (_WIN32) && !
defined (FMT_USE_WRITE_CONSOLE)
int fd = _fileno(f);
if (_isatty(fd)) {
std::fflush(f);
if (write_console(fd, text))
return ;
}
#endif
fwrite_all(text.data(), text.size(), f);
}
}
// namespace detail
FMT_FUNC
void vprint_buffered(std::FILE* f, string_view fmt, format_args args) {
auto buffer = memory_buffer();
detail::vformat_to(buffer, fmt, args);
detail::print(f, {buffer.data(), buffer.size()});
}
FMT_FUNC
void vprint(std::FILE* f, string_view fmt, format_args args) {
if (!detail::file_ref(f).is_buffered() || !detail::has_flockfile<>())
return vprint_buffered(f, fmt, args);
auto && buffer = detail::file_print_buffer<>(f);
return detail::vformat_to(buffer, fmt, args);
}
FMT_FUNC
void vprintln(std::FILE* f, string_view fmt, format_args args) {
auto buffer = memory_buffer();
detail::vformat_to(buffer, fmt, args);
buffer.push_back(
'\n' );
detail::print(f, {buffer.data(), buffer.size()});
}
FMT_FUNC
void vprint(string_view fmt, format_args args) {
vprint(stdout, fmt, args);
}
namespace detail {
struct singleton {
unsigned char upper;
unsigned char lower_count;
};
inline auto is_printable(uint16_t x,
const singleton* singletons,
size_t singletons_size,
const unsigned char * singleton_lowers,
const unsigned char * normal, size_t normal_size)
->
bool {
auto upper = x >>
8 ;
auto lower_start =
0 ;
for (size_t i =
0 ; i < singletons_size; ++i) {
auto s = singletons[i];
auto lower_end = lower_start + s.lower_count;
if (upper < s.upper)
break ;
if (upper == s.upper) {
for (
auto j = lower_start; j < lower_end; ++j) {
if (singleton_lowers[j] == (x &
0 xff))
return false ;
}
}
lower_start = lower_end;
}
auto xsigned =
static_cast <
int >(x);
auto current =
true ;
for (size_t i =
0 ; i < normal_size; ++i) {
auto v =
static_cast <
int >(normal[i]);
auto len = (v &
0 x80) !=
0 ? (v &
0 x7f) <<
8 | normal[++i] : v;
xsigned -= len;
if (xsigned <
0 )
break ;
current = !current;
}
return current;
}
// This code is generated by support/printable.py.
FMT_FUNC
auto is_printable(uint32_t cp) ->
bool {
static constexpr singleton singletons0[] = {
{
0 x00,
1 }, {
0 x03,
5 }, {
0 x05,
6 }, {
0 x06,
3 }, {
0 x07,
6 }, {
0 x08,
8 },
{
0 x09,
17 }, {
0 x0a,
28 }, {
0 x0b,
25 }, {
0 x0c,
20 }, {
0 x0d,
16 }, {
0 x0e,
13 },
{
0 x0f,
4 }, {
0 x10,
3 }, {
0 x12,
18 }, {
0 x13,
9 }, {
0 x16,
1 }, {
0 x17,
5 },
{
0 x18,
2 }, {
0 x19,
3 }, {
0 x1a,
7 }, {
0 x1c,
2 }, {
0 x1d,
1 }, {
0 x1f,
22 },
{
0 x20,
3 }, {
0 x2b,
3 }, {
0 x2c,
2 }, {
0 x2d,
11 }, {
0 x2e,
1 }, {
0 x30,
3 },
{
0 x31,
2 }, {
0 x32,
1 }, {
0 xa7,
2 }, {
0 xa9,
2 }, {
0 xaa,
4 }, {
0 xab,
8 },
{
0 xfa,
2 }, {
0 xfb,
5 }, {
0 xfd,
4 }, {
0 xfe,
3 }, {
0 xff,
9 },
};
static constexpr
unsigned char singletons0_lower[] = {
0 xad,
0 x78,
0 x79,
0 x8b,
0 x8d,
0 xa2,
0 x30,
0 x57,
0 x58,
0 x8b,
0 x8c,
0 x90,
0 x1c,
0 x1d,
0 xdd,
0 x0e,
0 x0f,
0 x4b,
0 x4c,
0 xfb,
0 xfc,
0 x2e,
0 x2f,
0 x3f,
0 x5c,
0 x5d,
0 x5f,
0 xb5,
0 xe2,
0 x84,
0 x8d,
0 x8e,
0 x91,
0 x92,
0 xa9,
0 xb1,
0 xba,
0 xbb,
0 xc5,
0 xc6,
0 xc9,
0 xca,
0 xde,
0 xe4,
0 xe5,
0 xff,
0 x00,
0 x04,
0 x11,
0 x12,
0 x29,
0 x31,
0 x34,
0 x37,
0 x3a,
0 x3b,
0 x3d,
0 x49,
0 x4a,
0 x5d,
0 x84,
0 x8e,
0 x92,
0 xa9,
0 xb1,
0 xb4,
0 xba,
0 xbb,
0 xc6,
0 xca,
0 xce,
0 xcf,
0 xe4,
0 xe5,
0 x00,
0 x04,
0 x0d,
0 x0e,
0 x11,
0 x12,
0 x29,
0 x31,
0 x34,
0 x3a,
0 x3b,
0 x45,
0 x46,
0 x49,
0 x4a,
0 x5e,
0 x64,
0 x65,
0 x84,
0 x91,
0 x9b,
0 x9d,
0 xc9,
0 xce,
0 xcf,
0 x0d,
0 x11,
0 x29,
0 x45,
0 x49,
0 x57,
0 x64,
0 x65,
0 x8d,
0 x91,
0 xa9,
0 xb4,
0 xba,
0 xbb,
0 xc5,
0 xc9,
0 xdf,
0 xe4,
0 xe5,
0 xf0,
0 x0d,
0 x11,
0 x45,
0 x49,
0 x64,
0 x65,
0 x80,
0 x84,
0 xb2,
0 xbc,
0 xbe,
0 xbf,
0 xd5,
0 xd7,
0 xf0,
0 xf1,
0 x83,
0 x85,
0 x8b,
0 xa4,
0 xa6,
0 xbe,
0 xbf,
0 xc5,
0 xc7,
0 xce,
0 xcf,
0 xda,
0 xdb,
0 x48,
0 x98,
0 xbd,
0 xcd,
0 xc6,
0 xce,
0 xcf,
0 x49,
0 x4e,
0 x4f,
0 x57,
0 x59,
0 x5e,
0 x5f,
0 x89,
0 x8e,
0 x8f,
0 xb1,
0 xb6,
0 xb7,
0 xbf,
0 xc1,
0 xc6,
0 xc7,
0 xd7,
0 x11,
0 x16,
0 x17,
0 x5b,
0 x5c,
0 xf6,
0 xf7,
0 xfe,
0 xff,
0 x80,
0 x0d,
0 x6d,
0 x71,
0 xde,
0 xdf,
0 x0e,
0 x0f,
0 x1f,
0 x6e,
0 x6f,
0 x1c,
0 x1d,
0 x5f,
0 x7d,
0 x7e,
0 xae,
0 xaf,
0 xbb,
0 xbc,
0 xfa,
0 x16,
0 x17,
0 x1e,
0 x1f,
0 x46,
0 x47,
0 x4e,
0 x4f,
0 x58,
0 x5a,
0 x5c,
0 x5e,
0 x7e,
0 x7f,
0 xb5,
0 xc5,
0 xd4,
0 xd5,
0 xdc,
0 xf0,
0 xf1,
0 xf5,
0 x72,
0 x73,
0 x8f,
0 x74,
0 x75,
0 x96,
0 x2f,
0 x5f,
0 x26,
0 x2e,
0 x2f,
0 xa7,
0 xaf,
0 xb7,
0 xbf,
0 xc7,
0 xcf,
0 xd7,
0 xdf,
0 x9a,
0 x40,
0 x97,
0 x98,
0 x30,
0 x8f,
0 x1f,
0 xc0,
0 xc1,
0 xce,
0 xff,
0 x4e,
0 x4f,
0 x5a,
0 x5b,
0 x07,
0 x08,
0 x0f,
0 x10,
0 x27,
0 x2f,
0 xee,
0 xef,
0 x6e,
0 x6f,
0 x37,
0 x3d,
0 x3f,
0 x42,
0 x45,
0 x90,
0 x91,
0 xfe,
0 xff,
0 x53,
0 x67,
0 x75,
0 xc8,
0 xc9,
0 xd0,
0 xd1,
0 xd8,
0 xd9,
0 xe7,
0 xfe,
0 xff,
};
static constexpr singleton singletons1[] = {
{
0 x00,
6 }, {
0 x01,
1 }, {
0 x03,
1 }, {
0 x04,
2 }, {
0 x08,
8 }, {
0 x09,
2 },
{
0 x0a,
5 }, {
0 x0b,
2 }, {
0 x0e,
4 }, {
0 x10,
1 }, {
0 x11,
2 }, {
0 x12,
5 },
{
0 x13,
17 }, {
0 x14,
1 }, {
0 x15,
2 }, {
0 x17,
2 }, {
0 x19,
13 }, {
0 x1c,
5 },
{
0 x1d,
8 }, {
0 x24,
1 }, {
0 x6a,
3 }, {
0 x6b,
2 }, {
0 xbc,
2 }, {
0 xd1,
2 },
{
0 xd4,
12 }, {
0 xd5,
9 }, {
0 xd6,
2 }, {
0 xd7,
2 }, {
0 xda,
1 }, {
0 xe0,
5 },
{
0 xe1,
2 }, {
0 xe8,
2 }, {
0 xee,
32 }, {
0 xf0,
4 }, {
0 xf8,
2 }, {
0 xf9,
2 },
{
0 xfa,
2 }, {
0 xfb,
1 },
};
static constexpr
unsigned char singletons1_lower[] = {
0 x0c,
0 x27,
0 x3b,
0 x3e,
0 x4e,
0 x4f,
0 x8f,
0 x9e,
0 x9e,
0 x9f,
0 x06,
0 x07,
0 x09,
0 x36,
0 x3d,
0 x3e,
0 x56,
0 xf3,
0 xd0,
0 xd1,
0 x04,
0 x14,
0 x18,
0 x36,
0 x37,
0 x56,
0 x57,
0 x7f,
0 xaa,
0 xae,
0 xaf,
0 xbd,
0 x35,
0 xe0,
0 x12,
0 x87,
0 x89,
0 x8e,
0 x9e,
0 x04,
0 x0d,
0 x0e,
0 x11,
0 x12,
0 x29,
0 x31,
0 x34,
0 x3a,
0 x45,
0 x46,
0 x49,
0 x4a,
0 x4e,
0 x4f,
0 x64,
0 x65,
0 x5c,
0 xb6,
0 xb7,
0 x1b,
0 x1c,
0 x07,
0 x08,
0 x0a,
0 x0b,
0 x14,
0 x17,
0 x36,
0 x39,
0 x3a,
0 xa8,
0 xa9,
0 xd8,
0 xd9,
0 x09,
0 x37,
0 x90,
0 x91,
0 xa8,
0 x07,
0 x0a,
0 x3b,
0 x3e,
0 x66,
0 x69,
0 x8f,
0 x92,
0 x6f,
0 x5f,
0 xee,
0 xef,
0 x5a,
0 x62,
0 x9a,
0 x9b,
0 x27,
0 x28,
0 x55,
0 x9d,
0 xa0,
0 xa1,
0 xa3,
0 xa4,
0 xa7,
0 xa8,
0 xad,
0 xba,
0 xbc,
0 xc4,
0 x06,
0 x0b,
0 x0c,
0 x15,
0 x1d,
0 x3a,
0 x3f,
0 x45,
0 x51,
0 xa6,
0 xa7,
0 xcc,
0 xcd,
0 xa0,
0 x07,
0 x19,
0 x1a,
0 x22,
0 x25,
0 x3e,
0 x3f,
0 xc5,
0 xc6,
0 x04,
0 x20,
0 x23,
0 x25,
0 x26,
0 x28,
0 x33,
0 x38,
0 x3a,
0 x48,
0 x4a,
0 x4c,
0 x50,
0 x53,
0 x55,
0 x56,
0 x58,
0 x5a,
0 x5c,
0 x5e,
0 x60,
0 x63,
0 x65,
0 x66,
0 x6b,
0 x73,
0 x78,
0 x7d,
0 x7f,
0 x8a,
0 xa4,
0 xaa,
0 xaf,
0 xb0,
0 xc0,
0 xd0,
0 xae,
0 xaf,
0 x79,
0 xcc,
0 x6e,
0 x6f,
0 x93,
};
static constexpr
unsigned char normal0[] = {
0 x00,
0 x20,
0 x5f,
0 x22,
0 x82,
0 xdf,
0 x04,
0 x82,
0 x44,
0 x08,
0 x1b,
0 x04,
0 x06,
0 x11,
0 x81,
0 xac,
0 x0e,
0 x80,
0 xab,
0 x35,
0 x28,
0 x0b,
0 x80,
0 xe0,
0 x03,
0 x19,
0 x08,
0 x01,
0 x04,
0 x2f,
0 x04,
0 x34,
0 x04,
0 x07,
0 x03,
0 x01,
0 x07,
0 x06,
0 x07,
0 x11,
0 x0a,
0 x50,
0 x0f,
0 x12,
0 x07,
0 x55,
0 x07,
0 x03,
0 x04,
0 x1c,
0 x0a,
0 x09,
0 x03,
0 x08,
0 x03,
0 x07,
0 x03,
0 x02,
0 x03,
0 x03,
0 x03,
0 x0c,
0 x04,
0 x05,
0 x03,
0 x0b,
0 x06,
0 x01,
0 x0e,
0 x15,
0 x05,
0 x3a,
0 x03,
0 x11,
0 x07,
0 x06,
0 x05,
0 x10,
0 x07,
0 x57,
0 x07,
0 x02,
0 x07,
0 x15,
0 x0d,
0 x50,
0 x04,
0 x43,
0 x03,
0 x2d,
0 x03,
0 x01,
0 x04,
0 x11,
0 x06,
0 x0f,
0 x0c,
0 x3a,
0 x04,
0 x1d,
0 x25,
0 x5f,
0 x20,
0 x6d,
0 x04,
0 x6a,
0 x25,
0 x80,
0 xc8,
0 x05,
0 x82,
0 xb0,
0 x03,
0 x1a,
0 x06,
0 x82,
0 xfd,
0 x03,
0 x59,
0 x07,
0 x15,
0 x0b,
0 x17,
0 x09,
0 x14,
0 x0c,
0 x14,
0 x0c,
0 x6a,
0 x06,
0 x0a,
0 x06,
0 x1a,
0 x06,
0 x59,
0 x07,
0 x2b,
0 x05,
0 x46,
0 x0a,
0 x2c,
0 x04,
0 x0c,
0 x04,
0 x01,
0 x03,
0 x31,
0 x0b,
0 x2c,
0 x04,
0 x1a,
0 x06,
0 x0b,
0 x03,
0 x80,
0 xac,
0 x06,
0 x0a,
0 x06,
0 x21,
0 x3f,
0 x4c,
0 x04,
0 x2d,
0 x03,
0 x74,
0 x08,
0 x3c,
0 x03,
0 x0f,
0 x03,
0 x3c,
0 x07,
0 x38,
0 x08,
0 x2b,
0 x05,
0 x82,
0 xff,
0 x11,
0 x18,
0 x08,
0 x2f,
0 x11,
0 x2d,
0 x03,
0 x20,
0 x10,
0 x21,
0 x0f,
0 x80,
0 x8c,
0 x04,
0 x82,
0 x97,
0 x19,
0 x0b,
0 x15,
0 x88,
0 x94,
0 x05,
0 x2f,
0 x05,
0 x3b,
0 x07,
0 x02,
0 x0e,
0 x18,
0 x09,
0 x80,
0 xb3,
0 x2d,
0 x74,
0 x0c,
0 x80,
0 xd6,
0 x1a,
0 x0c,
0 x05,
0 x80,
0 xff,
0 x05,
0 x80,
0 xdf,
0 x0c,
0 xee,
0 x0d,
0 x03,
0 x84,
0 x8d,
0 x03,
0 x37,
0 x09,
0 x81,
0 x5c,
0 x14,
0 x80,
0 xb8,
0 x08,
0 x80,
0 xcb,
0 x2a,
0 x38,
0 x03,
0 x0a,
0 x06,
0 x38,
0 x08,
0 x46,
0 x08,
0 x0c,
0 x06,
0 x74,
0 x0b,
0 x1e,
0 x03,
0 x5a,
0 x04,
0 x59,
0 x09,
0 x80,
0 x83,
0 x18,
0 x1c,
0 x0a,
0 x16,
0 x09,
0 x4c,
0 x04,
0 x80,
0 x8a,
0 x06,
0 xab,
0 xa4,
0 x0c,
0 x17,
0 x04,
0 x31,
0 xa1,
0 x04,
0 x81,
0 xda,
0 x26,
0 x07,
0 x0c,
0 x05,
0 x05,
0 x80,
0 xa5,
0 x11,
0 x81,
0 x6d,
0 x10,
0 x78,
0 x28,
0 x2a,
0 x06,
0 x4c,
0 x04,
0 x80,
0 x8d,
0 x04,
0 x80,
0 xbe,
0 x03,
0 x1b,
0 x03,
0 x0f,
0 x0d,
};
static constexpr
unsigned char normal1[] = {
0 x5e,
0 x22,
0 x7b,
0 x05,
0 x03,
0 x04,
0 x2d,
0 x03,
0 x66,
0 x03,
0 x01,
0 x2f,
0 x2e,
0 x80,
0 x82,
0 x1d,
0 x03,
0 x31,
0 x0f,
0 x1c,
0 x04,
0 x24,
0 x09,
0 x1e,
0 x05,
0 x2b,
0 x05,
0 x44,
0 x04,
0 x0e,
0 x2a,
0 x80,
0 xaa,
0 x06,
0 x24,
0 x04,
0 x24,
0 x04,
0 x28,
0 x08,
0 x34,
0 x0b,
0 x01,
0 x80,
0 x90,
0 x81,
0 x37,
0 x09,
0 x16,
0 x0a,
0 x08,
0 x80,
0 x98,
0 x39,
0 x03,
0 x63,
0 x08,
0 x09,
0 x30,
0 x16,
0 x05,
0 x21,
0 x03,
0 x1b,
0 x05,
0 x01,
0 x40,
0 x38,
0 x04,
0 x4b,
0 x05,
0 x2f,
0 x04,
0 x0a,
0 x07,
0 x09,
0 x07,
0 x40,
0 x20,
0 x27,
0 x04,
0 x0c,
0 x09,
0 x36,
0 x03,
0 x3a,
0 x05,
0 x1a,
0 x07,
0 x04,
0 x0c,
0 x07,
0 x50,
0 x49,
0 x37,
0 x33,
0 x0d,
0 x33,
0 x07,
0 x2e,
0 x08,
0 x0a,
0 x81,
0 x26,
0 x52,
0 x4e,
0 x28,
0 x08,
0 x2a,
0 x56,
0 x1c,
0 x14,
0 x17,
0 x09,
0 x4e,
0 x04,
0 x1e,
0 x0f,
0 x43,
0 x0e,
0 x19,
0 x07,
0 x0a,
0 x06,
0 x48,
0 x08,
0 x27,
0 x09,
0 x75,
0 x0b,
0 x3f,
0 x41,
0 x2a,
0 x06,
0 x3b,
0 x05,
0 x0a,
0 x06,
0 x51,
0 x06,
0 x01,
0 x05,
0 x10,
0 x03,
0 x05,
0 x80,
0 x8b,
0 x62,
0 x1e,
0 x48,
0 x08,
0 x0a,
0 x80,
0 xa6,
0 x5e,
0 x22,
0 x45,
0 x0b,
0 x0a,
0 x06,
0 x0d,
0 x13,
0 x39,
0 x07,
0 x0a,
0 x36,
0 x2c,
0 x04,
0 x10,
0 x80,
0 xc0,
0 x3c,
0 x64,
0 x53,
0 x0c,
0 x48,
0 x09,
0 x0a,
0 x46,
0 x45,
0 x1b,
0 x48,
0 x08,
0 x53,
0 x1d,
0 x39,
0 x81,
0 x07,
0 x46,
0 x0a,
0 x1d,
0 x03,
0 x47,
0 x49,
0 x37,
0 x03,
0 x0e,
0 x08,
0 x0a,
0 x06,
0 x39,
0 x07,
0 x0a,
0 x81,
0 x36,
0 x19,
0 x80,
0 xb7,
0 x01,
0 x0f,
0 x32,
0 x0d,
0 x83,
0 x9b,
0 x66,
0 x75,
0 x0b,
0 x80,
0 xc4,
0 x8a,
0 xbc,
0 x84,
0 x2f,
0 x8f,
0 xd1,
0 x82,
0 x47,
0 xa1,
0 xb9,
0 x82,
0 x39,
0 x07,
0 x2a,
0 x04,
0 x02,
0 x60,
0 x26,
0 x0a,
0 x46,
0 x0a,
0 x28,
0 x05,
0 x13,
0 x82,
0 xb0,
0 x5b,
0 x65,
0 x4b,
0 x04,
0 x39,
0 x07,
0 x11,
0 x40,
0 x05,
0 x0b,
0 x02,
0 x0e,
0 x97,
0 xf8,
0 x08,
0 x84,
0 xd6,
0 x2a,
0 x09,
0 xa2,
0 xf7,
0 x81,
0 x1f,
0 x31,
0 x03,
0 x11,
0 x04,
0 x08,
0 x81,
0 x8c,
0 x89,
0 x04,
0 x6b,
0 x05,
0 x0d,
0 x03,
0 x09,
0 x07,
0 x10,
0 x93,
0 x60,
0 x80,
0 xf6,
0 x0a,
0 x73,
0 x08,
0 x6e,
0 x17,
0 x46,
0 x80,
0 x9a,
0 x14,
0 x0c,
0 x57,
0 x09,
0 x19,
0 x80,
0 x87,
0 x81,
0 x47,
0 x03,
0 x85,
0 x42,
0 x0f,
0 x15,
0 x85,
0 x50,
0 x2b,
0 x80,
0 xd5,
0 x2d,
0 x03,
0 x1a,
0 x04,
0 x02,
0 x81,
0 x70,
0 x3a,
0 x05,
0 x01,
0 x85,
0 x00,
0 x80,
0 xd7,
0 x29,
0 x4c,
0 x04,
0 x0a,
0 x04,
0 x02,
0 x83,
0 x11,
0 x44,
0 x4c,
0 x3d,
0 x80,
0 xc2,
0 x3c,
0 x06,
0 x01,
0 x04,
0 x55,
0 x05,
0 x1b,
0 x34,
0 x02,
0 x81,
0 x0e,
0 x2c,
0 x04,
0 x64,
0 x0c,
0 x56,
0 x0a,
0 x80,
0 xae,
0 x38,
0 x1d,
0 x0d,
0 x2c,
0 x04,
0 x09,
0 x07,
0 x02,
0 x0e,
0 x06,
0 x80,
0 x9a,
0 x83,
0 xd8,
0 x08,
0 x0d,
0 x03,
0 x0d,
0 x03,
0 x74,
0 x0c,
0 x59,
0 x07,
0 x0c,
0 x14,
0 x0c,
0 x04,
0 x38,
0 x08,
0 x0a,
0 x06,
0 x28,
0 x08,
0 x22,
0 x4e,
0 x81,
0 x54,
0 x0c,
0 x15,
0 x03,
0 x03,
0 x05,
0 x07,
0 x09,
0 x19,
0 x07,
0 x07,
0 x09,
0 x03,
0 x0d,
0 x07,
0 x29,
0 x80,
0 xcb,
0 x25,
0 x0a,
0 x84,
0 x06,
};
auto lower =
static_cast <uint16_t>(cp);
if (cp <
0 x10000) {
return is_printable(lower, singletons0,
sizeof (singletons0) /
sizeof (*singletons0),
singletons0_lower, normal0,
sizeof (normal0));
}
if (cp <
0 x20000) {
return is_printable(lower, singletons1,
sizeof (singletons1) /
sizeof (*singletons1),
singletons1_lower, normal1,
sizeof (normal1));
}
if (
0 x2a6de <= cp && cp <
0 x2a700)
return false ;
if (
0 x2b735 <= cp && cp <
0 x2b740)
return false ;
if (
0 x2b81e <= cp && cp <
0 x2b820)
return false ;
if (
0 x2cea2 <= cp && cp <
0 x2ceb0)
return false ;
if (
0 x2ebe1 <= cp && cp <
0 x2f800)
return false ;
if (
0 x2fa1e <= cp && cp <
0 x30000)
return false ;
if (
0 x3134b <= cp && cp <
0 xe0100)
return false ;
if (
0 xe01f0 <= cp && cp <
0 x110000)
return false ;
return cp <
0 x110000;
}
}
// namespace detail
FMT_END_NAMESPACE
#endif // FMT_FORMAT_INL_H_
Messung V0.5 in Prozent C=92 H=98 G=94
¤ Dauer der Verarbeitung: 0.35 Sekunden
(vorverarbeitet am 2026-06-10)
¤
*© Formatika GbR, Deutschland