Improved parsing speed of parse_num

This commit is contained in:
Stephen Berry 2017-11-22 14:05:09 -06:00
parent 903454bf05
commit 2c30268bf2

View File

@ -170,44 +170,52 @@ namespace chaiscript {
auto parse_num(const char *t_str) -> typename std::enable_if<!std::is_integral<T>::value, T>::type auto parse_num(const char *t_str) -> typename std::enable_if<!std::is_integral<T>::value, T>::type
{ {
T t = 0; T t = 0;
T base = 0; T base;
T decimal_place = 0; T decimal_place = 0;
bool exponent = false; int exponent = 0;
bool neg_exponent = false;
const auto final_value = [](const T val, const T baseval, const bool hasexp, const bool negexp) -> T { for (char c;; ++t_str) {
if (!hasexp) { c = *t_str;
return val; switch (c)
} else { {
return baseval * std::pow(T(10), val*T(negexp?-1:1)); case '.':
}
};
for(; *t_str != '\0'; ++t_str) {
char c = *t_str;
if (c == '.') {
decimal_place = 10; decimal_place = 10;
} else if (c == 'e' || c == 'E') { break;
exponent = true; case 'e':
case 'E':
decimal_place = 0; decimal_place = 0;
base = t; base = t;
t = 0; t = 0;
} else if (c == '-' && exponent) { break;
neg_exponent = true; case '-':
} else if (c == '+' && exponent) { exponent = -1;
neg_exponent = false; break;
} else if (c < '0' || c > '9') { case '+':
return final_value(t, base, exponent, neg_exponent); exponent = 1;
} else if (decimal_place < T(10)) { break;
t *= T(10); case '0':
t += T(c - '0'); case '1':
} else { case '2':
t += (T(c - '0') / (T(decimal_place))); 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; decimal_place *= 10;
} }
break;
default:
return exponent ? base * std::pow(T(10), t * exponent) : t;
}
} }
return final_value(t, base, exponent, neg_exponent);
} }
template<typename T> template<typename T>