CountDigits -> count_digits
This commit is contained in:
parent
c1db293518
commit
ca0dcce2a6
16
format.h
16
format.h
@ -432,23 +432,23 @@ extern const uint64_t POWERS_OF_10_64[];
|
|||||||
|
|
||||||
#if FMT_GCC_VERSION >= 400 || FMT_HAS_BUILTIN(__builtin_clzll)
|
#if FMT_GCC_VERSION >= 400 || FMT_HAS_BUILTIN(__builtin_clzll)
|
||||||
// Returns the number of decimal digits in n. Leading zeros are not counted
|
// Returns the number of decimal digits in n. Leading zeros are not counted
|
||||||
// except for n == 0 in which case CountDigits returns 1.
|
// except for n == 0 in which case count_digits returns 1.
|
||||||
inline unsigned CountDigits(uint64_t n) {
|
inline unsigned count_digits(uint64_t n) {
|
||||||
// Based on http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog10
|
// Based on http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog10
|
||||||
// and the benchmark https://github.com/localvoid/cxx-benchmark-count-digits.
|
// and the benchmark https://github.com/localvoid/cxx-benchmark-count-digits.
|
||||||
uint64_t t = (64 - __builtin_clzll(n | 1)) * 1233 >> 12;
|
uint64_t t = (64 - __builtin_clzll(n | 1)) * 1233 >> 12;
|
||||||
return t - (n < POWERS_OF_10_64[t]) + 1;
|
return t - (n < POWERS_OF_10_64[t]) + 1;
|
||||||
}
|
}
|
||||||
# if FMT_GCC_VERSION >= 400 || FMT_HAS_BUILTIN(__builtin_clz)
|
# if FMT_GCC_VERSION >= 400 || FMT_HAS_BUILTIN(__builtin_clz)
|
||||||
// Optional version of CountDigits for better performance on 32-bit platforms.
|
// Optional version of count_digits for better performance on 32-bit platforms.
|
||||||
inline unsigned CountDigits(uint32_t n) {
|
inline unsigned count_digits(uint32_t n) {
|
||||||
uint32_t t = (32 - __builtin_clz(n | 1)) * 1233 >> 12;
|
uint32_t t = (32 - __builtin_clz(n | 1)) * 1233 >> 12;
|
||||||
return t - (n < POWERS_OF_10_32[t]) + 1;
|
return t - (n < POWERS_OF_10_32[t]) + 1;
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
#else
|
#else
|
||||||
// Slower version of CountDigits used when __builtin_clz is not available.
|
// Slower version of count_digits used when __builtin_clz is not available.
|
||||||
inline unsigned CountDigits(uint64_t n) {
|
inline unsigned count_digits(uint64_t n) {
|
||||||
unsigned count = 1;
|
unsigned count = 1;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
// Integer division is slow so do it for a group of four digits instead
|
// Integer division is slow so do it for a group of four digits instead
|
||||||
@ -1622,7 +1622,7 @@ void BasicWriter<Char>::write_int(T value, const Spec &spec) {
|
|||||||
}
|
}
|
||||||
switch (spec.type()) {
|
switch (spec.type()) {
|
||||||
case 0: case 'd': {
|
case 0: case 'd': {
|
||||||
unsigned num_digits = internal::CountDigits(abs_value);
|
unsigned num_digits = internal::count_digits(abs_value);
|
||||||
CharPtr p = PrepareBufferForInt(
|
CharPtr p = PrepareBufferForInt(
|
||||||
num_digits, spec, prefix, prefix_size) + 1 - num_digits;
|
num_digits, spec, prefix, prefix_size) + 1 - num_digits;
|
||||||
internal::FormatDecimal(GetBase(p), abs_value, num_digits);
|
internal::FormatDecimal(GetBase(p), abs_value, num_digits);
|
||||||
@ -1915,7 +1915,7 @@ inline void FormatDec(char *&buffer, T value) {
|
|||||||
*buffer++ = internal::DIGITS[index + 1];
|
*buffer++ = internal::DIGITS[index + 1];
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
unsigned num_digits = internal::CountDigits(abs_value);
|
unsigned num_digits = internal::count_digits(abs_value);
|
||||||
internal::FormatDecimal(buffer, abs_value, num_digits);
|
internal::FormatDecimal(buffer, abs_value, num_digits);
|
||||||
buffer += num_digits;
|
buffer += num_digits;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user