Revert "Trying with a smaller lookup, still slower than std::to_string"

This reverts commit 18cdd4d9b5.
This commit is contained in:
King_DuckZ 2021-06-07 22:13:50 +02:00
parent 18cdd4d9b5
commit e1599820b4

View file

@ -155,18 +155,22 @@ namespace dhandy {
template <typename I, typename Tr> template <typename I, typename Tr>
struct IntConversion<I, 10, Tr, typename std::enable_if<std::is_integral<I>::value and not std::is_same<I, bool>::value>::type> { struct IntConversion<I, 10, Tr, typename std::enable_if<std::is_integral<I>::value and not std::is_same<I, bool>::value>::type> {
private:
static const constexpr char lookup[200] = {
0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,1,0,1,1,1,2,1,3,1,4,
1,5,1,6,1,7,1,8,1,9,2,0,2,1,2,2,2,3,2,4,2,5,2,6,2,7,2,8,2,9,
3,0,3,1,3,2,3,3,3,4,3,5,3,6,3,7,3,8,3,9,4,0,4,1,4,2,4,3,4,4,
4,5,4,6,4,7,4,8,4,9,5,0,5,1,5,2,5,3,5,4,5,5,5,6,5,7,5,8,5,9,
6,0,6,1,6,2,6,3,6,4,6,5,6,6,6,7,6,8,6,9,7,0,7,1,7,2,7,3,7,4,
7,5,7,6,7,7,7,8,7,9,8,0,8,1,8,2,8,3,8,4,8,5,8,6,8,7,8,8,8,9,
9,0,9,1,9,2,9,3,9,4,9,5,9,6,9,7,9,8,9,9
};
public:
static constexpr RevArray<I, 10, Tr> to_ary (I in) { static constexpr RevArray<I, 10, Tr> to_ary (I in) {
using RetType = RevArray<I, 10, Tr>; using RetType = RevArray<I, 10, Tr>;
using Num = implem::NumberAdaptation<I, 10>; using Num = implem::NumberAdaptation<I, 10>;
//How to build this lookup: 1) write numbers 0, 10, 20..., 90
//in binary; 2) take the lowest 5 bits, div by 2 and write as
//decimal; 3) divide by 2; 4) the result is the position in the
//below array that should be filled in with the leading digit
//from the original 0-90 number
constexpr const char lookup[16] = {
0, 0, 0, 7, 4, 1, 0, 0, 8, 5, 2, 0, 0, 9, 6, 3
};
const bool was_negative = implem::is_negative<I, 10>(in); const bool was_negative = implem::is_negative<I, 10>(in);
RetType arr; RetType arr;
@ -175,21 +179,18 @@ namespace dhandy {
arr.push_front(Tr::NullChar); arr.push_front(Tr::NullChar);
in = Num::abs(in); in = Num::abs(in);
while (in >= static_cast<I>(100)) { while (in >= static_cast<I>(100)) {
const auto last_two = in % 100; const auto index = (in % 100) * 2;
const auto digit_low = in % 10; arr.push_front(Tr::to_digit(static_cast<int>(lookup[index + 1])));
arr.push_front(Tr::to_digit(static_cast<int>(lookup[index + 0])));
in = static_cast<I>(in / static_cast<I>(100)); in = static_cast<I>(in / static_cast<I>(100));
const auto digit_high = lookup[((last_two - digit_low) >> 1) & 0xF];
arr.push_front(Tr::to_digit(static_cast<int>(digit_low)));
arr.push_front(Tr::to_digit(static_cast<int>(digit_high)));
}; };
if (in < static_cast<I>(10)) { if (in < static_cast<I>(10)) {
arr.push_front(Tr::to_digit(static_cast<int>(in))); arr.push_front(Tr::to_digit(static_cast<int>(in)));
} }
else { else {
const auto digit_low = in % 10; const auto index = in * 2;
const auto digit_high = lookup[((in - digit_low) >> 1) & 0xF]; arr.push_front(Tr::to_digit(static_cast<int>(lookup[index + 1])));
arr.push_front(Tr::to_digit(static_cast<int>(digit_low))); arr.push_front(Tr::to_digit(static_cast<int>(lookup[index + 0])));
arr.push_front(Tr::to_digit(static_cast<int>(digit_high)));
} }
if (was_negative) if (was_negative)
arr.push_front(Tr::Minus); arr.push_front(Tr::Minus);