From 2c30268bf2d60267f4daba0b505f4c0ce0f3751f Mon Sep 17 00:00:00 2001 From: Stephen Berry Date: Wed, 22 Nov 2017 14:05:09 -0600 Subject: [PATCH 1/2] Improved parsing speed of parse_num --- include/chaiscript/chaiscript_defines.hpp | 86 +++++++++++++---------- 1 file changed, 47 insertions(+), 39 deletions(-) diff --git a/include/chaiscript/chaiscript_defines.hpp b/include/chaiscript/chaiscript_defines.hpp index 5b2e84f4..3157f429 100644 --- a/include/chaiscript/chaiscript_defines.hpp +++ b/include/chaiscript/chaiscript_defines.hpp @@ -166,48 +166,56 @@ namespace chaiscript { } - template + template auto parse_num(const char *t_str) -> typename std::enable_if::value, T>::type { - T t = 0; - T base = 0; - T decimal_place = 0; - bool exponent = false; - bool neg_exponent = false; + T t = 0; + T base; + T decimal_place = 0; + int exponent = 0; - const auto final_value = [](const T val, const T baseval, const bool hasexp, const bool negexp) -> T { - if (!hasexp) { - return val; - } else { - return baseval * std::pow(T(10), val*T(negexp?-1:1)); - } - }; - - for(; *t_str != '\0'; ++t_str) { - char c = *t_str; - if (c == '.') { - decimal_place = 10; - } else if (c == 'e' || c == 'E') { - exponent = true; - decimal_place = 0; - base = t; - t = 0; - } else if (c == '-' && exponent) { - neg_exponent = true; - } else if (c == '+' && exponent) { - neg_exponent = false; - } else if (c < '0' || c > '9') { - return final_value(t, base, exponent, neg_exponent); - } else if (decimal_place < T(10)) { - t *= T(10); - t += T(c - '0'); - } else { - t += (T(c - '0') / (T(decimal_place))); - decimal_place *= 10; - } - } - - return final_value(t, base, exponent, neg_exponent); + for (char c;; ++t_str) { + c = *t_str; + switch (c) + { + case '.': + decimal_place = 10; + break; + case 'e': + case 'E': + decimal_place = 0; + base = t; + t = 0; + break; + case '-': + exponent = -1; + break; + case '+': + exponent = 1; + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (decimal_place < 10) { + t *= 10; + t += c - '0'; + } + else { + t += (c - '0') / decimal_place; + decimal_place *= 10; + } + break; + default: + return exponent ? base * std::pow(T(10), t * exponent) : t; + } + } } template From bcd01f3b03ff95f3d21a942dd9d6c1dcd5dd397b Mon Sep 17 00:00:00 2001 From: Stephen Berry Date: Wed, 22 Nov 2017 14:51:50 -0600 Subject: [PATCH 2/2] Fixed issue when lacking positive exponent sign --- include/chaiscript/chaiscript_defines.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/chaiscript/chaiscript_defines.hpp b/include/chaiscript/chaiscript_defines.hpp index 3157f429..4c303307 100644 --- a/include/chaiscript/chaiscript_defines.hpp +++ b/include/chaiscript/chaiscript_defines.hpp @@ -183,6 +183,7 @@ namespace chaiscript { break; case 'e': case 'E': + exponent = 1; decimal_place = 0; base = t; t = 0; @@ -191,7 +192,6 @@ namespace chaiscript { exponent = -1; break; case '+': - exponent = 1; break; case '0': case '1':