diff --git a/include/chaiscript/chaiscript_defines.hpp b/include/chaiscript/chaiscript_defines.hpp index 5b2e84f4..4c303307 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': + exponent = 1; + decimal_place = 0; + base = t; + t = 0; + break; + case '-': + exponent = -1; + break; + case '+': + 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