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