Merge pull request #380 from stephenberry/develop

Improved parsing speed of parse_num
This commit is contained in:
Jason Turner 2017-11-27 20:26:08 -07:00 committed by GitHub
commit 3a019b06c3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

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
{
T t = 0;
T base = 0;
T base;
T decimal_place = 0;
bool exponent = false;
bool neg_exponent = false;
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 == '.') {
for (char c;; ++t_str) {
c = *t_str;
switch (c)
{
case '.':
decimal_place = 10;
} else if (c == 'e' || c == 'E') {
exponent = true;
break;
case 'e':
case 'E':
exponent = 1;
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)));
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;
}
}
return final_value(t, base, exponent, neg_exponent);
}
template<typename T>