mirror of
https://github.com/fmtlib/fmt.git
synced 2025-02-28 16:11:28 +00:00
Merge min_digits and max_digits
This commit is contained in:
parent
2924622157
commit
dda47c9466
@ -560,8 +560,7 @@ FMT_FUNC char *write_exponent(char *buffer, int exp) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct gen_digits_params {
|
struct gen_digits_params {
|
||||||
unsigned min_digits;
|
unsigned num_digits;
|
||||||
unsigned max_digits;
|
|
||||||
bool fixed;
|
bool fixed;
|
||||||
bool upper;
|
bool upper;
|
||||||
bool trailing_zeros;
|
bool trailing_zeros;
|
||||||
@ -569,7 +568,7 @@ struct gen_digits_params {
|
|||||||
// Creates digit generation parameters from format specifiers for a number in
|
// Creates digit generation parameters from format specifiers for a number in
|
||||||
// the range [pow(10, exp - 1), pow(10, exp) or 0 if exp == 1.
|
// the range [pow(10, exp - 1), pow(10, exp) or 0 if exp == 1.
|
||||||
gen_digits_params(const core_format_specs &specs, int exp)
|
gen_digits_params(const core_format_specs &specs, int exp)
|
||||||
: min_digits(specs.precision >= 0 ? to_unsigned(specs.precision) : 6),
|
: num_digits(specs.precision >= 0 ? to_unsigned(specs.precision) : 6),
|
||||||
fixed(false), upper(false), trailing_zeros(false) {
|
fixed(false), upper(false), trailing_zeros(false) {
|
||||||
switch (specs.type) {
|
switch (specs.type) {
|
||||||
case 'G':
|
case 'G':
|
||||||
@ -577,10 +576,10 @@ struct gen_digits_params {
|
|||||||
FMT_FALLTHROUGH
|
FMT_FALLTHROUGH
|
||||||
case '\0': case 'g':
|
case '\0': case 'g':
|
||||||
trailing_zeros = (specs.flags & HASH_FLAG) != 0;
|
trailing_zeros = (specs.flags & HASH_FLAG) != 0;
|
||||||
if (-4 <= exp && exp < static_cast<int>(min_digits) + 1) {
|
if (-4 <= exp && exp < static_cast<int>(num_digits) + 1) {
|
||||||
fixed = true;
|
fixed = true;
|
||||||
if (!specs.type && trailing_zeros && exp >= 0)
|
if (!specs.type && trailing_zeros && exp >= 0)
|
||||||
min_digits = to_unsigned(exp) + 1;
|
num_digits = to_unsigned(exp) + 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'F':
|
case 'F':
|
||||||
@ -589,19 +588,18 @@ struct gen_digits_params {
|
|||||||
case 'f': {
|
case 'f': {
|
||||||
fixed = true;
|
fixed = true;
|
||||||
trailing_zeros = true;
|
trailing_zeros = true;
|
||||||
int adjusted_min_digits = static_cast<int>(min_digits) + exp;
|
int adjusted_min_digits = static_cast<int>(num_digits) + exp;
|
||||||
if (adjusted_min_digits > 0)
|
if (adjusted_min_digits > 0)
|
||||||
min_digits = to_unsigned(adjusted_min_digits);
|
num_digits = to_unsigned(adjusted_min_digits);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'E':
|
case 'E':
|
||||||
upper = true;
|
upper = true;
|
||||||
FMT_FALLTHROUGH
|
FMT_FALLTHROUGH
|
||||||
case 'e':
|
case 'e':
|
||||||
++min_digits;
|
++num_digits;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
max_digits = min_digits;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -613,10 +611,10 @@ FMT_FUNC void format_float(char *buffer, size_t &size, int exp,
|
|||||||
std::memmove(buffer + 2, buffer + 1, size - 1);
|
std::memmove(buffer + 2, buffer + 1, size - 1);
|
||||||
buffer[1] = '.';
|
buffer[1] = '.';
|
||||||
exp += static_cast<int>(size) - 1;
|
exp += static_cast<int>(size) - 1;
|
||||||
if (size < params.min_digits) {
|
if (size < params.num_digits) {
|
||||||
std::uninitialized_fill_n(buffer + size + 1,
|
std::uninitialized_fill_n(buffer + size + 1,
|
||||||
params.min_digits - size, '0');
|
params.num_digits - size, '0');
|
||||||
size = params.min_digits;
|
size = params.num_digits;
|
||||||
}
|
}
|
||||||
char *p = buffer + size + 1;
|
char *p = buffer + size + 1;
|
||||||
*p++ = params.upper ? 'E' : 'e';
|
*p++ = params.upper ? 'E' : 'e';
|
||||||
@ -631,7 +629,7 @@ FMT_FUNC void format_float(char *buffer, size_t &size, int exp,
|
|||||||
// 1234e7 -> 12340000000[.0+]
|
// 1234e7 -> 12340000000[.0+]
|
||||||
std::uninitialized_fill_n(buffer + int_size, full_exp - int_size, '0');
|
std::uninitialized_fill_n(buffer + int_size, full_exp - int_size, '0');
|
||||||
char *p = buffer + full_exp;
|
char *p = buffer + full_exp;
|
||||||
int num_zeros = static_cast<int>(params.min_digits) - full_exp;
|
int num_zeros = static_cast<int>(params.num_digits) - full_exp;
|
||||||
if (num_zeros > 0 && params.trailing_zeros) {
|
if (num_zeros > 0 && params.trailing_zeros) {
|
||||||
*p++ = '.';
|
*p++ = '.';
|
||||||
std::uninitialized_fill_n(p, num_zeros, '0');
|
std::uninitialized_fill_n(p, num_zeros, '0');
|
||||||
@ -648,9 +646,9 @@ FMT_FUNC void format_float(char *buffer, size_t &size, int exp,
|
|||||||
if (!params.trailing_zeros) {
|
if (!params.trailing_zeros) {
|
||||||
// Remove trailing zeros.
|
// Remove trailing zeros.
|
||||||
while (buffer[size - 1] == '0') --size;
|
while (buffer[size - 1] == '0') --size;
|
||||||
} else if (params.min_digits >= size) {
|
} else if (params.num_digits >= size) {
|
||||||
// Add trailing zeros.
|
// Add trailing zeros.
|
||||||
size_t num_zeros = params.min_digits - size + 1;
|
size_t num_zeros = params.num_digits - size + 1;
|
||||||
std::uninitialized_fill_n(buffer + size, num_zeros, '0');
|
std::uninitialized_fill_n(buffer + size, num_zeros, '0');
|
||||||
size += to_unsigned(num_zeros);
|
size += to_unsigned(num_zeros);
|
||||||
}
|
}
|
||||||
@ -671,10 +669,9 @@ FMT_FUNC typename std::enable_if<sizeof(Double) == sizeof(uint64_t), bool>::type
|
|||||||
FMT_ASSERT(value >= 0, "value is negative");
|
FMT_ASSERT(value >= 0, "value is negative");
|
||||||
char *buffer = buf.data();
|
char *buffer = buf.data();
|
||||||
if (value == 0) {
|
if (value == 0) {
|
||||||
gen_digits_params params(specs, 1);
|
|
||||||
*buffer = '0';
|
*buffer = '0';
|
||||||
size_t size = 1;
|
size_t size = 1;
|
||||||
format_float(buffer, size, 0, params);
|
format_float(buffer, size, 0, gen_digits_params(specs, 1));
|
||||||
FMT_ASSERT(buf.capacity() >= size, "");
|
FMT_ASSERT(buf.capacity() >= size, "");
|
||||||
buf.resize(size);
|
buf.resize(size);
|
||||||
return true;
|
return true;
|
||||||
@ -709,7 +706,7 @@ FMT_FUNC typename std::enable_if<sizeof(Double) == sizeof(uint64_t), bool>::type
|
|||||||
uint64_t lo = upper.f & (one.f - 1);
|
uint64_t lo = upper.f & (one.f - 1);
|
||||||
size_t size = 0;
|
size_t size = 0;
|
||||||
if (!grisu2_gen_digits(buffer, size, hi, lo, exp, delta, one, diff,
|
if (!grisu2_gen_digits(buffer, size, hi, lo, exp, delta, one, diff,
|
||||||
params.max_digits)) {
|
params.num_digits)) {
|
||||||
buf.clear();
|
buf.clear();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user