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