From e1599820b4a49a0c22543898f29155b92ec23618 Mon Sep 17 00:00:00 2001 From: King_DuckZ Date: Mon, 7 Jun 2021 22:13:50 +0200 Subject: [PATCH] Revert "Trying with a smaller lookup, still slower than std::to_string" This reverts commit 18cdd4d9b50e82941afa1f9af0eb014dc3bdb497. --- include/duckhandy/implem/int_conv.hpp | 35 ++++++++++++++------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/include/duckhandy/implem/int_conv.hpp b/include/duckhandy/implem/int_conv.hpp index ded9174..ca59424 100644 --- a/include/duckhandy/implem/int_conv.hpp +++ b/include/duckhandy/implem/int_conv.hpp @@ -155,18 +155,22 @@ namespace dhandy { template struct IntConversion::value and not std::is_same::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 to_ary (I in) { using RetType = RevArray; using Num = implem::NumberAdaptation; - //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(in); RetType arr; @@ -175,21 +179,18 @@ namespace dhandy { arr.push_front(Tr::NullChar); in = Num::abs(in); while (in >= static_cast(100)) { - const auto last_two = in % 100; - const auto digit_low = in % 10; + const auto index = (in % 100) * 2; + arr.push_front(Tr::to_digit(static_cast(lookup[index + 1]))); + arr.push_front(Tr::to_digit(static_cast(lookup[index + 0]))); in = static_cast(in / static_cast(100)); - const auto digit_high = lookup[((last_two - digit_low) >> 1) & 0xF]; - arr.push_front(Tr::to_digit(static_cast(digit_low))); - arr.push_front(Tr::to_digit(static_cast(digit_high))); }; if (in < static_cast(10)) { arr.push_front(Tr::to_digit(static_cast(in))); } else { - const auto digit_low = in % 10; - const auto digit_high = lookup[((in - digit_low) >> 1) & 0xF]; - arr.push_front(Tr::to_digit(static_cast(digit_low))); - arr.push_front(Tr::to_digit(static_cast(digit_high))); + const auto index = in * 2; + arr.push_front(Tr::to_digit(static_cast(lookup[index + 1]))); + arr.push_front(Tr::to_digit(static_cast(lookup[index + 0]))); } if (was_negative) arr.push_front(Tr::Minus);