mirror of
https://github.com/ChaiScript/ChaiScript.git
synced 2025-12-07 01:06:54 +08:00
Merge pull request #380 from stephenberry/develop
Improved parsing speed of parse_num
This commit is contained in:
commit
3a019b06c3
@ -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>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user