Simplify format_decimal (#2498)
* Add copy2() constexpr * Removed redundant format_decimal implementation for constexpr context
This commit is contained in:
parent
9b6b0e403c
commit
e47e99bb09
@ -1049,11 +1049,19 @@ inline auto equal2(const char* lhs, const char* rhs) -> bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Copies two characters from src to dst.
|
// Copies two characters from src to dst.
|
||||||
template <typename Char> void copy2(Char* dst, const char* src) {
|
template <typename Char>
|
||||||
*dst++ = static_cast<Char>(*src++);
|
FMT_CONSTEXPR20 FMT_INLINE void copy2(Char* dst, const char* src) {
|
||||||
*dst = static_cast<Char>(*src);
|
if (!is_constant_evaluated() && std::is_same<Char, char>::value) {
|
||||||
|
memcpy(dst, src, 2);
|
||||||
|
} else {
|
||||||
|
// We read both bytes before writing so that the compiler can do it in
|
||||||
|
// one pair of read/write instructions (even if Char aliases char)
|
||||||
|
char dc0 = *src++;
|
||||||
|
char dc1 = *src;
|
||||||
|
*dst++ = static_cast<Char>(dc0);
|
||||||
|
*dst = static_cast<Char>(dc1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
FMT_INLINE void copy2(char* dst, const char* src) { memcpy(dst, src, 2); }
|
|
||||||
|
|
||||||
template <typename Iterator> struct format_decimal_result {
|
template <typename Iterator> struct format_decimal_result {
|
||||||
Iterator begin;
|
Iterator begin;
|
||||||
@ -1069,14 +1077,6 @@ FMT_CONSTEXPR20 auto format_decimal(Char* out, UInt value, int size)
|
|||||||
FMT_ASSERT(size >= count_digits(value), "invalid digit count");
|
FMT_ASSERT(size >= count_digits(value), "invalid digit count");
|
||||||
out += size;
|
out += size;
|
||||||
Char* end = out;
|
Char* end = out;
|
||||||
if (is_constant_evaluated()) {
|
|
||||||
while (value >= 10) {
|
|
||||||
*--out = static_cast<Char>('0' + value % 10);
|
|
||||||
value /= 10;
|
|
||||||
}
|
|
||||||
*--out = static_cast<Char>('0' + value);
|
|
||||||
return {out, end};
|
|
||||||
}
|
|
||||||
while (value >= 100) {
|
while (value >= 100) {
|
||||||
// Integer division is slow so do it for a group of two digits instead
|
// Integer division is slow so do it for a group of two digits instead
|
||||||
// of for every digit. The idea comes from the talk by Alexandrescu
|
// of for every digit. The idea comes from the talk by Alexandrescu
|
||||||
|
Loading…
Reference in New Issue
Block a user