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

@ -166,48 +166,56 @@ namespace chaiscript {
} }
template<typename T> template<typename T>
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 '.':
} decimal_place = 10;
}; break;
case 'e':
for(; *t_str != '\0'; ++t_str) { case 'E':
char c = *t_str; exponent = 1;
if (c == '.') { decimal_place = 0;
decimal_place = 10; base = t;
} else if (c == 'e' || c == 'E') { t = 0;
exponent = true; break;
decimal_place = 0; case '-':
base = t; exponent = -1;
t = 0; break;
} else if (c == '-' && exponent) { case '+':
neg_exponent = true; break;
} else if (c == '+' && exponent) { case '0':
neg_exponent = false; case '1':
} else if (c < '0' || c > '9') { case '2':
return final_value(t, base, exponent, neg_exponent); case '3':
} else if (decimal_place < T(10)) { case '4':
t *= T(10); case '5':
t += T(c - '0'); case '6':
} else { case '7':
t += (T(c - '0') / (T(decimal_place))); case '8':
decimal_place *= 10; case '9':
} if (decimal_place < 10) {
} t *= 10;
t += c - '0';
return final_value(t, base, exponent, neg_exponent); }
else {
t += (c - '0') / decimal_place;
decimal_place *= 10;
}
break;
default:
return exponent ? base * std::pow(T(10), t * exponent) : t;
}
}
} }
template<typename T> template<typename T>