1 // Formatting library for C++ - implementation
3 // Copyright (c) 2012 - 2016, Victor Zverovich
4 // All rights reserved.
6 // For the license information refer to format.h.
8 #ifndef FMT_FORMAT_INL_H_
9 #define FMT_FORMAT_INL_H_
12 #include <cerrno> // errno
17 #ifndef FMT_STATIC_THOUSANDS_SEPARATOR
22 # include <io.h> // _isatty
30 FMT_FUNC
void assert_fail(const char* file
, int line
, const char* message
) {
31 // Use unchecked std::fprintf to avoid triggering another assertion when
32 // writing to stderr fails
33 std::fprintf(stderr
, "%s:%d: assertion failed: %s", file
, line
, message
);
34 // Chosen instead of std::abort to satisfy Clang in CUDA mode during device
39 FMT_FUNC
void throw_format_error(const char* message
) {
40 FMT_THROW(format_error(message
));
43 FMT_FUNC
void format_error_code(detail::buffer
<char>& out
, int error_code
,
44 string_view message
) noexcept
{
45 // Report error code making sure that the output fits into
46 // inline_buffer_size to avoid dynamic memory allocation and potential
49 static const char SEP
[] = ": ";
50 static const char ERROR_STR
[] = "error ";
51 // Subtract 2 to account for terminating null characters in SEP and ERROR_STR.
52 size_t error_code_size
= sizeof(SEP
) + sizeof(ERROR_STR
) - 2;
53 auto abs_value
= static_cast<uint32_or_64_or_128_t
<int>>(error_code
);
54 if (detail::is_negative(error_code
)) {
55 abs_value
= 0 - abs_value
;
58 error_code_size
+= detail::to_unsigned(detail::count_digits(abs_value
));
59 auto it
= buffer_appender
<char>(out
);
60 if (message
.size() <= inline_buffer_size
- error_code_size
)
61 format_to(it
, FMT_STRING("{}{}"), message
, SEP
);
62 format_to(it
, FMT_STRING("{}{}"), ERROR_STR
, error_code
);
63 FMT_ASSERT(out
.size() <= inline_buffer_size
, "");
66 FMT_FUNC
void report_error(format_func func
, int error_code
,
67 const char* message
) noexcept
{
68 memory_buffer full_message
;
69 func(full_message
, error_code
, message
);
70 // Don't use fwrite_fully because the latter may throw.
71 if (std::fwrite(full_message
.data(), full_message
.size(), 1, stderr
) > 0)
72 std::fputc('\n', stderr
);
75 // A wrapper around fwrite that throws on error.
76 inline void fwrite_fully(const void* ptr
, size_t size
, size_t count
,
78 size_t written
= std::fwrite(ptr
, size
, count
, stream
);
80 FMT_THROW(system_error(errno
, FMT_STRING("cannot write to file")));
83 #ifndef FMT_STATIC_THOUSANDS_SEPARATOR
84 template <typename Locale
>
85 locale_ref::locale_ref(const Locale
& loc
) : locale_(&loc
) {
86 static_assert(std::is_same
<Locale
, std::locale
>::value
, "");
89 template <typename Locale
> Locale
locale_ref::get() const {
90 static_assert(std::is_same
<Locale
, std::locale
>::value
, "");
91 return locale_
? *static_cast<const std::locale
*>(locale_
) : std::locale();
94 template <typename Char
>
95 FMT_FUNC
auto thousands_sep_impl(locale_ref loc
) -> thousands_sep_result
<Char
> {
96 auto& facet
= std::use_facet
<std::numpunct
<Char
>>(loc
.get
<std::locale
>());
97 auto grouping
= facet
.grouping();
98 auto thousands_sep
= grouping
.empty() ? Char() : facet
.thousands_sep();
99 return {std::move(grouping
), thousands_sep
};
101 template <typename Char
> FMT_FUNC Char
decimal_point_impl(locale_ref loc
) {
102 return std::use_facet
<std::numpunct
<Char
>>(loc
.get
<std::locale
>())
106 template <typename Char
>
107 FMT_FUNC
auto thousands_sep_impl(locale_ref
) -> thousands_sep_result
<Char
> {
108 return {"\03", FMT_STATIC_THOUSANDS_SEPARATOR
};
110 template <typename Char
> FMT_FUNC Char
decimal_point_impl(locale_ref
) {
115 FMT_FUNC
auto write_loc(appender out
, loc_value value
,
116 const format_specs
<>& specs
, locale_ref loc
) -> bool {
117 #ifndef FMT_STATIC_THOUSANDS_SEPARATOR
118 auto locale
= loc
.get
<std::locale
>();
119 // We cannot use the num_put<char> facet because it may produce output in
121 using facet
= format_facet
<std::locale
>;
122 if (std::has_facet
<facet
>(locale
))
123 return std::use_facet
<facet
>(locale
).put(out
, value
, specs
);
124 return facet(locale
).put(out
, value
, specs
);
128 } // namespace detail
130 template <typename Locale
> typename
Locale::id format_facet
<Locale
>::id
;
132 #ifndef FMT_STATIC_THOUSANDS_SEPARATOR
133 template <typename Locale
> format_facet
<Locale
>::format_facet(Locale
& loc
) {
134 auto& numpunct
= std::use_facet
<std::numpunct
<char>>(loc
);
135 grouping_
= numpunct
.grouping();
136 if (!grouping_
.empty()) separator_
= std::string(1, numpunct
.thousands_sep());
140 FMT_API FMT_FUNC
auto format_facet
<std::locale
>::do_put(
141 appender out
, loc_value val
, const format_specs
<>& specs
) const -> bool {
143 detail::loc_writer
<>{out
, specs
, separator_
, grouping_
, decimal_point_
});
147 FMT_FUNC
std::system_error
vsystem_error(int error_code
, string_view fmt
,
149 auto ec
= std::error_code(error_code
, std::generic_category());
150 return std::system_error(ec
, vformat(fmt
, args
));
155 template <typename F
> inline bool operator==(basic_fp
<F
> x
, basic_fp
<F
> y
) {
156 return x
.f
== y
.f
&& x
.e
== y
.e
;
159 // Compilers should be able to optimize this into the ror instruction.
160 FMT_CONSTEXPR
inline uint32_t rotr(uint32_t n
, uint32_t r
) noexcept
{
162 return (n
>> r
) | (n
<< (32 - r
));
164 FMT_CONSTEXPR
inline uint64_t rotr(uint64_t n
, uint32_t r
) noexcept
{
166 return (n
>> r
) | (n
<< (64 - r
));
169 // Implementation of Dragonbox algorithm: https://github.com/jk-jeon/dragonbox.
170 namespace dragonbox
{
171 // Computes upper 64 bits of multiplication of a 32-bit unsigned integer and a
172 // 64-bit unsigned integer.
173 inline uint64_t umul96_upper64(uint32_t x
, uint64_t y
) noexcept
{
174 return umul128_upper64(static_cast<uint64_t>(x
) << 32, y
);
177 // Computes lower 128 bits of multiplication of a 64-bit unsigned integer and a
178 // 128-bit unsigned integer.
179 inline uint128_fallback
umul192_lower128(uint64_t x
,
180 uint128_fallback y
) noexcept
{
181 uint64_t high
= x
* y
.high();
182 uint128_fallback high_low
= umul128(x
, y
.low());
183 return {high
+ high_low
.high(), high_low
.low()};
186 // Computes lower 64 bits of multiplication of a 32-bit unsigned integer and a
187 // 64-bit unsigned integer.
188 inline uint64_t umul96_lower64(uint32_t x
, uint64_t y
) noexcept
{
192 // Various fast log computations.
193 inline int floor_log10_pow2_minus_log10_4_over_3(int e
) noexcept
{
194 FMT_ASSERT(e
<= 2936 && e
>= -2985, "too large exponent");
195 return (e
* 631305 - 261663) >> 21;
198 FMT_INLINE_VARIABLE
constexpr struct {
201 } div_small_pow10_infos
[] = {{10, 16}, {100, 16}};
203 // Replaces n by floor(n / pow(10, N)) returning true if and only if n is
204 // divisible by pow(10, N).
205 // Precondition: n <= pow(10, N + 1).
207 bool check_divisibility_and_divide_by_pow10(uint32_t& n
) noexcept
{
208 // The numbers below are chosen such that:
209 // 1. floor(n/d) = floor(nm / 2^k) where d=10 or d=100,
210 // 2. nm mod 2^k < m if and only if n is divisible by d,
211 // where m is magic_number, k is shift_amount
214 // Item 1 is a common technique of replacing division by a constant with
215 // multiplication, see e.g. "Division by Invariant Integers Using
216 // Multiplication" by Granlund and Montgomery (1994). magic_number (m) is set
217 // to ceil(2^k/d) for large enough k.
218 // The idea for item 2 originates from Schubfach.
219 constexpr auto info
= div_small_pow10_infos
[N
- 1];
220 FMT_ASSERT(n
<= info
.divisor
* 10, "n is too large");
221 constexpr uint32_t magic_number
=
222 (1u << info
.shift_amount
) / info
.divisor
+ 1;
224 const uint32_t comparison_mask
= (1u << info
.shift_amount
) - 1;
225 bool result
= (n
& comparison_mask
) < magic_number
;
226 n
>>= info
.shift_amount
;
230 // Computes floor(n / pow(10, N)) for small n and N.
231 // Precondition: n <= pow(10, N + 1).
232 template <int N
> uint32_t small_division_by_pow10(uint32_t n
) noexcept
{
233 constexpr auto info
= div_small_pow10_infos
[N
- 1];
234 FMT_ASSERT(n
<= info
.divisor
* 10, "n is too large");
235 constexpr uint32_t magic_number
=
236 (1u << info
.shift_amount
) / info
.divisor
+ 1;
237 return (n
* magic_number
) >> info
.shift_amount
;
240 // Computes floor(n / 10^(kappa + 1)) (float)
241 inline uint32_t divide_by_10_to_kappa_plus_1(uint32_t n
) noexcept
{
242 // 1374389535 = ceil(2^37/100)
243 return static_cast<uint32_t>((static_cast<uint64_t>(n
) * 1374389535) >> 37);
245 // Computes floor(n / 10^(kappa + 1)) (double)
246 inline uint64_t divide_by_10_to_kappa_plus_1(uint64_t n
) noexcept
{
247 // 2361183241434822607 = ceil(2^(64+7)/1000)
248 return umul128_upper64(n
, 2361183241434822607ull) >> 7;
251 // Various subroutines using pow10 cache
252 template <typename T
> struct cache_accessor
;
254 template <> struct cache_accessor
<float> {
255 using carrier_uint
= float_info
<float>::carrier_uint
;
256 using cache_entry_type
= uint64_t;
258 static uint64_t get_cached_power(int k
) noexcept
{
259 FMT_ASSERT(k
>= float_info
<float>::min_k
&& k
<= float_info
<float>::max_k
,
260 "k is out of range");
261 static constexpr const uint64_t pow10_significands
[] = {
262 0x81ceb32c4b43fcf5, 0xa2425ff75e14fc32, 0xcad2f7f5359a3b3f,
263 0xfd87b5f28300ca0e, 0x9e74d1b791e07e49, 0xc612062576589ddb,
264 0xf79687aed3eec552, 0x9abe14cd44753b53, 0xc16d9a0095928a28,
265 0xf1c90080baf72cb2, 0x971da05074da7bef, 0xbce5086492111aeb,
266 0xec1e4a7db69561a6, 0x9392ee8e921d5d08, 0xb877aa3236a4b44a,
267 0xe69594bec44de15c, 0x901d7cf73ab0acda, 0xb424dc35095cd810,
268 0xe12e13424bb40e14, 0x8cbccc096f5088cc, 0xafebff0bcb24aaff,
269 0xdbe6fecebdedd5bf, 0x89705f4136b4a598, 0xabcc77118461cefd,
270 0xd6bf94d5e57a42bd, 0x8637bd05af6c69b6, 0xa7c5ac471b478424,
271 0xd1b71758e219652c, 0x83126e978d4fdf3c, 0xa3d70a3d70a3d70b,
272 0xcccccccccccccccd, 0x8000000000000000, 0xa000000000000000,
273 0xc800000000000000, 0xfa00000000000000, 0x9c40000000000000,
274 0xc350000000000000, 0xf424000000000000, 0x9896800000000000,
275 0xbebc200000000000, 0xee6b280000000000, 0x9502f90000000000,
276 0xba43b74000000000, 0xe8d4a51000000000, 0x9184e72a00000000,
277 0xb5e620f480000000, 0xe35fa931a0000000, 0x8e1bc9bf04000000,
278 0xb1a2bc2ec5000000, 0xde0b6b3a76400000, 0x8ac7230489e80000,
279 0xad78ebc5ac620000, 0xd8d726b7177a8000, 0x878678326eac9000,
280 0xa968163f0a57b400, 0xd3c21bcecceda100, 0x84595161401484a0,
281 0xa56fa5b99019a5c8, 0xcecb8f27f4200f3a, 0x813f3978f8940985,
282 0xa18f07d736b90be6, 0xc9f2c9cd04674edf, 0xfc6f7c4045812297,
283 0x9dc5ada82b70b59e, 0xc5371912364ce306, 0xf684df56c3e01bc7,
284 0x9a130b963a6c115d, 0xc097ce7bc90715b4, 0xf0bdc21abb48db21,
285 0x96769950b50d88f5, 0xbc143fa4e250eb32, 0xeb194f8e1ae525fe,
286 0x92efd1b8d0cf37bf, 0xb7abc627050305ae, 0xe596b7b0c643c71a,
287 0x8f7e32ce7bea5c70, 0xb35dbf821ae4f38c, 0xe0352f62a19e306f};
288 return pow10_significands
[k
- float_info
<float>::min_k
];
291 struct compute_mul_result
{
295 struct compute_mul_parity_result
{
300 static compute_mul_result
compute_mul(
301 carrier_uint u
, const cache_entry_type
& cache
) noexcept
{
302 auto r
= umul96_upper64(u
, cache
);
303 return {static_cast<carrier_uint
>(r
>> 32),
304 static_cast<carrier_uint
>(r
) == 0};
307 static uint32_t compute_delta(const cache_entry_type
& cache
,
309 return static_cast<uint32_t>(cache
>> (64 - 1 - beta
));
312 static compute_mul_parity_result
compute_mul_parity(
313 carrier_uint two_f
, const cache_entry_type
& cache
, int beta
) noexcept
{
314 FMT_ASSERT(beta
>= 1, "");
315 FMT_ASSERT(beta
< 64, "");
317 auto r
= umul96_lower64(two_f
, cache
);
318 return {((r
>> (64 - beta
)) & 1) != 0,
319 static_cast<uint32_t>(r
>> (32 - beta
)) == 0};
322 static carrier_uint
compute_left_endpoint_for_shorter_interval_case(
323 const cache_entry_type
& cache
, int beta
) noexcept
{
324 return static_cast<carrier_uint
>(
325 (cache
- (cache
>> (num_significand_bits
<float>() + 2))) >>
326 (64 - num_significand_bits
<float>() - 1 - beta
));
329 static carrier_uint
compute_right_endpoint_for_shorter_interval_case(
330 const cache_entry_type
& cache
, int beta
) noexcept
{
331 return static_cast<carrier_uint
>(
332 (cache
+ (cache
>> (num_significand_bits
<float>() + 1))) >>
333 (64 - num_significand_bits
<float>() - 1 - beta
));
336 static carrier_uint
compute_round_up_for_shorter_interval_case(
337 const cache_entry_type
& cache
, int beta
) noexcept
{
338 return (static_cast<carrier_uint
>(
339 cache
>> (64 - num_significand_bits
<float>() - 2 - beta
)) +
345 template <> struct cache_accessor
<double> {
346 using carrier_uint
= float_info
<double>::carrier_uint
;
347 using cache_entry_type
= uint128_fallback
;
349 static uint128_fallback
get_cached_power(int k
) noexcept
{
350 FMT_ASSERT(k
>= float_info
<double>::min_k
&& k
<= float_info
<double>::max_k
,
351 "k is out of range");
353 static constexpr const uint128_fallback pow10_significands
[] = {
354 #if FMT_USE_FULL_CACHE_DRAGONBOX
355 {0xff77b1fcbebcdc4f, 0x25e8e89c13bb0f7b},
356 {0x9faacf3df73609b1, 0x77b191618c54e9ad},
357 {0xc795830d75038c1d, 0xd59df5b9ef6a2418},
358 {0xf97ae3d0d2446f25, 0x4b0573286b44ad1e},
359 {0x9becce62836ac577, 0x4ee367f9430aec33},
360 {0xc2e801fb244576d5, 0x229c41f793cda740},
361 {0xf3a20279ed56d48a, 0x6b43527578c11110},
362 {0x9845418c345644d6, 0x830a13896b78aaaa},
363 {0xbe5691ef416bd60c, 0x23cc986bc656d554},
364 {0xedec366b11c6cb8f, 0x2cbfbe86b7ec8aa9},
365 {0x94b3a202eb1c3f39, 0x7bf7d71432f3d6aa},
366 {0xb9e08a83a5e34f07, 0xdaf5ccd93fb0cc54},
367 {0xe858ad248f5c22c9, 0xd1b3400f8f9cff69},
368 {0x91376c36d99995be, 0x23100809b9c21fa2},
369 {0xb58547448ffffb2d, 0xabd40a0c2832a78b},
370 {0xe2e69915b3fff9f9, 0x16c90c8f323f516d},
371 {0x8dd01fad907ffc3b, 0xae3da7d97f6792e4},
372 {0xb1442798f49ffb4a, 0x99cd11cfdf41779d},
373 {0xdd95317f31c7fa1d, 0x40405643d711d584},
374 {0x8a7d3eef7f1cfc52, 0x482835ea666b2573},
375 {0xad1c8eab5ee43b66, 0xda3243650005eed0},
376 {0xd863b256369d4a40, 0x90bed43e40076a83},
377 {0x873e4f75e2224e68, 0x5a7744a6e804a292},
378 {0xa90de3535aaae202, 0x711515d0a205cb37},
379 {0xd3515c2831559a83, 0x0d5a5b44ca873e04},
380 {0x8412d9991ed58091, 0xe858790afe9486c3},
381 {0xa5178fff668ae0b6, 0x626e974dbe39a873},
382 {0xce5d73ff402d98e3, 0xfb0a3d212dc81290},
383 {0x80fa687f881c7f8e, 0x7ce66634bc9d0b9a},
384 {0xa139029f6a239f72, 0x1c1fffc1ebc44e81},
385 {0xc987434744ac874e, 0xa327ffb266b56221},
386 {0xfbe9141915d7a922, 0x4bf1ff9f0062baa9},
387 {0x9d71ac8fada6c9b5, 0x6f773fc3603db4aa},
388 {0xc4ce17b399107c22, 0xcb550fb4384d21d4},
389 {0xf6019da07f549b2b, 0x7e2a53a146606a49},
390 {0x99c102844f94e0fb, 0x2eda7444cbfc426e},
391 {0xc0314325637a1939, 0xfa911155fefb5309},
392 {0xf03d93eebc589f88, 0x793555ab7eba27cb},
393 {0x96267c7535b763b5, 0x4bc1558b2f3458df},
394 {0xbbb01b9283253ca2, 0x9eb1aaedfb016f17},
395 {0xea9c227723ee8bcb, 0x465e15a979c1cadd},
396 {0x92a1958a7675175f, 0x0bfacd89ec191eca},
397 {0xb749faed14125d36, 0xcef980ec671f667c},
398 {0xe51c79a85916f484, 0x82b7e12780e7401b},
399 {0x8f31cc0937ae58d2, 0xd1b2ecb8b0908811},
400 {0xb2fe3f0b8599ef07, 0x861fa7e6dcb4aa16},
401 {0xdfbdcece67006ac9, 0x67a791e093e1d49b},
402 {0x8bd6a141006042bd, 0xe0c8bb2c5c6d24e1},
403 {0xaecc49914078536d, 0x58fae9f773886e19},
404 {0xda7f5bf590966848, 0xaf39a475506a899f},
405 {0x888f99797a5e012d, 0x6d8406c952429604},
406 {0xaab37fd7d8f58178, 0xc8e5087ba6d33b84},
407 {0xd5605fcdcf32e1d6, 0xfb1e4a9a90880a65},
408 {0x855c3be0a17fcd26, 0x5cf2eea09a550680},
409 {0xa6b34ad8c9dfc06f, 0xf42faa48c0ea481f},
410 {0xd0601d8efc57b08b, 0xf13b94daf124da27},
411 {0x823c12795db6ce57, 0x76c53d08d6b70859},
412 {0xa2cb1717b52481ed, 0x54768c4b0c64ca6f},
413 {0xcb7ddcdda26da268, 0xa9942f5dcf7dfd0a},
414 {0xfe5d54150b090b02, 0xd3f93b35435d7c4d},
415 {0x9efa548d26e5a6e1, 0xc47bc5014a1a6db0},
416 {0xc6b8e9b0709f109a, 0x359ab6419ca1091c},
417 {0xf867241c8cc6d4c0, 0xc30163d203c94b63},
418 {0x9b407691d7fc44f8, 0x79e0de63425dcf1e},
419 {0xc21094364dfb5636, 0x985915fc12f542e5},
420 {0xf294b943e17a2bc4, 0x3e6f5b7b17b2939e},
421 {0x979cf3ca6cec5b5a, 0xa705992ceecf9c43},
422 {0xbd8430bd08277231, 0x50c6ff782a838354},
423 {0xece53cec4a314ebd, 0xa4f8bf5635246429},
424 {0x940f4613ae5ed136, 0x871b7795e136be9a},
425 {0xb913179899f68584, 0x28e2557b59846e40},
426 {0xe757dd7ec07426e5, 0x331aeada2fe589d0},
427 {0x9096ea6f3848984f, 0x3ff0d2c85def7622},
428 {0xb4bca50b065abe63, 0x0fed077a756b53aa},
429 {0xe1ebce4dc7f16dfb, 0xd3e8495912c62895},
430 {0x8d3360f09cf6e4bd, 0x64712dd7abbbd95d},
431 {0xb080392cc4349dec, 0xbd8d794d96aacfb4},
432 {0xdca04777f541c567, 0xecf0d7a0fc5583a1},
433 {0x89e42caaf9491b60, 0xf41686c49db57245},
434 {0xac5d37d5b79b6239, 0x311c2875c522ced6},
435 {0xd77485cb25823ac7, 0x7d633293366b828c},
436 {0x86a8d39ef77164bc, 0xae5dff9c02033198},
437 {0xa8530886b54dbdeb, 0xd9f57f830283fdfd},
438 {0xd267caa862a12d66, 0xd072df63c324fd7c},
439 {0x8380dea93da4bc60, 0x4247cb9e59f71e6e},
440 {0xa46116538d0deb78, 0x52d9be85f074e609},
441 {0xcd795be870516656, 0x67902e276c921f8c},
442 {0x806bd9714632dff6, 0x00ba1cd8a3db53b7},
443 {0xa086cfcd97bf97f3, 0x80e8a40eccd228a5},
444 {0xc8a883c0fdaf7df0, 0x6122cd128006b2ce},
445 {0xfad2a4b13d1b5d6c, 0x796b805720085f82},
446 {0x9cc3a6eec6311a63, 0xcbe3303674053bb1},
447 {0xc3f490aa77bd60fc, 0xbedbfc4411068a9d},
448 {0xf4f1b4d515acb93b, 0xee92fb5515482d45},
449 {0x991711052d8bf3c5, 0x751bdd152d4d1c4b},
450 {0xbf5cd54678eef0b6, 0xd262d45a78a0635e},
451 {0xef340a98172aace4, 0x86fb897116c87c35},
452 {0x9580869f0e7aac0e, 0xd45d35e6ae3d4da1},
453 {0xbae0a846d2195712, 0x8974836059cca10a},
454 {0xe998d258869facd7, 0x2bd1a438703fc94c},
455 {0x91ff83775423cc06, 0x7b6306a34627ddd0},
456 {0xb67f6455292cbf08, 0x1a3bc84c17b1d543},
457 {0xe41f3d6a7377eeca, 0x20caba5f1d9e4a94},
458 {0x8e938662882af53e, 0x547eb47b7282ee9d},
459 {0xb23867fb2a35b28d, 0xe99e619a4f23aa44},
460 {0xdec681f9f4c31f31, 0x6405fa00e2ec94d5},
461 {0x8b3c113c38f9f37e, 0xde83bc408dd3dd05},
462 {0xae0b158b4738705e, 0x9624ab50b148d446},
463 {0xd98ddaee19068c76, 0x3badd624dd9b0958},
464 {0x87f8a8d4cfa417c9, 0xe54ca5d70a80e5d7},
465 {0xa9f6d30a038d1dbc, 0x5e9fcf4ccd211f4d},
466 {0xd47487cc8470652b, 0x7647c32000696720},
467 {0x84c8d4dfd2c63f3b, 0x29ecd9f40041e074},
468 {0xa5fb0a17c777cf09, 0xf468107100525891},
469 {0xcf79cc9db955c2cc, 0x7182148d4066eeb5},
470 {0x81ac1fe293d599bf, 0xc6f14cd848405531},
471 {0xa21727db38cb002f, 0xb8ada00e5a506a7d},
472 {0xca9cf1d206fdc03b, 0xa6d90811f0e4851d},
473 {0xfd442e4688bd304a, 0x908f4a166d1da664},
474 {0x9e4a9cec15763e2e, 0x9a598e4e043287ff},
475 {0xc5dd44271ad3cdba, 0x40eff1e1853f29fe},
476 {0xf7549530e188c128, 0xd12bee59e68ef47d},
477 {0x9a94dd3e8cf578b9, 0x82bb74f8301958cf},
478 {0xc13a148e3032d6e7, 0xe36a52363c1faf02},
479 {0xf18899b1bc3f8ca1, 0xdc44e6c3cb279ac2},
480 {0x96f5600f15a7b7e5, 0x29ab103a5ef8c0ba},
481 {0xbcb2b812db11a5de, 0x7415d448f6b6f0e8},
482 {0xebdf661791d60f56, 0x111b495b3464ad22},
483 {0x936b9fcebb25c995, 0xcab10dd900beec35},
484 {0xb84687c269ef3bfb, 0x3d5d514f40eea743},
485 {0xe65829b3046b0afa, 0x0cb4a5a3112a5113},
486 {0x8ff71a0fe2c2e6dc, 0x47f0e785eaba72ac},
487 {0xb3f4e093db73a093, 0x59ed216765690f57},
488 {0xe0f218b8d25088b8, 0x306869c13ec3532d},
489 {0x8c974f7383725573, 0x1e414218c73a13fc},
490 {0xafbd2350644eeacf, 0xe5d1929ef90898fb},
491 {0xdbac6c247d62a583, 0xdf45f746b74abf3a},
492 {0x894bc396ce5da772, 0x6b8bba8c328eb784},
493 {0xab9eb47c81f5114f, 0x066ea92f3f326565},
494 {0xd686619ba27255a2, 0xc80a537b0efefebe},
495 {0x8613fd0145877585, 0xbd06742ce95f5f37},
496 {0xa798fc4196e952e7, 0x2c48113823b73705},
497 {0xd17f3b51fca3a7a0, 0xf75a15862ca504c6},
498 {0x82ef85133de648c4, 0x9a984d73dbe722fc},
499 {0xa3ab66580d5fdaf5, 0xc13e60d0d2e0ebbb},
500 {0xcc963fee10b7d1b3, 0x318df905079926a9},
501 {0xffbbcfe994e5c61f, 0xfdf17746497f7053},
502 {0x9fd561f1fd0f9bd3, 0xfeb6ea8bedefa634},
503 {0xc7caba6e7c5382c8, 0xfe64a52ee96b8fc1},
504 {0xf9bd690a1b68637b, 0x3dfdce7aa3c673b1},
505 {0x9c1661a651213e2d, 0x06bea10ca65c084f},
506 {0xc31bfa0fe5698db8, 0x486e494fcff30a63},
507 {0xf3e2f893dec3f126, 0x5a89dba3c3efccfb},
508 {0x986ddb5c6b3a76b7, 0xf89629465a75e01d},
509 {0xbe89523386091465, 0xf6bbb397f1135824},
510 {0xee2ba6c0678b597f, 0x746aa07ded582e2d},
511 {0x94db483840b717ef, 0xa8c2a44eb4571cdd},
512 {0xba121a4650e4ddeb, 0x92f34d62616ce414},
513 {0xe896a0d7e51e1566, 0x77b020baf9c81d18},
514 {0x915e2486ef32cd60, 0x0ace1474dc1d122f},
515 {0xb5b5ada8aaff80b8, 0x0d819992132456bb},
516 {0xe3231912d5bf60e6, 0x10e1fff697ed6c6a},
517 {0x8df5efabc5979c8f, 0xca8d3ffa1ef463c2},
518 {0xb1736b96b6fd83b3, 0xbd308ff8a6b17cb3},
519 {0xddd0467c64bce4a0, 0xac7cb3f6d05ddbdf},
520 {0x8aa22c0dbef60ee4, 0x6bcdf07a423aa96c},
521 {0xad4ab7112eb3929d, 0x86c16c98d2c953c7},
522 {0xd89d64d57a607744, 0xe871c7bf077ba8b8},
523 {0x87625f056c7c4a8b, 0x11471cd764ad4973},
524 {0xa93af6c6c79b5d2d, 0xd598e40d3dd89bd0},
525 {0xd389b47879823479, 0x4aff1d108d4ec2c4},
526 {0x843610cb4bf160cb, 0xcedf722a585139bb},
527 {0xa54394fe1eedb8fe, 0xc2974eb4ee658829},
528 {0xce947a3da6a9273e, 0x733d226229feea33},
529 {0x811ccc668829b887, 0x0806357d5a3f5260},
530 {0xa163ff802a3426a8, 0xca07c2dcb0cf26f8},
531 {0xc9bcff6034c13052, 0xfc89b393dd02f0b6},
532 {0xfc2c3f3841f17c67, 0xbbac2078d443ace3},
533 {0x9d9ba7832936edc0, 0xd54b944b84aa4c0e},
534 {0xc5029163f384a931, 0x0a9e795e65d4df12},
535 {0xf64335bcf065d37d, 0x4d4617b5ff4a16d6},
536 {0x99ea0196163fa42e, 0x504bced1bf8e4e46},
537 {0xc06481fb9bcf8d39, 0xe45ec2862f71e1d7},
538 {0xf07da27a82c37088, 0x5d767327bb4e5a4d},
539 {0x964e858c91ba2655, 0x3a6a07f8d510f870},
540 {0xbbe226efb628afea, 0x890489f70a55368c},
541 {0xeadab0aba3b2dbe5, 0x2b45ac74ccea842f},
542 {0x92c8ae6b464fc96f, 0x3b0b8bc90012929e},
543 {0xb77ada0617e3bbcb, 0x09ce6ebb40173745},
544 {0xe55990879ddcaabd, 0xcc420a6a101d0516},
545 {0x8f57fa54c2a9eab6, 0x9fa946824a12232e},
546 {0xb32df8e9f3546564, 0x47939822dc96abfa},
547 {0xdff9772470297ebd, 0x59787e2b93bc56f8},
548 {0x8bfbea76c619ef36, 0x57eb4edb3c55b65b},
549 {0xaefae51477a06b03, 0xede622920b6b23f2},
550 {0xdab99e59958885c4, 0xe95fab368e45ecee},
551 {0x88b402f7fd75539b, 0x11dbcb0218ebb415},
552 {0xaae103b5fcd2a881, 0xd652bdc29f26a11a},
553 {0xd59944a37c0752a2, 0x4be76d3346f04960},
554 {0x857fcae62d8493a5, 0x6f70a4400c562ddc},
555 {0xa6dfbd9fb8e5b88e, 0xcb4ccd500f6bb953},
556 {0xd097ad07a71f26b2, 0x7e2000a41346a7a8},
557 {0x825ecc24c873782f, 0x8ed400668c0c28c9},
558 {0xa2f67f2dfa90563b, 0x728900802f0f32fb},
559 {0xcbb41ef979346bca, 0x4f2b40a03ad2ffba},
560 {0xfea126b7d78186bc, 0xe2f610c84987bfa9},
561 {0x9f24b832e6b0f436, 0x0dd9ca7d2df4d7ca},
562 {0xc6ede63fa05d3143, 0x91503d1c79720dbc},
563 {0xf8a95fcf88747d94, 0x75a44c6397ce912b},
564 {0x9b69dbe1b548ce7c, 0xc986afbe3ee11abb},
565 {0xc24452da229b021b, 0xfbe85badce996169},
566 {0xf2d56790ab41c2a2, 0xfae27299423fb9c4},
567 {0x97c560ba6b0919a5, 0xdccd879fc967d41b},
568 {0xbdb6b8e905cb600f, 0x5400e987bbc1c921},
569 {0xed246723473e3813, 0x290123e9aab23b69},
570 {0x9436c0760c86e30b, 0xf9a0b6720aaf6522},
571 {0xb94470938fa89bce, 0xf808e40e8d5b3e6a},
572 {0xe7958cb87392c2c2, 0xb60b1d1230b20e05},
573 {0x90bd77f3483bb9b9, 0xb1c6f22b5e6f48c3},
574 {0xb4ecd5f01a4aa828, 0x1e38aeb6360b1af4},
575 {0xe2280b6c20dd5232, 0x25c6da63c38de1b1},
576 {0x8d590723948a535f, 0x579c487e5a38ad0f},
577 {0xb0af48ec79ace837, 0x2d835a9df0c6d852},
578 {0xdcdb1b2798182244, 0xf8e431456cf88e66},
579 {0x8a08f0f8bf0f156b, 0x1b8e9ecb641b5900},
580 {0xac8b2d36eed2dac5, 0xe272467e3d222f40},
581 {0xd7adf884aa879177, 0x5b0ed81dcc6abb10},
582 {0x86ccbb52ea94baea, 0x98e947129fc2b4ea},
583 {0xa87fea27a539e9a5, 0x3f2398d747b36225},
584 {0xd29fe4b18e88640e, 0x8eec7f0d19a03aae},
585 {0x83a3eeeef9153e89, 0x1953cf68300424ad},
586 {0xa48ceaaab75a8e2b, 0x5fa8c3423c052dd8},
587 {0xcdb02555653131b6, 0x3792f412cb06794e},
588 {0x808e17555f3ebf11, 0xe2bbd88bbee40bd1},
589 {0xa0b19d2ab70e6ed6, 0x5b6aceaeae9d0ec5},
590 {0xc8de047564d20a8b, 0xf245825a5a445276},
591 {0xfb158592be068d2e, 0xeed6e2f0f0d56713},
592 {0x9ced737bb6c4183d, 0x55464dd69685606c},
593 {0xc428d05aa4751e4c, 0xaa97e14c3c26b887},
594 {0xf53304714d9265df, 0xd53dd99f4b3066a9},
595 {0x993fe2c6d07b7fab, 0xe546a8038efe402a},
596 {0xbf8fdb78849a5f96, 0xde98520472bdd034},
597 {0xef73d256a5c0f77c, 0x963e66858f6d4441},
598 {0x95a8637627989aad, 0xdde7001379a44aa9},
599 {0xbb127c53b17ec159, 0x5560c018580d5d53},
600 {0xe9d71b689dde71af, 0xaab8f01e6e10b4a7},
601 {0x9226712162ab070d, 0xcab3961304ca70e9},
602 {0xb6b00d69bb55c8d1, 0x3d607b97c5fd0d23},
603 {0xe45c10c42a2b3b05, 0x8cb89a7db77c506b},
604 {0x8eb98a7a9a5b04e3, 0x77f3608e92adb243},
605 {0xb267ed1940f1c61c, 0x55f038b237591ed4},
606 {0xdf01e85f912e37a3, 0x6b6c46dec52f6689},
607 {0x8b61313bbabce2c6, 0x2323ac4b3b3da016},
608 {0xae397d8aa96c1b77, 0xabec975e0a0d081b},
609 {0xd9c7dced53c72255, 0x96e7bd358c904a22},
610 {0x881cea14545c7575, 0x7e50d64177da2e55},
611 {0xaa242499697392d2, 0xdde50bd1d5d0b9ea},
612 {0xd4ad2dbfc3d07787, 0x955e4ec64b44e865},
613 {0x84ec3c97da624ab4, 0xbd5af13bef0b113f},
614 {0xa6274bbdd0fadd61, 0xecb1ad8aeacdd58f},
615 {0xcfb11ead453994ba, 0x67de18eda5814af3},
616 {0x81ceb32c4b43fcf4, 0x80eacf948770ced8},
617 {0xa2425ff75e14fc31, 0xa1258379a94d028e},
618 {0xcad2f7f5359a3b3e, 0x096ee45813a04331},
619 {0xfd87b5f28300ca0d, 0x8bca9d6e188853fd},
620 {0x9e74d1b791e07e48, 0x775ea264cf55347e},
621 {0xc612062576589dda, 0x95364afe032a819e},
622 {0xf79687aed3eec551, 0x3a83ddbd83f52205},
623 {0x9abe14cd44753b52, 0xc4926a9672793543},
624 {0xc16d9a0095928a27, 0x75b7053c0f178294},
625 {0xf1c90080baf72cb1, 0x5324c68b12dd6339},
626 {0x971da05074da7bee, 0xd3f6fc16ebca5e04},
627 {0xbce5086492111aea, 0x88f4bb1ca6bcf585},
628 {0xec1e4a7db69561a5, 0x2b31e9e3d06c32e6},
629 {0x9392ee8e921d5d07, 0x3aff322e62439fd0},
630 {0xb877aa3236a4b449, 0x09befeb9fad487c3},
631 {0xe69594bec44de15b, 0x4c2ebe687989a9b4},
632 {0x901d7cf73ab0acd9, 0x0f9d37014bf60a11},
633 {0xb424dc35095cd80f, 0x538484c19ef38c95},
634 {0xe12e13424bb40e13, 0x2865a5f206b06fba},
635 {0x8cbccc096f5088cb, 0xf93f87b7442e45d4},
636 {0xafebff0bcb24aafe, 0xf78f69a51539d749},
637 {0xdbe6fecebdedd5be, 0xb573440e5a884d1c},
638 {0x89705f4136b4a597, 0x31680a88f8953031},
639 {0xabcc77118461cefc, 0xfdc20d2b36ba7c3e},
640 {0xd6bf94d5e57a42bc, 0x3d32907604691b4d},
641 {0x8637bd05af6c69b5, 0xa63f9a49c2c1b110},
642 {0xa7c5ac471b478423, 0x0fcf80dc33721d54},
643 {0xd1b71758e219652b, 0xd3c36113404ea4a9},
644 {0x83126e978d4fdf3b, 0x645a1cac083126ea},
645 {0xa3d70a3d70a3d70a, 0x3d70a3d70a3d70a4},
646 {0xcccccccccccccccc, 0xcccccccccccccccd},
647 {0x8000000000000000, 0x0000000000000000},
648 {0xa000000000000000, 0x0000000000000000},
649 {0xc800000000000000, 0x0000000000000000},
650 {0xfa00000000000000, 0x0000000000000000},
651 {0x9c40000000000000, 0x0000000000000000},
652 {0xc350000000000000, 0x0000000000000000},
653 {0xf424000000000000, 0x0000000000000000},
654 {0x9896800000000000, 0x0000000000000000},
655 {0xbebc200000000000, 0x0000000000000000},
656 {0xee6b280000000000, 0x0000000000000000},
657 {0x9502f90000000000, 0x0000000000000000},
658 {0xba43b74000000000, 0x0000000000000000},
659 {0xe8d4a51000000000, 0x0000000000000000},
660 {0x9184e72a00000000, 0x0000000000000000},
661 {0xb5e620f480000000, 0x0000000000000000},
662 {0xe35fa931a0000000, 0x0000000000000000},
663 {0x8e1bc9bf04000000, 0x0000000000000000},
664 {0xb1a2bc2ec5000000, 0x0000000000000000},
665 {0xde0b6b3a76400000, 0x0000000000000000},
666 {0x8ac7230489e80000, 0x0000000000000000},
667 {0xad78ebc5ac620000, 0x0000000000000000},
668 {0xd8d726b7177a8000, 0x0000000000000000},
669 {0x878678326eac9000, 0x0000000000000000},
670 {0xa968163f0a57b400, 0x0000000000000000},
671 {0xd3c21bcecceda100, 0x0000000000000000},
672 {0x84595161401484a0, 0x0000000000000000},
673 {0xa56fa5b99019a5c8, 0x0000000000000000},
674 {0xcecb8f27f4200f3a, 0x0000000000000000},
675 {0x813f3978f8940984, 0x4000000000000000},
676 {0xa18f07d736b90be5, 0x5000000000000000},
677 {0xc9f2c9cd04674ede, 0xa400000000000000},
678 {0xfc6f7c4045812296, 0x4d00000000000000},
679 {0x9dc5ada82b70b59d, 0xf020000000000000},
680 {0xc5371912364ce305, 0x6c28000000000000},
681 {0xf684df56c3e01bc6, 0xc732000000000000},
682 {0x9a130b963a6c115c, 0x3c7f400000000000},
683 {0xc097ce7bc90715b3, 0x4b9f100000000000},
684 {0xf0bdc21abb48db20, 0x1e86d40000000000},
685 {0x96769950b50d88f4, 0x1314448000000000},
686 {0xbc143fa4e250eb31, 0x17d955a000000000},
687 {0xeb194f8e1ae525fd, 0x5dcfab0800000000},
688 {0x92efd1b8d0cf37be, 0x5aa1cae500000000},
689 {0xb7abc627050305ad, 0xf14a3d9e40000000},
690 {0xe596b7b0c643c719, 0x6d9ccd05d0000000},
691 {0x8f7e32ce7bea5c6f, 0xe4820023a2000000},
692 {0xb35dbf821ae4f38b, 0xdda2802c8a800000},
693 {0xe0352f62a19e306e, 0xd50b2037ad200000},
694 {0x8c213d9da502de45, 0x4526f422cc340000},
695 {0xaf298d050e4395d6, 0x9670b12b7f410000},
696 {0xdaf3f04651d47b4c, 0x3c0cdd765f114000},
697 {0x88d8762bf324cd0f, 0xa5880a69fb6ac800},
698 {0xab0e93b6efee0053, 0x8eea0d047a457a00},
699 {0xd5d238a4abe98068, 0x72a4904598d6d880},
700 {0x85a36366eb71f041, 0x47a6da2b7f864750},
701 {0xa70c3c40a64e6c51, 0x999090b65f67d924},
702 {0xd0cf4b50cfe20765, 0xfff4b4e3f741cf6d},
703 {0x82818f1281ed449f, 0xbff8f10e7a8921a5},
704 {0xa321f2d7226895c7, 0xaff72d52192b6a0e},
705 {0xcbea6f8ceb02bb39, 0x9bf4f8a69f764491},
706 {0xfee50b7025c36a08, 0x02f236d04753d5b5},
707 {0x9f4f2726179a2245, 0x01d762422c946591},
708 {0xc722f0ef9d80aad6, 0x424d3ad2b7b97ef6},
709 {0xf8ebad2b84e0d58b, 0xd2e0898765a7deb3},
710 {0x9b934c3b330c8577, 0x63cc55f49f88eb30},
711 {0xc2781f49ffcfa6d5, 0x3cbf6b71c76b25fc},
712 {0xf316271c7fc3908a, 0x8bef464e3945ef7b},
713 {0x97edd871cfda3a56, 0x97758bf0e3cbb5ad},
714 {0xbde94e8e43d0c8ec, 0x3d52eeed1cbea318},
715 {0xed63a231d4c4fb27, 0x4ca7aaa863ee4bde},
716 {0x945e455f24fb1cf8, 0x8fe8caa93e74ef6b},
717 {0xb975d6b6ee39e436, 0xb3e2fd538e122b45},
718 {0xe7d34c64a9c85d44, 0x60dbbca87196b617},
719 {0x90e40fbeea1d3a4a, 0xbc8955e946fe31ce},
720 {0xb51d13aea4a488dd, 0x6babab6398bdbe42},
721 {0xe264589a4dcdab14, 0xc696963c7eed2dd2},
722 {0x8d7eb76070a08aec, 0xfc1e1de5cf543ca3},
723 {0xb0de65388cc8ada8, 0x3b25a55f43294bcc},
724 {0xdd15fe86affad912, 0x49ef0eb713f39ebf},
725 {0x8a2dbf142dfcc7ab, 0x6e3569326c784338},
726 {0xacb92ed9397bf996, 0x49c2c37f07965405},
727 {0xd7e77a8f87daf7fb, 0xdc33745ec97be907},
728 {0x86f0ac99b4e8dafd, 0x69a028bb3ded71a4},
729 {0xa8acd7c0222311bc, 0xc40832ea0d68ce0d},
730 {0xd2d80db02aabd62b, 0xf50a3fa490c30191},
731 {0x83c7088e1aab65db, 0x792667c6da79e0fb},
732 {0xa4b8cab1a1563f52, 0x577001b891185939},
733 {0xcde6fd5e09abcf26, 0xed4c0226b55e6f87},
734 {0x80b05e5ac60b6178, 0x544f8158315b05b5},
735 {0xa0dc75f1778e39d6, 0x696361ae3db1c722},
736 {0xc913936dd571c84c, 0x03bc3a19cd1e38ea},
737 {0xfb5878494ace3a5f, 0x04ab48a04065c724},
738 {0x9d174b2dcec0e47b, 0x62eb0d64283f9c77},
739 {0xc45d1df942711d9a, 0x3ba5d0bd324f8395},
740 {0xf5746577930d6500, 0xca8f44ec7ee3647a},
741 {0x9968bf6abbe85f20, 0x7e998b13cf4e1ecc},
742 {0xbfc2ef456ae276e8, 0x9e3fedd8c321a67f},
743 {0xefb3ab16c59b14a2, 0xc5cfe94ef3ea101f},
744 {0x95d04aee3b80ece5, 0xbba1f1d158724a13},
745 {0xbb445da9ca61281f, 0x2a8a6e45ae8edc98},
746 {0xea1575143cf97226, 0xf52d09d71a3293be},
747 {0x924d692ca61be758, 0x593c2626705f9c57},
748 {0xb6e0c377cfa2e12e, 0x6f8b2fb00c77836d},
749 {0xe498f455c38b997a, 0x0b6dfb9c0f956448},
750 {0x8edf98b59a373fec, 0x4724bd4189bd5ead},
751 {0xb2977ee300c50fe7, 0x58edec91ec2cb658},
752 {0xdf3d5e9bc0f653e1, 0x2f2967b66737e3ee},
753 {0x8b865b215899f46c, 0xbd79e0d20082ee75},
754 {0xae67f1e9aec07187, 0xecd8590680a3aa12},
755 {0xda01ee641a708de9, 0xe80e6f4820cc9496},
756 {0x884134fe908658b2, 0x3109058d147fdcde},
757 {0xaa51823e34a7eede, 0xbd4b46f0599fd416},
758 {0xd4e5e2cdc1d1ea96, 0x6c9e18ac7007c91b},
759 {0x850fadc09923329e, 0x03e2cf6bc604ddb1},
760 {0xa6539930bf6bff45, 0x84db8346b786151d},
761 {0xcfe87f7cef46ff16, 0xe612641865679a64},
762 {0x81f14fae158c5f6e, 0x4fcb7e8f3f60c07f},
763 {0xa26da3999aef7749, 0xe3be5e330f38f09e},
764 {0xcb090c8001ab551c, 0x5cadf5bfd3072cc6},
765 {0xfdcb4fa002162a63, 0x73d9732fc7c8f7f7},
766 {0x9e9f11c4014dda7e, 0x2867e7fddcdd9afb},
767 {0xc646d63501a1511d, 0xb281e1fd541501b9},
768 {0xf7d88bc24209a565, 0x1f225a7ca91a4227},
769 {0x9ae757596946075f, 0x3375788de9b06959},
770 {0xc1a12d2fc3978937, 0x0052d6b1641c83af},
771 {0xf209787bb47d6b84, 0xc0678c5dbd23a49b},
772 {0x9745eb4d50ce6332, 0xf840b7ba963646e1},
773 {0xbd176620a501fbff, 0xb650e5a93bc3d899},
774 {0xec5d3fa8ce427aff, 0xa3e51f138ab4cebf},
775 {0x93ba47c980e98cdf, 0xc66f336c36b10138},
776 {0xb8a8d9bbe123f017, 0xb80b0047445d4185},
777 {0xe6d3102ad96cec1d, 0xa60dc059157491e6},
778 {0x9043ea1ac7e41392, 0x87c89837ad68db30},
779 {0xb454e4a179dd1877, 0x29babe4598c311fc},
780 {0xe16a1dc9d8545e94, 0xf4296dd6fef3d67b},
781 {0x8ce2529e2734bb1d, 0x1899e4a65f58660d},
782 {0xb01ae745b101e9e4, 0x5ec05dcff72e7f90},
783 {0xdc21a1171d42645d, 0x76707543f4fa1f74},
784 {0x899504ae72497eba, 0x6a06494a791c53a9},
785 {0xabfa45da0edbde69, 0x0487db9d17636893},
786 {0xd6f8d7509292d603, 0x45a9d2845d3c42b7},
787 {0x865b86925b9bc5c2, 0x0b8a2392ba45a9b3},
788 {0xa7f26836f282b732, 0x8e6cac7768d7141f},
789 {0xd1ef0244af2364ff, 0x3207d795430cd927},
790 {0x8335616aed761f1f, 0x7f44e6bd49e807b9},
791 {0xa402b9c5a8d3a6e7, 0x5f16206c9c6209a7},
792 {0xcd036837130890a1, 0x36dba887c37a8c10},
793 {0x802221226be55a64, 0xc2494954da2c978a},
794 {0xa02aa96b06deb0fd, 0xf2db9baa10b7bd6d},
795 {0xc83553c5c8965d3d, 0x6f92829494e5acc8},
796 {0xfa42a8b73abbf48c, 0xcb772339ba1f17fa},
797 {0x9c69a97284b578d7, 0xff2a760414536efc},
798 {0xc38413cf25e2d70d, 0xfef5138519684abb},
799 {0xf46518c2ef5b8cd1, 0x7eb258665fc25d6a},
800 {0x98bf2f79d5993802, 0xef2f773ffbd97a62},
801 {0xbeeefb584aff8603, 0xaafb550ffacfd8fb},
802 {0xeeaaba2e5dbf6784, 0x95ba2a53f983cf39},
803 {0x952ab45cfa97a0b2, 0xdd945a747bf26184},
804 {0xba756174393d88df, 0x94f971119aeef9e5},
805 {0xe912b9d1478ceb17, 0x7a37cd5601aab85e},
806 {0x91abb422ccb812ee, 0xac62e055c10ab33b},
807 {0xb616a12b7fe617aa, 0x577b986b314d600a},
808 {0xe39c49765fdf9d94, 0xed5a7e85fda0b80c},
809 {0x8e41ade9fbebc27d, 0x14588f13be847308},
810 {0xb1d219647ae6b31c, 0x596eb2d8ae258fc9},
811 {0xde469fbd99a05fe3, 0x6fca5f8ed9aef3bc},
812 {0x8aec23d680043bee, 0x25de7bb9480d5855},
813 {0xada72ccc20054ae9, 0xaf561aa79a10ae6b},
814 {0xd910f7ff28069da4, 0x1b2ba1518094da05},
815 {0x87aa9aff79042286, 0x90fb44d2f05d0843},
816 {0xa99541bf57452b28, 0x353a1607ac744a54},
817 {0xd3fa922f2d1675f2, 0x42889b8997915ce9},
818 {0x847c9b5d7c2e09b7, 0x69956135febada12},
819 {0xa59bc234db398c25, 0x43fab9837e699096},
820 {0xcf02b2c21207ef2e, 0x94f967e45e03f4bc},
821 {0x8161afb94b44f57d, 0x1d1be0eebac278f6},
822 {0xa1ba1ba79e1632dc, 0x6462d92a69731733},
823 {0xca28a291859bbf93, 0x7d7b8f7503cfdcff},
824 {0xfcb2cb35e702af78, 0x5cda735244c3d43f},
825 {0x9defbf01b061adab, 0x3a0888136afa64a8},
826 {0xc56baec21c7a1916, 0x088aaa1845b8fdd1},
827 {0xf6c69a72a3989f5b, 0x8aad549e57273d46},
828 {0x9a3c2087a63f6399, 0x36ac54e2f678864c},
829 {0xc0cb28a98fcf3c7f, 0x84576a1bb416a7de},
830 {0xf0fdf2d3f3c30b9f, 0x656d44a2a11c51d6},
831 {0x969eb7c47859e743, 0x9f644ae5a4b1b326},
832 {0xbc4665b596706114, 0x873d5d9f0dde1fef},
833 {0xeb57ff22fc0c7959, 0xa90cb506d155a7eb},
834 {0x9316ff75dd87cbd8, 0x09a7f12442d588f3},
835 {0xb7dcbf5354e9bece, 0x0c11ed6d538aeb30},
836 {0xe5d3ef282a242e81, 0x8f1668c8a86da5fb},
837 {0x8fa475791a569d10, 0xf96e017d694487bd},
838 {0xb38d92d760ec4455, 0x37c981dcc395a9ad},
839 {0xe070f78d3927556a, 0x85bbe253f47b1418},
840 {0x8c469ab843b89562, 0x93956d7478ccec8f},
841 {0xaf58416654a6babb, 0x387ac8d1970027b3},
842 {0xdb2e51bfe9d0696a, 0x06997b05fcc0319f},
843 {0x88fcf317f22241e2, 0x441fece3bdf81f04},
844 {0xab3c2fddeeaad25a, 0xd527e81cad7626c4},
845 {0xd60b3bd56a5586f1, 0x8a71e223d8d3b075},
846 {0x85c7056562757456, 0xf6872d5667844e4a},
847 {0xa738c6bebb12d16c, 0xb428f8ac016561dc},
848 {0xd106f86e69d785c7, 0xe13336d701beba53},
849 {0x82a45b450226b39c, 0xecc0024661173474},
850 {0xa34d721642b06084, 0x27f002d7f95d0191},
851 {0xcc20ce9bd35c78a5, 0x31ec038df7b441f5},
852 {0xff290242c83396ce, 0x7e67047175a15272},
853 {0x9f79a169bd203e41, 0x0f0062c6e984d387},
854 {0xc75809c42c684dd1, 0x52c07b78a3e60869},
855 {0xf92e0c3537826145, 0xa7709a56ccdf8a83},
856 {0x9bbcc7a142b17ccb, 0x88a66076400bb692},
857 {0xc2abf989935ddbfe, 0x6acff893d00ea436},
858 {0xf356f7ebf83552fe, 0x0583f6b8c4124d44},
859 {0x98165af37b2153de, 0xc3727a337a8b704b},
860 {0xbe1bf1b059e9a8d6, 0x744f18c0592e4c5d},
861 {0xeda2ee1c7064130c, 0x1162def06f79df74},
862 {0x9485d4d1c63e8be7, 0x8addcb5645ac2ba9},
863 {0xb9a74a0637ce2ee1, 0x6d953e2bd7173693},
864 {0xe8111c87c5c1ba99, 0xc8fa8db6ccdd0438},
865 {0x910ab1d4db9914a0, 0x1d9c9892400a22a3},
866 {0xb54d5e4a127f59c8, 0x2503beb6d00cab4c},
867 {0xe2a0b5dc971f303a, 0x2e44ae64840fd61e},
868 {0x8da471a9de737e24, 0x5ceaecfed289e5d3},
869 {0xb10d8e1456105dad, 0x7425a83e872c5f48},
870 {0xdd50f1996b947518, 0xd12f124e28f7771a},
871 {0x8a5296ffe33cc92f, 0x82bd6b70d99aaa70},
872 {0xace73cbfdc0bfb7b, 0x636cc64d1001550c},
873 {0xd8210befd30efa5a, 0x3c47f7e05401aa4f},
874 {0x8714a775e3e95c78, 0x65acfaec34810a72},
875 {0xa8d9d1535ce3b396, 0x7f1839a741a14d0e},
876 {0xd31045a8341ca07c, 0x1ede48111209a051},
877 {0x83ea2b892091e44d, 0x934aed0aab460433},
878 {0xa4e4b66b68b65d60, 0xf81da84d56178540},
879 {0xce1de40642e3f4b9, 0x36251260ab9d668f},
880 {0x80d2ae83e9ce78f3, 0xc1d72b7c6b42601a},
881 {0xa1075a24e4421730, 0xb24cf65b8612f820},
882 {0xc94930ae1d529cfc, 0xdee033f26797b628},
883 {0xfb9b7cd9a4a7443c, 0x169840ef017da3b2},
884 {0x9d412e0806e88aa5, 0x8e1f289560ee864f},
885 {0xc491798a08a2ad4e, 0xf1a6f2bab92a27e3},
886 {0xf5b5d7ec8acb58a2, 0xae10af696774b1dc},
887 {0x9991a6f3d6bf1765, 0xacca6da1e0a8ef2a},
888 {0xbff610b0cc6edd3f, 0x17fd090a58d32af4},
889 {0xeff394dcff8a948e, 0xddfc4b4cef07f5b1},
890 {0x95f83d0a1fb69cd9, 0x4abdaf101564f98f},
891 {0xbb764c4ca7a4440f, 0x9d6d1ad41abe37f2},
892 {0xea53df5fd18d5513, 0x84c86189216dc5ee},
893 {0x92746b9be2f8552c, 0x32fd3cf5b4e49bb5},
894 {0xb7118682dbb66a77, 0x3fbc8c33221dc2a2},
895 {0xe4d5e82392a40515, 0x0fabaf3feaa5334b},
896 {0x8f05b1163ba6832d, 0x29cb4d87f2a7400f},
897 {0xb2c71d5bca9023f8, 0x743e20e9ef511013},
898 {0xdf78e4b2bd342cf6, 0x914da9246b255417},
899 {0x8bab8eefb6409c1a, 0x1ad089b6c2f7548f},
900 {0xae9672aba3d0c320, 0xa184ac2473b529b2},
901 {0xda3c0f568cc4f3e8, 0xc9e5d72d90a2741f},
902 {0x8865899617fb1871, 0x7e2fa67c7a658893},
903 {0xaa7eebfb9df9de8d, 0xddbb901b98feeab8},
904 {0xd51ea6fa85785631, 0x552a74227f3ea566},
905 {0x8533285c936b35de, 0xd53a88958f872760},
906 {0xa67ff273b8460356, 0x8a892abaf368f138},
907 {0xd01fef10a657842c, 0x2d2b7569b0432d86},
908 {0x8213f56a67f6b29b, 0x9c3b29620e29fc74},
909 {0xa298f2c501f45f42, 0x8349f3ba91b47b90},
910 {0xcb3f2f7642717713, 0x241c70a936219a74},
911 {0xfe0efb53d30dd4d7, 0xed238cd383aa0111},
912 {0x9ec95d1463e8a506, 0xf4363804324a40ab},
913 {0xc67bb4597ce2ce48, 0xb143c6053edcd0d6},
914 {0xf81aa16fdc1b81da, 0xdd94b7868e94050b},
915 {0x9b10a4e5e9913128, 0xca7cf2b4191c8327},
916 {0xc1d4ce1f63f57d72, 0xfd1c2f611f63a3f1},
917 {0xf24a01a73cf2dccf, 0xbc633b39673c8ced},
918 {0x976e41088617ca01, 0xd5be0503e085d814},
919 {0xbd49d14aa79dbc82, 0x4b2d8644d8a74e19},
920 {0xec9c459d51852ba2, 0xddf8e7d60ed1219f},
921 {0x93e1ab8252f33b45, 0xcabb90e5c942b504},
922 {0xb8da1662e7b00a17, 0x3d6a751f3b936244},
923 {0xe7109bfba19c0c9d, 0x0cc512670a783ad5},
924 {0x906a617d450187e2, 0x27fb2b80668b24c6},
925 {0xb484f9dc9641e9da, 0xb1f9f660802dedf7},
926 {0xe1a63853bbd26451, 0x5e7873f8a0396974},
927 {0x8d07e33455637eb2, 0xdb0b487b6423e1e9},
928 {0xb049dc016abc5e5f, 0x91ce1a9a3d2cda63},
929 {0xdc5c5301c56b75f7, 0x7641a140cc7810fc},
930 {0x89b9b3e11b6329ba, 0xa9e904c87fcb0a9e},
931 {0xac2820d9623bf429, 0x546345fa9fbdcd45},
932 {0xd732290fbacaf133, 0xa97c177947ad4096},
933 {0x867f59a9d4bed6c0, 0x49ed8eabcccc485e},
934 {0xa81f301449ee8c70, 0x5c68f256bfff5a75},
935 {0xd226fc195c6a2f8c, 0x73832eec6fff3112},
936 {0x83585d8fd9c25db7, 0xc831fd53c5ff7eac},
937 {0xa42e74f3d032f525, 0xba3e7ca8b77f5e56},
938 {0xcd3a1230c43fb26f, 0x28ce1bd2e55f35ec},
939 {0x80444b5e7aa7cf85, 0x7980d163cf5b81b4},
940 {0xa0555e361951c366, 0xd7e105bcc3326220},
941 {0xc86ab5c39fa63440, 0x8dd9472bf3fefaa8},
942 {0xfa856334878fc150, 0xb14f98f6f0feb952},
943 {0x9c935e00d4b9d8d2, 0x6ed1bf9a569f33d4},
944 {0xc3b8358109e84f07, 0x0a862f80ec4700c9},
945 {0xf4a642e14c6262c8, 0xcd27bb612758c0fb},
946 {0x98e7e9cccfbd7dbd, 0x8038d51cb897789d},
947 {0xbf21e44003acdd2c, 0xe0470a63e6bd56c4},
948 {0xeeea5d5004981478, 0x1858ccfce06cac75},
949 {0x95527a5202df0ccb, 0x0f37801e0c43ebc9},
950 {0xbaa718e68396cffd, 0xd30560258f54e6bb},
951 {0xe950df20247c83fd, 0x47c6b82ef32a206a},
952 {0x91d28b7416cdd27e, 0x4cdc331d57fa5442},
953 {0xb6472e511c81471d, 0xe0133fe4adf8e953},
954 {0xe3d8f9e563a198e5, 0x58180fddd97723a7},
955 {0x8e679c2f5e44ff8f, 0x570f09eaa7ea7649},
956 {0xb201833b35d63f73, 0x2cd2cc6551e513db},
957 {0xde81e40a034bcf4f, 0xf8077f7ea65e58d2},
958 {0x8b112e86420f6191, 0xfb04afaf27faf783},
959 {0xadd57a27d29339f6, 0x79c5db9af1f9b564},
960 {0xd94ad8b1c7380874, 0x18375281ae7822bd},
961 {0x87cec76f1c830548, 0x8f2293910d0b15b6},
962 {0xa9c2794ae3a3c69a, 0xb2eb3875504ddb23},
963 {0xd433179d9c8cb841, 0x5fa60692a46151ec},
964 {0x849feec281d7f328, 0xdbc7c41ba6bcd334},
965 {0xa5c7ea73224deff3, 0x12b9b522906c0801},
966 {0xcf39e50feae16bef, 0xd768226b34870a01},
967 {0x81842f29f2cce375, 0xe6a1158300d46641},
968 {0xa1e53af46f801c53, 0x60495ae3c1097fd1},
969 {0xca5e89b18b602368, 0x385bb19cb14bdfc5},
970 {0xfcf62c1dee382c42, 0x46729e03dd9ed7b6},
971 {0x9e19db92b4e31ba9, 0x6c07a2c26a8346d2},
972 {0xc5a05277621be293, 0xc7098b7305241886},
973 {0xf70867153aa2db38, 0xb8cbee4fc66d1ea8},
974 {0x9a65406d44a5c903, 0x737f74f1dc043329},
975 {0xc0fe908895cf3b44, 0x505f522e53053ff3},
976 {0xf13e34aabb430a15, 0x647726b9e7c68ff0},
977 {0x96c6e0eab509e64d, 0x5eca783430dc19f6},
978 {0xbc789925624c5fe0, 0xb67d16413d132073},
979 {0xeb96bf6ebadf77d8, 0xe41c5bd18c57e890},
980 {0x933e37a534cbaae7, 0x8e91b962f7b6f15a},
981 {0xb80dc58e81fe95a1, 0x723627bbb5a4adb1},
982 {0xe61136f2227e3b09, 0xcec3b1aaa30dd91d},
983 {0x8fcac257558ee4e6, 0x213a4f0aa5e8a7b2},
984 {0xb3bd72ed2af29e1f, 0xa988e2cd4f62d19e},
985 {0xe0accfa875af45a7, 0x93eb1b80a33b8606},
986 {0x8c6c01c9498d8b88, 0xbc72f130660533c4},
987 {0xaf87023b9bf0ee6a, 0xeb8fad7c7f8680b5},
988 { 0xdb68c2ca82ed2a05,
991 {0xff77b1fcbebcdc4f, 0x25e8e89c13bb0f7b},
992 {0xce5d73ff402d98e3, 0xfb0a3d212dc81290},
993 {0xa6b34ad8c9dfc06f, 0xf42faa48c0ea481f},
994 {0x86a8d39ef77164bc, 0xae5dff9c02033198},
995 {0xd98ddaee19068c76, 0x3badd624dd9b0958},
996 {0xafbd2350644eeacf, 0xe5d1929ef90898fb},
997 {0x8df5efabc5979c8f, 0xca8d3ffa1ef463c2},
998 {0xe55990879ddcaabd, 0xcc420a6a101d0516},
999 {0xb94470938fa89bce, 0xf808e40e8d5b3e6a},
1000 {0x95a8637627989aad, 0xdde7001379a44aa9},
1001 {0xf1c90080baf72cb1, 0x5324c68b12dd6339},
1002 {0xc350000000000000, 0x0000000000000000},
1003 {0x9dc5ada82b70b59d, 0xf020000000000000},
1004 {0xfee50b7025c36a08, 0x02f236d04753d5b5},
1005 {0xcde6fd5e09abcf26, 0xed4c0226b55e6f87},
1006 {0xa6539930bf6bff45, 0x84db8346b786151d},
1007 {0x865b86925b9bc5c2, 0x0b8a2392ba45a9b3},
1008 {0xd910f7ff28069da4, 0x1b2ba1518094da05},
1009 {0xaf58416654a6babb, 0x387ac8d1970027b3},
1010 {0x8da471a9de737e24, 0x5ceaecfed289e5d3},
1011 {0xe4d5e82392a40515, 0x0fabaf3feaa5334b},
1012 {0xb8da1662e7b00a17, 0x3d6a751f3b936244},
1013 {0x95527a5202df0ccb, 0x0f37801e0c43ebc9},
1014 {0xf13e34aabb430a15, 0x647726b9e7c68ff0}
1018 #if FMT_USE_FULL_CACHE_DRAGONBOX
1019 return pow10_significands
[k
- float_info
<double>::min_k
];
1021 static constexpr const uint64_t powers_of_5_64
[] = {
1022 0x0000000000000001, 0x0000000000000005, 0x0000000000000019,
1023 0x000000000000007d, 0x0000000000000271, 0x0000000000000c35,
1024 0x0000000000003d09, 0x000000000001312d, 0x000000000005f5e1,
1025 0x00000000001dcd65, 0x00000000009502f9, 0x0000000002e90edd,
1026 0x000000000e8d4a51, 0x0000000048c27395, 0x000000016bcc41e9,
1027 0x000000071afd498d, 0x0000002386f26fc1, 0x000000b1a2bc2ec5,
1028 0x000003782dace9d9, 0x00001158e460913d, 0x000056bc75e2d631,
1029 0x0001b1ae4d6e2ef5, 0x000878678326eac9, 0x002a5a058fc295ed,
1030 0x00d3c21bcecceda1, 0x0422ca8b0a00a425, 0x14adf4b7320334b9};
1032 static const int compression_ratio
= 27;
1034 // Compute base index.
1035 int cache_index
= (k
- float_info
<double>::min_k
) / compression_ratio
;
1036 int kb
= cache_index
* compression_ratio
+ float_info
<double>::min_k
;
1037 int offset
= k
- kb
;
1040 uint128_fallback base_cache
= pow10_significands
[cache_index
];
1041 if (offset
== 0) return base_cache
;
1043 // Compute the required amount of bit-shift.
1044 int alpha
= floor_log2_pow10(kb
+ offset
) - floor_log2_pow10(kb
) - offset
;
1045 FMT_ASSERT(alpha
> 0 && alpha
< 64, "shifting error detected");
1047 // Try to recover the real cache.
1048 uint64_t pow5
= powers_of_5_64
[offset
];
1049 uint128_fallback recovered_cache
= umul128(base_cache
.high(), pow5
);
1050 uint128_fallback middle_low
= umul128(base_cache
.low(), pow5
);
1052 recovered_cache
+= middle_low
.high();
1054 uint64_t high_to_middle
= recovered_cache
.high() << (64 - alpha
);
1055 uint64_t middle_to_low
= recovered_cache
.low() << (64 - alpha
);
1058 uint128_fallback
{(recovered_cache
.low() >> alpha
) | high_to_middle
,
1059 ((middle_low
.low() >> alpha
) | middle_to_low
)};
1060 FMT_ASSERT(recovered_cache
.low() + 1 != 0, "");
1061 return {recovered_cache
.high(), recovered_cache
.low() + 1};
1065 struct compute_mul_result
{
1066 carrier_uint result
;
1069 struct compute_mul_parity_result
{
1074 static compute_mul_result
compute_mul(
1075 carrier_uint u
, const cache_entry_type
& cache
) noexcept
{
1076 auto r
= umul192_upper128(u
, cache
);
1077 return {r
.high(), r
.low() == 0};
1080 static uint32_t compute_delta(cache_entry_type
const& cache
,
1081 int beta
) noexcept
{
1082 return static_cast<uint32_t>(cache
.high() >> (64 - 1 - beta
));
1085 static compute_mul_parity_result
compute_mul_parity(
1086 carrier_uint two_f
, const cache_entry_type
& cache
, int beta
) noexcept
{
1087 FMT_ASSERT(beta
>= 1, "");
1088 FMT_ASSERT(beta
< 64, "");
1090 auto r
= umul192_lower128(two_f
, cache
);
1091 return {((r
.high() >> (64 - beta
)) & 1) != 0,
1092 ((r
.high() << beta
) | (r
.low() >> (64 - beta
))) == 0};
1095 static carrier_uint
compute_left_endpoint_for_shorter_interval_case(
1096 const cache_entry_type
& cache
, int beta
) noexcept
{
1097 return (cache
.high() -
1098 (cache
.high() >> (num_significand_bits
<double>() + 2))) >>
1099 (64 - num_significand_bits
<double>() - 1 - beta
);
1102 static carrier_uint
compute_right_endpoint_for_shorter_interval_case(
1103 const cache_entry_type
& cache
, int beta
) noexcept
{
1104 return (cache
.high() +
1105 (cache
.high() >> (num_significand_bits
<double>() + 1))) >>
1106 (64 - num_significand_bits
<double>() - 1 - beta
);
1109 static carrier_uint
compute_round_up_for_shorter_interval_case(
1110 const cache_entry_type
& cache
, int beta
) noexcept
{
1111 return ((cache
.high() >> (64 - num_significand_bits
<double>() - 2 - beta
)) +
1117 FMT_FUNC uint128_fallback
get_cached_power(int k
) noexcept
{
1118 return cache_accessor
<double>::get_cached_power(k
);
1121 // Various integer checks
1122 template <typename T
>
1123 bool is_left_endpoint_integer_shorter_interval(int exponent
) noexcept
{
1124 const int case_shorter_interval_left_endpoint_lower_threshold
= 2;
1125 const int case_shorter_interval_left_endpoint_upper_threshold
= 3;
1126 return exponent
>= case_shorter_interval_left_endpoint_lower_threshold
&&
1127 exponent
<= case_shorter_interval_left_endpoint_upper_threshold
;
1130 // Remove trailing zeros from n and return the number of zeros removed (float)
1131 FMT_INLINE
int remove_trailing_zeros(uint32_t& n
, int s
= 0) noexcept
{
1132 FMT_ASSERT(n
!= 0, "");
1133 // Modular inverse of 5 (mod 2^32): (mod_inv_5 * 5) mod 2^32 = 1.
1134 constexpr uint32_t mod_inv_5
= 0xcccccccd;
1135 constexpr uint32_t mod_inv_25
= 0xc28f5c29; // = mod_inv_5 * mod_inv_5
1138 auto q
= rotr(n
* mod_inv_25
, 2);
1139 if (q
> max_value
<uint32_t>() / 100) break;
1143 auto q
= rotr(n
* mod_inv_5
, 1);
1144 if (q
<= max_value
<uint32_t>() / 10) {
1151 // Removes trailing zeros and returns the number of zeros removed (double)
1152 FMT_INLINE
int remove_trailing_zeros(uint64_t& n
) noexcept
{
1153 FMT_ASSERT(n
!= 0, "");
1155 // This magic number is ceil(2^90 / 10^8).
1156 constexpr uint64_t magic_number
= 12379400392853802749ull;
1157 auto nm
= umul128(n
, magic_number
);
1159 // Is n is divisible by 10^8?
1160 if ((nm
.high() & ((1ull << (90 - 64)) - 1)) == 0 && nm
.low() < magic_number
) {
1161 // If yes, work with the quotient...
1162 auto n32
= static_cast<uint32_t>(nm
.high() >> (90 - 64));
1163 // ... and use the 32 bit variant of the function
1164 int s
= remove_trailing_zeros(n32
, 8);
1169 // If n is not divisible by 10^8, work with n itself.
1170 constexpr uint64_t mod_inv_5
= 0xcccccccccccccccd;
1171 constexpr uint64_t mod_inv_25
= 0x8f5c28f5c28f5c29; // = mod_inv_5 * mod_inv_5
1175 auto q
= rotr(n
* mod_inv_25
, 2);
1176 if (q
> max_value
<uint64_t>() / 100) break;
1180 auto q
= rotr(n
* mod_inv_5
, 1);
1181 if (q
<= max_value
<uint64_t>() / 10) {
1189 // The main algorithm for shorter interval case
1190 template <typename T
>
1191 FMT_INLINE decimal_fp
<T
> shorter_interval_case(int exponent
) noexcept
{
1192 decimal_fp
<T
> ret_value
;
1193 // Compute k and beta
1194 const int minus_k
= floor_log10_pow2_minus_log10_4_over_3(exponent
);
1195 const int beta
= exponent
+ floor_log2_pow10(-minus_k
);
1197 // Compute xi and zi
1198 using cache_entry_type
= typename cache_accessor
<T
>::cache_entry_type
;
1199 const cache_entry_type cache
= cache_accessor
<T
>::get_cached_power(-minus_k
);
1201 auto xi
= cache_accessor
<T
>::compute_left_endpoint_for_shorter_interval_case(
1203 auto zi
= cache_accessor
<T
>::compute_right_endpoint_for_shorter_interval_case(
1206 // If the left endpoint is not an integer, increase it
1207 if (!is_left_endpoint_integer_shorter_interval
<T
>(exponent
)) ++xi
;
1209 // Try bigger divisor
1210 ret_value
.significand
= zi
/ 10;
1212 // If succeed, remove trailing zeros if necessary and return
1213 if (ret_value
.significand
* 10 >= xi
) {
1214 ret_value
.exponent
= minus_k
+ 1;
1215 ret_value
.exponent
+= remove_trailing_zeros(ret_value
.significand
);
1219 // Otherwise, compute the round-up of y
1220 ret_value
.significand
=
1221 cache_accessor
<T
>::compute_round_up_for_shorter_interval_case(cache
,
1223 ret_value
.exponent
= minus_k
;
1225 // When tie occurs, choose one of them according to the rule
1226 if (exponent
>= float_info
<T
>::shorter_interval_tie_lower_threshold
&&
1227 exponent
<= float_info
<T
>::shorter_interval_tie_upper_threshold
) {
1228 ret_value
.significand
= ret_value
.significand
% 2 == 0
1229 ? ret_value
.significand
1230 : ret_value
.significand
- 1;
1231 } else if (ret_value
.significand
< xi
) {
1232 ++ret_value
.significand
;
1237 template <typename T
> decimal_fp
<T
> to_decimal(T x
) noexcept
{
1238 // Step 1: integer promotion & Schubfach multiplier calculation.
1240 using carrier_uint
= typename float_info
<T
>::carrier_uint
;
1241 using cache_entry_type
= typename cache_accessor
<T
>::cache_entry_type
;
1242 auto br
= bit_cast
<carrier_uint
>(x
);
1244 // Extract significand bits and exponent bits.
1245 const carrier_uint significand_mask
=
1246 (static_cast<carrier_uint
>(1) << num_significand_bits
<T
>()) - 1;
1247 carrier_uint significand
= (br
& significand_mask
);
1249 static_cast<int>((br
& exponent_mask
<T
>()) >> num_significand_bits
<T
>());
1251 if (exponent
!= 0) { // Check if normal.
1252 exponent
-= exponent_bias
<T
>() + num_significand_bits
<T
>();
1254 // Shorter interval case; proceed like Schubfach.
1255 // In fact, when exponent == 1 and significand == 0, the interval is
1256 // regular. However, it can be shown that the end-results are anyway same.
1257 if (significand
== 0) return shorter_interval_case
<T
>(exponent
);
1259 significand
|= (static_cast<carrier_uint
>(1) << num_significand_bits
<T
>());
1261 // Subnormal case; the interval is always regular.
1262 if (significand
== 0) return {0, 0};
1264 std::numeric_limits
<T
>::min_exponent
- num_significand_bits
<T
>() - 1;
1267 const bool include_left_endpoint
= (significand
% 2 == 0);
1268 const bool include_right_endpoint
= include_left_endpoint
;
1270 // Compute k and beta.
1271 const int minus_k
= floor_log10_pow2(exponent
) - float_info
<T
>::kappa
;
1272 const cache_entry_type cache
= cache_accessor
<T
>::get_cached_power(-minus_k
);
1273 const int beta
= exponent
+ floor_log2_pow10(-minus_k
);
1275 // Compute zi and deltai.
1276 // 10^kappa <= deltai < 10^(kappa + 1)
1277 const uint32_t deltai
= cache_accessor
<T
>::compute_delta(cache
, beta
);
1278 const carrier_uint two_fc
= significand
<< 1;
1280 // For the case of binary32, the result of integer check is not correct for
1282 // = 6.1442653300000000008655037797566933477355632930994033813476... * 10^-18
1283 // and 29711844 * 2^-81
1284 // = 1.2288530660000000001731007559513386695471126586198806762695... * 10^-17,
1285 // and they are the unique counterexamples. However, since 29711844 is even,
1286 // this does not cause any problem for the endpoints calculations; it can only
1287 // cause a problem when we need to perform integer check for the center.
1288 // Fortunately, with these inputs, that branch is never executed, so we are
1290 const typename cache_accessor
<T
>::compute_mul_result z_mul
=
1291 cache_accessor
<T
>::compute_mul((two_fc
| 1) << beta
, cache
);
1293 // Step 2: Try larger divisor; remove trailing zeros if necessary.
1295 // Using an upper bound on zi, we might be able to optimize the division
1296 // better than the compiler; we are computing zi / big_divisor here.
1297 decimal_fp
<T
> ret_value
;
1298 ret_value
.significand
= divide_by_10_to_kappa_plus_1(z_mul
.result
);
1299 uint32_t r
= static_cast<uint32_t>(z_mul
.result
- float_info
<T
>::big_divisor
*
1300 ret_value
.significand
);
1303 // Exclude the right endpoint if necessary.
1304 if (r
== 0 && (z_mul
.is_integer
& !include_right_endpoint
)) {
1305 --ret_value
.significand
;
1306 r
= float_info
<T
>::big_divisor
;
1307 goto small_divisor_case_label
;
1309 } else if (r
> deltai
) {
1310 goto small_divisor_case_label
;
1312 // r == deltai; compare fractional parts.
1313 const typename cache_accessor
<T
>::compute_mul_parity_result x_mul
=
1314 cache_accessor
<T
>::compute_mul_parity(two_fc
- 1, cache
, beta
);
1316 if (!(x_mul
.parity
| (x_mul
.is_integer
& include_left_endpoint
)))
1317 goto small_divisor_case_label
;
1319 ret_value
.exponent
= minus_k
+ float_info
<T
>::kappa
+ 1;
1321 // We may need to remove trailing zeros.
1322 ret_value
.exponent
+= remove_trailing_zeros(ret_value
.significand
);
1325 // Step 3: Find the significand with the smaller divisor.
1327 small_divisor_case_label
:
1328 ret_value
.significand
*= 10;
1329 ret_value
.exponent
= minus_k
+ float_info
<T
>::kappa
;
1331 uint32_t dist
= r
- (deltai
/ 2) + (float_info
<T
>::small_divisor
/ 2);
1332 const bool approx_y_parity
=
1333 ((dist
^ (float_info
<T
>::small_divisor
/ 2)) & 1) != 0;
1335 // Is dist divisible by 10^kappa?
1336 const bool divisible_by_small_divisor
=
1337 check_divisibility_and_divide_by_pow10
<float_info
<T
>::kappa
>(dist
);
1339 // Add dist / 10^kappa to the significand.
1340 ret_value
.significand
+= dist
;
1342 if (!divisible_by_small_divisor
) return ret_value
;
1344 // Check z^(f) >= epsilon^(f).
1345 // We have either yi == zi - epsiloni or yi == (zi - epsiloni) - 1,
1346 // where yi == zi - epsiloni if and only if z^(f) >= epsilon^(f).
1347 // Since there are only 2 possibilities, we only need to care about the
1348 // parity. Also, zi and r should have the same parity since the divisor
1349 // is an even number.
1350 const auto y_mul
= cache_accessor
<T
>::compute_mul_parity(two_fc
, cache
, beta
);
1352 // If z^(f) >= epsilon^(f), we might have a tie when z^(f) == epsilon^(f),
1353 // or equivalently, when y is an integer.
1354 if (y_mul
.parity
!= approx_y_parity
)
1355 --ret_value
.significand
;
1356 else if (y_mul
.is_integer
& (ret_value
.significand
% 2 != 0))
1357 --ret_value
.significand
;
1360 } // namespace dragonbox
1361 } // namespace detail
1363 template <> struct formatter
<detail::bigint
> {
1364 FMT_CONSTEXPR
auto parse(format_parse_context
& ctx
)
1365 -> format_parse_context::iterator
{
1369 auto format(const detail::bigint
& n
, format_context
& ctx
) const
1370 -> format_context::iterator
{
1371 auto out
= ctx
.out();
1373 for (auto i
= n
.bigits_
.size(); i
> 0; --i
) {
1374 auto value
= n
.bigits_
[i
- 1u];
1376 out
= format_to(out
, FMT_STRING("{:x}"), value
);
1380 out
= format_to(out
, FMT_STRING("{:08x}"), value
);
1383 out
= format_to(out
, FMT_STRING("p{}"),
1384 n
.exp_
* detail::bigint::bigit_bits
);
1389 FMT_FUNC
detail::utf8_to_utf16::utf8_to_utf16(string_view s
) {
1390 for_each_codepoint(s
, [this](uint32_t cp
, string_view
) {
1391 if (cp
== invalid_code_point
) FMT_THROW(std::runtime_error("invalid utf8"));
1393 buffer_
.push_back(static_cast<wchar_t>(cp
));
1396 buffer_
.push_back(static_cast<wchar_t>(0xD800 + (cp
>> 10)));
1397 buffer_
.push_back(static_cast<wchar_t>(0xDC00 + (cp
& 0x3FF)));
1401 buffer_
.push_back(0);
1404 FMT_FUNC
void format_system_error(detail::buffer
<char>& out
, int error_code
,
1405 const char* message
) noexcept
{
1407 auto ec
= std::error_code(error_code
, std::generic_category());
1408 write(std::back_inserter(out
), std::system_error(ec
, message
).what());
1412 format_error_code(out
, error_code
, message
);
1415 FMT_FUNC
void report_system_error(int error_code
,
1416 const char* message
) noexcept
{
1417 report_error(format_system_error
, error_code
, message
);
1420 FMT_FUNC
std::string
vformat(string_view fmt
, format_args args
) {
1421 // Don't optimize the "{}" case to keep the binary size small and because it
1422 // can be better optimized in fmt::format anyway.
1423 auto buffer
= memory_buffer();
1424 detail::vformat_to(buffer
, fmt
, args
);
1425 return to_string(buffer
);
1430 FMT_FUNC
bool write_console(std::FILE*, string_view
) { return false; }
1432 using dword
= conditional_t
<sizeof(long) == 4, unsigned long, unsigned>;
1433 extern "C" __declspec(dllimport
) int __stdcall
WriteConsoleW( //
1434 void*, const void*, dword
, dword
*, void*);
1436 FMT_FUNC
bool write_console(std::FILE* f
, string_view text
) {
1437 auto fd
= _fileno(f
);
1438 if (!_isatty(fd
)) return false;
1439 auto u16
= utf8_to_utf16(text
);
1440 auto written
= dword();
1441 return WriteConsoleW(reinterpret_cast<void*>(_get_osfhandle(fd
)), u16
.c_str(),
1442 static_cast<uint32_t>(u16
.size()), &written
, nullptr) != 0;
1445 // Print assuming legacy (non-Unicode) encoding.
1446 FMT_FUNC
void vprint_mojibake(std::FILE* f
, string_view fmt
, format_args args
) {
1447 auto buffer
= memory_buffer();
1448 detail::vformat_to(buffer
, fmt
,
1449 basic_format_args
<buffer_context
<char>>(args
));
1450 fwrite_fully(buffer
.data(), 1, buffer
.size(), f
);
1454 FMT_FUNC
void print(std::FILE* f
, string_view text
) {
1455 if (!write_console(f
, text
)) fwrite_fully(text
.data(), 1, text
.size(), f
);
1457 } // namespace detail
1459 FMT_FUNC
void vprint(std::FILE* f
, string_view fmt
, format_args args
) {
1460 auto buffer
= memory_buffer();
1461 detail::vformat_to(buffer
, fmt
, args
);
1462 detail::print(f
, {buffer
.data(), buffer
.size()});
1465 FMT_FUNC
void vprint(string_view fmt
, format_args args
) {
1466 vprint(stdout
, fmt
, args
);
1472 unsigned char upper
;
1473 unsigned char lower_count
;
1476 inline auto is_printable(uint16_t x
, const singleton
* singletons
,
1477 size_t singletons_size
,
1478 const unsigned char* singleton_lowers
,
1479 const unsigned char* normal
, size_t normal_size
)
1481 auto upper
= x
>> 8;
1482 auto lower_start
= 0;
1483 for (size_t i
= 0; i
< singletons_size
; ++i
) {
1484 auto s
= singletons
[i
];
1485 auto lower_end
= lower_start
+ s
.lower_count
;
1486 if (upper
< s
.upper
) break;
1487 if (upper
== s
.upper
) {
1488 for (auto j
= lower_start
; j
< lower_end
; ++j
) {
1489 if (singleton_lowers
[j
] == (x
& 0xff)) return false;
1492 lower_start
= lower_end
;
1495 auto xsigned
= static_cast<int>(x
);
1496 auto current
= true;
1497 for (size_t i
= 0; i
< normal_size
; ++i
) {
1498 auto v
= static_cast<int>(normal
[i
]);
1499 auto len
= (v
& 0x80) != 0 ? (v
& 0x7f) << 8 | normal
[++i
] : v
;
1501 if (xsigned
< 0) break;
1507 // This code is generated by support/printable.py.
1508 FMT_FUNC
auto is_printable(uint32_t cp
) -> bool {
1509 static constexpr singleton singletons0
[] = {
1510 {0x00, 1}, {0x03, 5}, {0x05, 6}, {0x06, 3}, {0x07, 6}, {0x08, 8},
1511 {0x09, 17}, {0x0a, 28}, {0x0b, 25}, {0x0c, 20}, {0x0d, 16}, {0x0e, 13},
1512 {0x0f, 4}, {0x10, 3}, {0x12, 18}, {0x13, 9}, {0x16, 1}, {0x17, 5},
1513 {0x18, 2}, {0x19, 3}, {0x1a, 7}, {0x1c, 2}, {0x1d, 1}, {0x1f, 22},
1514 {0x20, 3}, {0x2b, 3}, {0x2c, 2}, {0x2d, 11}, {0x2e, 1}, {0x30, 3},
1515 {0x31, 2}, {0x32, 1}, {0xa7, 2}, {0xa9, 2}, {0xaa, 4}, {0xab, 8},
1516 {0xfa, 2}, {0xfb, 5}, {0xfd, 4}, {0xfe, 3}, {0xff, 9},
1518 static constexpr unsigned char singletons0_lower
[] = {
1519 0xad, 0x78, 0x79, 0x8b, 0x8d, 0xa2, 0x30, 0x57, 0x58, 0x8b, 0x8c, 0x90,
1520 0x1c, 0x1d, 0xdd, 0x0e, 0x0f, 0x4b, 0x4c, 0xfb, 0xfc, 0x2e, 0x2f, 0x3f,
1521 0x5c, 0x5d, 0x5f, 0xb5, 0xe2, 0x84, 0x8d, 0x8e, 0x91, 0x92, 0xa9, 0xb1,
1522 0xba, 0xbb, 0xc5, 0xc6, 0xc9, 0xca, 0xde, 0xe4, 0xe5, 0xff, 0x00, 0x04,
1523 0x11, 0x12, 0x29, 0x31, 0x34, 0x37, 0x3a, 0x3b, 0x3d, 0x49, 0x4a, 0x5d,
1524 0x84, 0x8e, 0x92, 0xa9, 0xb1, 0xb4, 0xba, 0xbb, 0xc6, 0xca, 0xce, 0xcf,
1525 0xe4, 0xe5, 0x00, 0x04, 0x0d, 0x0e, 0x11, 0x12, 0x29, 0x31, 0x34, 0x3a,
1526 0x3b, 0x45, 0x46, 0x49, 0x4a, 0x5e, 0x64, 0x65, 0x84, 0x91, 0x9b, 0x9d,
1527 0xc9, 0xce, 0xcf, 0x0d, 0x11, 0x29, 0x45, 0x49, 0x57, 0x64, 0x65, 0x8d,
1528 0x91, 0xa9, 0xb4, 0xba, 0xbb, 0xc5, 0xc9, 0xdf, 0xe4, 0xe5, 0xf0, 0x0d,
1529 0x11, 0x45, 0x49, 0x64, 0x65, 0x80, 0x84, 0xb2, 0xbc, 0xbe, 0xbf, 0xd5,
1530 0xd7, 0xf0, 0xf1, 0x83, 0x85, 0x8b, 0xa4, 0xa6, 0xbe, 0xbf, 0xc5, 0xc7,
1531 0xce, 0xcf, 0xda, 0xdb, 0x48, 0x98, 0xbd, 0xcd, 0xc6, 0xce, 0xcf, 0x49,
1532 0x4e, 0x4f, 0x57, 0x59, 0x5e, 0x5f, 0x89, 0x8e, 0x8f, 0xb1, 0xb6, 0xb7,
1533 0xbf, 0xc1, 0xc6, 0xc7, 0xd7, 0x11, 0x16, 0x17, 0x5b, 0x5c, 0xf6, 0xf7,
1534 0xfe, 0xff, 0x80, 0x0d, 0x6d, 0x71, 0xde, 0xdf, 0x0e, 0x0f, 0x1f, 0x6e,
1535 0x6f, 0x1c, 0x1d, 0x5f, 0x7d, 0x7e, 0xae, 0xaf, 0xbb, 0xbc, 0xfa, 0x16,
1536 0x17, 0x1e, 0x1f, 0x46, 0x47, 0x4e, 0x4f, 0x58, 0x5a, 0x5c, 0x5e, 0x7e,
1537 0x7f, 0xb5, 0xc5, 0xd4, 0xd5, 0xdc, 0xf0, 0xf1, 0xf5, 0x72, 0x73, 0x8f,
1538 0x74, 0x75, 0x96, 0x2f, 0x5f, 0x26, 0x2e, 0x2f, 0xa7, 0xaf, 0xb7, 0xbf,
1539 0xc7, 0xcf, 0xd7, 0xdf, 0x9a, 0x40, 0x97, 0x98, 0x30, 0x8f, 0x1f, 0xc0,
1540 0xc1, 0xce, 0xff, 0x4e, 0x4f, 0x5a, 0x5b, 0x07, 0x08, 0x0f, 0x10, 0x27,
1541 0x2f, 0xee, 0xef, 0x6e, 0x6f, 0x37, 0x3d, 0x3f, 0x42, 0x45, 0x90, 0x91,
1542 0xfe, 0xff, 0x53, 0x67, 0x75, 0xc8, 0xc9, 0xd0, 0xd1, 0xd8, 0xd9, 0xe7,
1545 static constexpr singleton singletons1
[] = {
1546 {0x00, 6}, {0x01, 1}, {0x03, 1}, {0x04, 2}, {0x08, 8}, {0x09, 2},
1547 {0x0a, 5}, {0x0b, 2}, {0x0e, 4}, {0x10, 1}, {0x11, 2}, {0x12, 5},
1548 {0x13, 17}, {0x14, 1}, {0x15, 2}, {0x17, 2}, {0x19, 13}, {0x1c, 5},
1549 {0x1d, 8}, {0x24, 1}, {0x6a, 3}, {0x6b, 2}, {0xbc, 2}, {0xd1, 2},
1550 {0xd4, 12}, {0xd5, 9}, {0xd6, 2}, {0xd7, 2}, {0xda, 1}, {0xe0, 5},
1551 {0xe1, 2}, {0xe8, 2}, {0xee, 32}, {0xf0, 4}, {0xf8, 2}, {0xf9, 2},
1552 {0xfa, 2}, {0xfb, 1},
1554 static constexpr unsigned char singletons1_lower
[] = {
1555 0x0c, 0x27, 0x3b, 0x3e, 0x4e, 0x4f, 0x8f, 0x9e, 0x9e, 0x9f, 0x06, 0x07,
1556 0x09, 0x36, 0x3d, 0x3e, 0x56, 0xf3, 0xd0, 0xd1, 0x04, 0x14, 0x18, 0x36,
1557 0x37, 0x56, 0x57, 0x7f, 0xaa, 0xae, 0xaf, 0xbd, 0x35, 0xe0, 0x12, 0x87,
1558 0x89, 0x8e, 0x9e, 0x04, 0x0d, 0x0e, 0x11, 0x12, 0x29, 0x31, 0x34, 0x3a,
1559 0x45, 0x46, 0x49, 0x4a, 0x4e, 0x4f, 0x64, 0x65, 0x5c, 0xb6, 0xb7, 0x1b,
1560 0x1c, 0x07, 0x08, 0x0a, 0x0b, 0x14, 0x17, 0x36, 0x39, 0x3a, 0xa8, 0xa9,
1561 0xd8, 0xd9, 0x09, 0x37, 0x90, 0x91, 0xa8, 0x07, 0x0a, 0x3b, 0x3e, 0x66,
1562 0x69, 0x8f, 0x92, 0x6f, 0x5f, 0xee, 0xef, 0x5a, 0x62, 0x9a, 0x9b, 0x27,
1563 0x28, 0x55, 0x9d, 0xa0, 0xa1, 0xa3, 0xa4, 0xa7, 0xa8, 0xad, 0xba, 0xbc,
1564 0xc4, 0x06, 0x0b, 0x0c, 0x15, 0x1d, 0x3a, 0x3f, 0x45, 0x51, 0xa6, 0xa7,
1565 0xcc, 0xcd, 0xa0, 0x07, 0x19, 0x1a, 0x22, 0x25, 0x3e, 0x3f, 0xc5, 0xc6,
1566 0x04, 0x20, 0x23, 0x25, 0x26, 0x28, 0x33, 0x38, 0x3a, 0x48, 0x4a, 0x4c,
1567 0x50, 0x53, 0x55, 0x56, 0x58, 0x5a, 0x5c, 0x5e, 0x60, 0x63, 0x65, 0x66,
1568 0x6b, 0x73, 0x78, 0x7d, 0x7f, 0x8a, 0xa4, 0xaa, 0xaf, 0xb0, 0xc0, 0xd0,
1569 0xae, 0xaf, 0x79, 0xcc, 0x6e, 0x6f, 0x93,
1571 static constexpr unsigned char normal0
[] = {
1572 0x00, 0x20, 0x5f, 0x22, 0x82, 0xdf, 0x04, 0x82, 0x44, 0x08, 0x1b, 0x04,
1573 0x06, 0x11, 0x81, 0xac, 0x0e, 0x80, 0xab, 0x35, 0x28, 0x0b, 0x80, 0xe0,
1574 0x03, 0x19, 0x08, 0x01, 0x04, 0x2f, 0x04, 0x34, 0x04, 0x07, 0x03, 0x01,
1575 0x07, 0x06, 0x07, 0x11, 0x0a, 0x50, 0x0f, 0x12, 0x07, 0x55, 0x07, 0x03,
1576 0x04, 0x1c, 0x0a, 0x09, 0x03, 0x08, 0x03, 0x07, 0x03, 0x02, 0x03, 0x03,
1577 0x03, 0x0c, 0x04, 0x05, 0x03, 0x0b, 0x06, 0x01, 0x0e, 0x15, 0x05, 0x3a,
1578 0x03, 0x11, 0x07, 0x06, 0x05, 0x10, 0x07, 0x57, 0x07, 0x02, 0x07, 0x15,
1579 0x0d, 0x50, 0x04, 0x43, 0x03, 0x2d, 0x03, 0x01, 0x04, 0x11, 0x06, 0x0f,
1580 0x0c, 0x3a, 0x04, 0x1d, 0x25, 0x5f, 0x20, 0x6d, 0x04, 0x6a, 0x25, 0x80,
1581 0xc8, 0x05, 0x82, 0xb0, 0x03, 0x1a, 0x06, 0x82, 0xfd, 0x03, 0x59, 0x07,
1582 0x15, 0x0b, 0x17, 0x09, 0x14, 0x0c, 0x14, 0x0c, 0x6a, 0x06, 0x0a, 0x06,
1583 0x1a, 0x06, 0x59, 0x07, 0x2b, 0x05, 0x46, 0x0a, 0x2c, 0x04, 0x0c, 0x04,
1584 0x01, 0x03, 0x31, 0x0b, 0x2c, 0x04, 0x1a, 0x06, 0x0b, 0x03, 0x80, 0xac,
1585 0x06, 0x0a, 0x06, 0x21, 0x3f, 0x4c, 0x04, 0x2d, 0x03, 0x74, 0x08, 0x3c,
1586 0x03, 0x0f, 0x03, 0x3c, 0x07, 0x38, 0x08, 0x2b, 0x05, 0x82, 0xff, 0x11,
1587 0x18, 0x08, 0x2f, 0x11, 0x2d, 0x03, 0x20, 0x10, 0x21, 0x0f, 0x80, 0x8c,
1588 0x04, 0x82, 0x97, 0x19, 0x0b, 0x15, 0x88, 0x94, 0x05, 0x2f, 0x05, 0x3b,
1589 0x07, 0x02, 0x0e, 0x18, 0x09, 0x80, 0xb3, 0x2d, 0x74, 0x0c, 0x80, 0xd6,
1590 0x1a, 0x0c, 0x05, 0x80, 0xff, 0x05, 0x80, 0xdf, 0x0c, 0xee, 0x0d, 0x03,
1591 0x84, 0x8d, 0x03, 0x37, 0x09, 0x81, 0x5c, 0x14, 0x80, 0xb8, 0x08, 0x80,
1592 0xcb, 0x2a, 0x38, 0x03, 0x0a, 0x06, 0x38, 0x08, 0x46, 0x08, 0x0c, 0x06,
1593 0x74, 0x0b, 0x1e, 0x03, 0x5a, 0x04, 0x59, 0x09, 0x80, 0x83, 0x18, 0x1c,
1594 0x0a, 0x16, 0x09, 0x4c, 0x04, 0x80, 0x8a, 0x06, 0xab, 0xa4, 0x0c, 0x17,
1595 0x04, 0x31, 0xa1, 0x04, 0x81, 0xda, 0x26, 0x07, 0x0c, 0x05, 0x05, 0x80,
1596 0xa5, 0x11, 0x81, 0x6d, 0x10, 0x78, 0x28, 0x2a, 0x06, 0x4c, 0x04, 0x80,
1597 0x8d, 0x04, 0x80, 0xbe, 0x03, 0x1b, 0x03, 0x0f, 0x0d,
1599 static constexpr unsigned char normal1
[] = {
1600 0x5e, 0x22, 0x7b, 0x05, 0x03, 0x04, 0x2d, 0x03, 0x66, 0x03, 0x01, 0x2f,
1601 0x2e, 0x80, 0x82, 0x1d, 0x03, 0x31, 0x0f, 0x1c, 0x04, 0x24, 0x09, 0x1e,
1602 0x05, 0x2b, 0x05, 0x44, 0x04, 0x0e, 0x2a, 0x80, 0xaa, 0x06, 0x24, 0x04,
1603 0x24, 0x04, 0x28, 0x08, 0x34, 0x0b, 0x01, 0x80, 0x90, 0x81, 0x37, 0x09,
1604 0x16, 0x0a, 0x08, 0x80, 0x98, 0x39, 0x03, 0x63, 0x08, 0x09, 0x30, 0x16,
1605 0x05, 0x21, 0x03, 0x1b, 0x05, 0x01, 0x40, 0x38, 0x04, 0x4b, 0x05, 0x2f,
1606 0x04, 0x0a, 0x07, 0x09, 0x07, 0x40, 0x20, 0x27, 0x04, 0x0c, 0x09, 0x36,
1607 0x03, 0x3a, 0x05, 0x1a, 0x07, 0x04, 0x0c, 0x07, 0x50, 0x49, 0x37, 0x33,
1608 0x0d, 0x33, 0x07, 0x2e, 0x08, 0x0a, 0x81, 0x26, 0x52, 0x4e, 0x28, 0x08,
1609 0x2a, 0x56, 0x1c, 0x14, 0x17, 0x09, 0x4e, 0x04, 0x1e, 0x0f, 0x43, 0x0e,
1610 0x19, 0x07, 0x0a, 0x06, 0x48, 0x08, 0x27, 0x09, 0x75, 0x0b, 0x3f, 0x41,
1611 0x2a, 0x06, 0x3b, 0x05, 0x0a, 0x06, 0x51, 0x06, 0x01, 0x05, 0x10, 0x03,
1612 0x05, 0x80, 0x8b, 0x62, 0x1e, 0x48, 0x08, 0x0a, 0x80, 0xa6, 0x5e, 0x22,
1613 0x45, 0x0b, 0x0a, 0x06, 0x0d, 0x13, 0x39, 0x07, 0x0a, 0x36, 0x2c, 0x04,
1614 0x10, 0x80, 0xc0, 0x3c, 0x64, 0x53, 0x0c, 0x48, 0x09, 0x0a, 0x46, 0x45,
1615 0x1b, 0x48, 0x08, 0x53, 0x1d, 0x39, 0x81, 0x07, 0x46, 0x0a, 0x1d, 0x03,
1616 0x47, 0x49, 0x37, 0x03, 0x0e, 0x08, 0x0a, 0x06, 0x39, 0x07, 0x0a, 0x81,
1617 0x36, 0x19, 0x80, 0xb7, 0x01, 0x0f, 0x32, 0x0d, 0x83, 0x9b, 0x66, 0x75,
1618 0x0b, 0x80, 0xc4, 0x8a, 0xbc, 0x84, 0x2f, 0x8f, 0xd1, 0x82, 0x47, 0xa1,
1619 0xb9, 0x82, 0x39, 0x07, 0x2a, 0x04, 0x02, 0x60, 0x26, 0x0a, 0x46, 0x0a,
1620 0x28, 0x05, 0x13, 0x82, 0xb0, 0x5b, 0x65, 0x4b, 0x04, 0x39, 0x07, 0x11,
1621 0x40, 0x05, 0x0b, 0x02, 0x0e, 0x97, 0xf8, 0x08, 0x84, 0xd6, 0x2a, 0x09,
1622 0xa2, 0xf7, 0x81, 0x1f, 0x31, 0x03, 0x11, 0x04, 0x08, 0x81, 0x8c, 0x89,
1623 0x04, 0x6b, 0x05, 0x0d, 0x03, 0x09, 0x07, 0x10, 0x93, 0x60, 0x80, 0xf6,
1624 0x0a, 0x73, 0x08, 0x6e, 0x17, 0x46, 0x80, 0x9a, 0x14, 0x0c, 0x57, 0x09,
1625 0x19, 0x80, 0x87, 0x81, 0x47, 0x03, 0x85, 0x42, 0x0f, 0x15, 0x85, 0x50,
1626 0x2b, 0x80, 0xd5, 0x2d, 0x03, 0x1a, 0x04, 0x02, 0x81, 0x70, 0x3a, 0x05,
1627 0x01, 0x85, 0x00, 0x80, 0xd7, 0x29, 0x4c, 0x04, 0x0a, 0x04, 0x02, 0x83,
1628 0x11, 0x44, 0x4c, 0x3d, 0x80, 0xc2, 0x3c, 0x06, 0x01, 0x04, 0x55, 0x05,
1629 0x1b, 0x34, 0x02, 0x81, 0x0e, 0x2c, 0x04, 0x64, 0x0c, 0x56, 0x0a, 0x80,
1630 0xae, 0x38, 0x1d, 0x0d, 0x2c, 0x04, 0x09, 0x07, 0x02, 0x0e, 0x06, 0x80,
1631 0x9a, 0x83, 0xd8, 0x08, 0x0d, 0x03, 0x0d, 0x03, 0x74, 0x0c, 0x59, 0x07,
1632 0x0c, 0x14, 0x0c, 0x04, 0x38, 0x08, 0x0a, 0x06, 0x28, 0x08, 0x22, 0x4e,
1633 0x81, 0x54, 0x0c, 0x15, 0x03, 0x03, 0x05, 0x07, 0x09, 0x19, 0x07, 0x07,
1634 0x09, 0x03, 0x0d, 0x07, 0x29, 0x80, 0xcb, 0x25, 0x0a, 0x84, 0x06,
1636 auto lower
= static_cast<uint16_t>(cp
);
1638 return is_printable(lower
, singletons0
,
1639 sizeof(singletons0
) / sizeof(*singletons0
),
1640 singletons0_lower
, normal0
, sizeof(normal0
));
1643 return is_printable(lower
, singletons1
,
1644 sizeof(singletons1
) / sizeof(*singletons1
),
1645 singletons1_lower
, normal1
, sizeof(normal1
));
1647 if (0x2a6de <= cp
&& cp
< 0x2a700) return false;
1648 if (0x2b735 <= cp
&& cp
< 0x2b740) return false;
1649 if (0x2b81e <= cp
&& cp
< 0x2b820) return false;
1650 if (0x2cea2 <= cp
&& cp
< 0x2ceb0) return false;
1651 if (0x2ebe1 <= cp
&& cp
< 0x2f800) return false;
1652 if (0x2fa1e <= cp
&& cp
< 0x30000) return false;
1653 if (0x3134b <= cp
&& cp
< 0xe0100) return false;
1654 if (0xe01f0 <= cp
&& cp
< 0x110000) return false;
1655 return cp
< 0x110000;
1658 } // namespace detail
1662 #endif // FMT_FORMAT_INL_H_