mirror of
https://github.com/fmtlib/fmt.git
synced 2025-08-03 12:44:49 +02:00
Remove gen_digits_params
This commit is contained in:
@@ -1070,20 +1070,15 @@ enum class float_format {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct float_spec {
|
struct float_spec {
|
||||||
|
int precision;
|
||||||
float_format format;
|
float_format format;
|
||||||
|
sign_t sign : 3;
|
||||||
bool upper;
|
bool upper;
|
||||||
bool locale;
|
bool locale;
|
||||||
bool percent;
|
bool percent;
|
||||||
bool alt;
|
bool alt;
|
||||||
bool binary32;
|
bool binary32;
|
||||||
bool use_grisu;
|
bool use_grisu;
|
||||||
};
|
|
||||||
|
|
||||||
struct gen_digits_params {
|
|
||||||
int num_digits;
|
|
||||||
sign_t sign : 3;
|
|
||||||
float_format format;
|
|
||||||
bool upper;
|
|
||||||
bool trailing_zeros;
|
bool trailing_zeros;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1115,7 +1110,7 @@ template <typename Char> class float_writer {
|
|||||||
int num_digits_;
|
int num_digits_;
|
||||||
int exp_;
|
int exp_;
|
||||||
size_t size_;
|
size_t size_;
|
||||||
gen_digits_params params_;
|
float_spec params_;
|
||||||
Char decimal_point_;
|
Char decimal_point_;
|
||||||
|
|
||||||
template <typename It> It prettify(It it) const {
|
template <typename It> It prettify(It it) const {
|
||||||
@@ -1126,7 +1121,7 @@ template <typename Char> class float_writer {
|
|||||||
*it++ = static_cast<Char>(*digits_);
|
*it++ = static_cast<Char>(*digits_);
|
||||||
if (num_digits_ > 1) *it++ = decimal_point_;
|
if (num_digits_ > 1) *it++ = decimal_point_;
|
||||||
it = copy_str<Char>(digits_ + 1, digits_ + num_digits_, it);
|
it = copy_str<Char>(digits_ + 1, digits_ + num_digits_, it);
|
||||||
int num_zeros = params_.num_digits - num_digits_;
|
int num_zeros = params_.precision - num_digits_;
|
||||||
if (num_zeros > 0 && params_.trailing_zeros)
|
if (num_zeros > 0 && params_.trailing_zeros)
|
||||||
it = std::fill_n(it, num_zeros, static_cast<Char>('0'));
|
it = std::fill_n(it, num_zeros, static_cast<Char>('0'));
|
||||||
*it++ = static_cast<Char>(params_.upper ? 'E' : 'e');
|
*it++ = static_cast<Char>(params_.upper ? 'E' : 'e');
|
||||||
@@ -1138,7 +1133,7 @@ template <typename Char> class float_writer {
|
|||||||
it = std::fill_n(it, full_exp - num_digits_, static_cast<Char>('0'));
|
it = std::fill_n(it, full_exp - num_digits_, static_cast<Char>('0'));
|
||||||
if (params_.trailing_zeros) {
|
if (params_.trailing_zeros) {
|
||||||
*it++ = decimal_point_;
|
*it++ = decimal_point_;
|
||||||
int num_zeros = params_.num_digits - full_exp;
|
int num_zeros = params_.precision - full_exp;
|
||||||
if (num_zeros <= 0) {
|
if (num_zeros <= 0) {
|
||||||
if (params_.format != float_format::fixed)
|
if (params_.format != float_format::fixed)
|
||||||
*it++ = static_cast<Char>('0');
|
*it++ = static_cast<Char>('0');
|
||||||
@@ -1163,17 +1158,17 @@ template <typename Char> class float_writer {
|
|||||||
}
|
}
|
||||||
*it++ = decimal_point_;
|
*it++ = decimal_point_;
|
||||||
it = copy_str<Char>(digits_ + full_exp, digits_ + num_digits_, it);
|
it = copy_str<Char>(digits_ + full_exp, digits_ + num_digits_, it);
|
||||||
if (params_.num_digits > num_digits_) {
|
if (params_.precision > num_digits_) {
|
||||||
// Add trailing zeros.
|
// Add trailing zeros.
|
||||||
int num_zeros = params_.num_digits - num_digits_;
|
int num_zeros = params_.precision - num_digits_;
|
||||||
it = std::fill_n(it, num_zeros, static_cast<Char>('0'));
|
it = std::fill_n(it, num_zeros, static_cast<Char>('0'));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// 1234e-6 -> 0.001234
|
// 1234e-6 -> 0.001234
|
||||||
*it++ = static_cast<Char>('0');
|
*it++ = static_cast<Char>('0');
|
||||||
int num_zeros = -full_exp;
|
int num_zeros = -full_exp;
|
||||||
if (params_.num_digits >= 0 && params_.num_digits < num_zeros)
|
if (params_.precision >= 0 && params_.precision < num_zeros)
|
||||||
num_zeros = params_.num_digits;
|
num_zeros = params_.precision;
|
||||||
int num_digits = num_digits_;
|
int num_digits = num_digits_;
|
||||||
if (!params_.trailing_zeros)
|
if (!params_.trailing_zeros)
|
||||||
while (num_digits > 0 && digits_[num_digits - 1] == '0') --num_digits;
|
while (num_digits > 0 && digits_[num_digits - 1] == '0') --num_digits;
|
||||||
@@ -1187,21 +1182,21 @@ template <typename Char> class float_writer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
float_writer(const char* digits, int num_digits, int exp,
|
float_writer(const char* digits, int num_digits, int exp, float_spec spec,
|
||||||
gen_digits_params params, Char decimal_point)
|
Char decimal_point)
|
||||||
: digits_(digits),
|
: digits_(digits),
|
||||||
num_digits_(num_digits),
|
num_digits_(num_digits),
|
||||||
exp_(exp),
|
exp_(exp),
|
||||||
params_(params),
|
params_(spec),
|
||||||
decimal_point_(decimal_point) {
|
decimal_point_(decimal_point) {
|
||||||
int full_exp = num_digits + exp - 1;
|
int full_exp = num_digits + exp - 1;
|
||||||
int precision = params.num_digits > 0 ? params.num_digits : 16;
|
int precision = spec.precision > 0 ? spec.precision : 16;
|
||||||
if (params_.format == float_format::general &&
|
if (params_.format == float_format::general &&
|
||||||
!(full_exp >= -4 && full_exp < precision)) {
|
!(full_exp >= -4 && full_exp < precision)) {
|
||||||
params_.format = float_format::exp;
|
params_.format = float_format::exp;
|
||||||
}
|
}
|
||||||
size_ = prettify(counting_iterator()).count();
|
size_ = prettify(counting_iterator()).count();
|
||||||
size_ += params_.sign ? 1 : 0;
|
size_ += spec.sign ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t size() const { return size_; }
|
size_t size() const { return size_; }
|
||||||
@@ -1695,28 +1690,28 @@ template <typename Range> class basic_writer {
|
|||||||
|
|
||||||
template <typename T, FMT_ENABLE_IF(std::is_floating_point<T>::value)>
|
template <typename T, FMT_ENABLE_IF(std::is_floating_point<T>::value)>
|
||||||
void write(T value, format_specs specs = {}) {
|
void write(T value, format_specs specs = {}) {
|
||||||
auto sign = specs.sign;
|
float_spec fspec = parse_float_type_spec(specs.type);
|
||||||
|
fspec.sign = specs.sign;
|
||||||
if (std::signbit(value)) { // value < 0 is false for NaN so use signbit.
|
if (std::signbit(value)) { // value < 0 is false for NaN so use signbit.
|
||||||
sign = sign::minus;
|
fspec.sign = sign::minus;
|
||||||
value = -value;
|
value = -value;
|
||||||
} else if (sign == sign::minus) {
|
} else if (fspec.sign == sign::minus) {
|
||||||
sign = sign::none;
|
fspec.sign = sign::none;
|
||||||
}
|
}
|
||||||
|
|
||||||
float_spec fspec = parse_float_type_spec(specs.type);
|
|
||||||
if (!std::isfinite(value)) {
|
if (!std::isfinite(value)) {
|
||||||
auto str = std::isinf(value) ? (fspec.upper ? "INF" : "inf")
|
auto str = std::isinf(value) ? (fspec.upper ? "INF" : "inf")
|
||||||
: (fspec.upper ? "NAN" : "nan");
|
: (fspec.upper ? "NAN" : "nan");
|
||||||
return write_padded(specs, inf_or_nan_writer<char_type>{sign, str});
|
return write_padded(specs, inf_or_nan_writer<char_type>{fspec.sign, str});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (specs.align == align::none) {
|
if (specs.align == align::none) {
|
||||||
specs.align = align::right;
|
specs.align = align::right;
|
||||||
} else if (specs.align == align::numeric) {
|
} else if (specs.align == align::numeric) {
|
||||||
if (sign) {
|
if (fspec.sign) {
|
||||||
auto&& it = reserve(1);
|
auto&& it = reserve(1);
|
||||||
*it++ = static_cast<char_type>(data::signs[sign]);
|
*it++ = static_cast<char_type>(data::signs[fspec.sign]);
|
||||||
sign = sign::none;
|
fspec.sign = sign::none;
|
||||||
if (specs.width != 0) --specs.width;
|
if (specs.width != 0) --specs.width;
|
||||||
}
|
}
|
||||||
specs.align = align::right;
|
specs.align = align::right;
|
||||||
@@ -1724,7 +1719,7 @@ template <typename Range> class basic_writer {
|
|||||||
|
|
||||||
memory_buffer buffer;
|
memory_buffer buffer;
|
||||||
if (fspec.format == float_format::hex) {
|
if (fspec.format == float_format::hex) {
|
||||||
if (sign) buffer.push_back(data::signs[sign]);
|
if (fspec.sign) buffer.push_back(data::signs[fspec.sign]);
|
||||||
fspec.alt = specs.alt;
|
fspec.alt = specs.alt;
|
||||||
snprintf_float(promote_float(value), specs.precision, fspec, buffer);
|
snprintf_float(promote_float(value), specs.precision, fspec, buffer);
|
||||||
write_padded(specs, str_writer<char>{buffer.data(), buffer.size()});
|
write_padded(specs, str_writer<char>{buffer.data(), buffer.size()});
|
||||||
@@ -1732,6 +1727,11 @@ template <typename Range> class basic_writer {
|
|||||||
}
|
}
|
||||||
int precision = specs.precision >= 0 || !specs.type ? specs.precision : 6;
|
int precision = specs.precision >= 0 || !specs.type ? specs.precision : 6;
|
||||||
if (fspec.format == float_format::exp) ++precision;
|
if (fspec.format == float_format::exp) ++precision;
|
||||||
|
fspec.trailing_zeros =
|
||||||
|
(precision != 0 &&
|
||||||
|
(!specs.type || fspec.format == float_format::fixed ||
|
||||||
|
fspec.format == float_format::exp)) ||
|
||||||
|
specs.alt;
|
||||||
if (const_check(std::is_same<T, float>())) fspec.binary32 = true;
|
if (const_check(std::is_same<T, float>())) fspec.binary32 = true;
|
||||||
fspec.use_grisu = use_grisu<T>();
|
fspec.use_grisu = use_grisu<T>();
|
||||||
if (const_check(FMT_DEPRECATED_PERCENT) && fspec.percent) value *= 100;
|
if (const_check(FMT_DEPRECATED_PERCENT) && fspec.percent) value *= 100;
|
||||||
@@ -1740,21 +1740,12 @@ template <typename Range> class basic_writer {
|
|||||||
buffer.push_back('%');
|
buffer.push_back('%');
|
||||||
--exp; // Adjust decimal place position.
|
--exp; // Adjust decimal place position.
|
||||||
}
|
}
|
||||||
auto params = gen_digits_params();
|
fspec.precision = precision;
|
||||||
params.sign = sign;
|
|
||||||
params.format = fspec.format;
|
|
||||||
params.num_digits = precision;
|
|
||||||
params.trailing_zeros =
|
|
||||||
(precision != 0 &&
|
|
||||||
(!specs.type || fspec.format == float_format::fixed ||
|
|
||||||
fspec.format == float_format::exp)) ||
|
|
||||||
specs.alt;
|
|
||||||
params.upper = fspec.upper;
|
|
||||||
char_type point = fspec.locale ? decimal_point<char_type>(locale_)
|
char_type point = fspec.locale ? decimal_point<char_type>(locale_)
|
||||||
: static_cast<char_type>('.');
|
: static_cast<char_type>('.');
|
||||||
write_padded(specs, float_writer<char_type>(buffer.data(),
|
write_padded(specs, float_writer<char_type>(buffer.data(),
|
||||||
static_cast<int>(buffer.size()),
|
static_cast<int>(buffer.size()),
|
||||||
exp, params, point));
|
exp, fspec, point));
|
||||||
}
|
}
|
||||||
|
|
||||||
void write(char value) {
|
void write(char value) {
|
||||||
|
Reference in New Issue
Block a user