33 #ifndef INCLUDE_EXPRTK_HPP 34 #define INCLUDE_EXPRTK_HPP 61 #ifdef exprtk_enable_debugging 62 #define exprtk_debug(params) printf params 64 #define exprtk_debug(params) (void)0 67 #define exprtk_error_location \ 68 "exprtk.hpp:" + details::to_str(__LINE__) \ 70 #if defined(__GNUC__) && (__GNUC__ >= 7) 72 #define exprtk_disable_fallthrough_begin \ 73 _Pragma ("GCC diagnostic push") \ 74 _Pragma ("GCC diagnostic ignored \"-Wimplicit-fallthrough\"") \ 76 #define exprtk_disable_fallthrough_end \ 77 _Pragma ("GCC diagnostic pop") \ 80 #define exprtk_disable_fallthrough_begin (void)0; 81 #define exprtk_disable_fallthrough_end (void)0; 95 return (
' ' == c) || (
'\n' == c) ||
96 (
'\r' == c) || (
'\t' == c) ||
97 (
'\b' == c) || (
'\v' == c) ||
103 return (
'+' == c) || (
'-' == c) ||
104 (
'*' == c) || (
'/' == c) ||
105 (
'^' == c) || (
'<' == c) ||
106 (
'>' == c) || (
'=' == c) ||
107 (
',' == c) || (
'!' == c) ||
108 (
'(' == c) || (
')' == c) ||
109 (
'[' == c) || (
']' == c) ||
110 (
'{' == c) || (
'}' == c) ||
111 (
'%' == c) || (
':' == c) ||
112 (
'?' == c) || (
'&' == c) ||
113 (
'|' == c) || (
';' == c) ;
118 return ((
'a' <= c) && (c <=
'z')) ||
119 ((
'A' <= c) && (c <=
'Z')) ;
124 return (
'0' <= c) && (c <=
'9');
134 return (
'(' == c) || (
'[' == c) || (
'{' == c);
139 return (
')' == c) || (
']' == c) || (
'}' == c);
149 return (
'+' == c) || (
'-' == c);
165 #ifndef exprtk_disable_caseinsensitivity 168 for (std::size_t i = 0; i < s.size(); ++i)
176 return std::tolower(c1) == std::tolower(c2);
181 if (s1.size() == s2.size())
183 for (std::size_t i = 0; i < s1.size(); ++i)
185 if (std::tolower(s1[i]) != std::tolower(s2[i]))
201 const std::size_t length =
std::min(s1.size(),s2.size());
203 for (std::size_t i = 0; i < length; ++i)
205 const char_t c1 =
static_cast<char>(std::tolower(s1[i]));
206 const char_t c2 =
static_cast<char>(std::tolower(s2[i]));
214 return s1.size() < s2.size();
244 return (4 == symbol.size()) &&
245 (
'$' == symbol[0]) &&
258 return s[s.size() - 1];
272 result +=
'0' + char(-(i % 10));
281 result +=
'0' + char(i % 10);
285 std::reverse(result.begin(), result.end());
292 return to_str(static_cast<int>(i));
297 return ((
'0' <= digit) && (digit <=
'9')) ||
298 ((
'A' <= digit) && (digit <=
'F')) ||
299 ((
'a' <= digit) && (digit <=
'f')) ;
304 if ((
'0' <= h) && (h <=
'9'))
307 return static_cast<unsigned char>(std::toupper(h) -
'A');
310 template <
typename Iterator>
315 (end != (itr + 1)) &&
316 (end != (itr + 2)) &&
317 (end != (itr + 3)) &&
320 (
'x' == *(itr + 1)) ||
327 result =
hex_to_bin(static_cast<uchar_t>(*(itr + 2))) << 4 |
328 hex_to_bin(static_cast<uchar_t>(*(itr + 3))) ;
337 typedef std::string::iterator str_itr_t;
339 str_itr_t itr1 = s.begin();
340 str_itr_t itr2 = s.begin();
341 str_itr_t end = s.end ();
343 std::size_t removal_count = 0;
353 else if (
'\\' != (*itr1))
357 case 'n' : (*itr1) =
'\n';
break;
358 case 'r' : (*itr1) =
'\r';
break;
359 case 't' : (*itr1) =
'\t';
break;
360 case '0' :
parse_hex(itr1, end, (*itr1));
378 s.resize(s.size() - removal_count);
387 data_.reserve(initial_size);
419 "break",
"case",
"continue",
"default",
"false",
"for",
420 "if",
"else",
"ilike",
"in",
"like",
"and",
"nand",
"nor",
421 "not",
"null",
"or",
"repeat",
"return",
"shl",
"shr",
422 "swap",
"switch",
"true",
"until",
"var",
"while",
"xnor",
430 "abs",
"acos",
"acosh",
"and",
"asin",
"asinh",
"atan",
431 "atanh",
"atan2",
"avg",
"break",
"case",
"ceil",
"clamp",
432 "continue",
"cos",
"cosh",
"cot",
"csc",
"default",
433 "deg2grad",
"deg2rad",
"equal",
"erf",
"erfc",
"exp",
434 "expm1",
"false",
"floor",
"for",
"frac",
"grad2deg",
435 "hypot",
"iclamp",
"if",
"else",
"ilike",
"in",
"inrange",
436 "like",
"log",
"log10",
"log2",
"logn",
"log1p",
"mand",
437 "max",
"min",
"mod",
"mor",
"mul",
"ncdf",
"nand",
"nor",
438 "not",
"not_equal",
"null",
"or",
"pow",
"rad2deg",
439 "repeat",
"return",
"root",
"round",
"roundn",
"sec",
"sgn",
440 "shl",
"shr",
"sin",
"sinc",
"sinh",
"sqrt",
"sum",
"swap",
441 "switch",
"tan",
"tanh",
"true",
"trunc",
"until",
"var",
442 "while",
"xnor",
"xor",
"&",
"|" 449 "abs",
"acos",
"acosh",
"asin",
"asinh",
"atan",
"atanh",
450 "atan2",
"avg",
"ceil",
"clamp",
"cos",
"cosh",
"cot",
451 "csc",
"equal",
"erf",
"erfc",
"exp",
"expm1",
"floor",
452 "frac",
"hypot",
"iclamp",
"like",
"log",
"log10",
"log2",
453 "logn",
"log1p",
"mand",
"max",
"min",
"mod",
"mor",
"mul",
454 "ncdf",
"pow",
"root",
"round",
"roundn",
"sec",
"sgn",
455 "sin",
"sinc",
"sinh",
"sqrt",
"sum",
"swap",
"tan",
"tanh",
456 "trunc",
"not_equal",
"inrange",
"deg2grad",
"deg2rad",
457 "rad2deg",
"grad2deg" 464 "and",
"nand",
"nor",
"not",
"or",
"xnor",
"xor",
"&",
"|" 471 "if",
"switch",
"for",
"while",
"repeat",
"return" 478 "+",
"-",
"*",
"/",
"%",
"^" 577 return (std::tolower(c0) == std::tolower(c1));
581 template <
typename Iterator,
typename Compare>
583 const Iterator pattern_end ,
584 const Iterator data_begin ,
585 const Iterator data_end ,
589 const Iterator null_itr(0);
591 Iterator d_itr = data_begin;
592 Iterator p_itr = pattern_begin;
593 Iterator tb_p_itr = null_itr;
594 Iterator tb_d_itr = null_itr;
596 while (d_itr != data_end)
598 if (zero_or_more == *p_itr)
600 while ((pattern_end != p_itr) && ((zero_or_more == *p_itr) || (zero_or_one == *p_itr)))
605 if (pattern_end == p_itr)
610 while ((data_end != d_itr) && !Compare::cmp(c,*d_itr))
620 else if (!Compare::cmp(*p_itr, *d_itr) && (zero_or_one != *p_itr))
622 if (null_itr == tb_d_itr)
635 while ((pattern_end != p_itr) && ((zero_or_more == *p_itr) || (zero_or_one == *p_itr)))
640 return (pattern_end == p_itr);
646 return match_impl<char_cptr,cs_match>(wild_card.data(),
647 wild_card.data() + wild_card.size(),
649 str.data() + str.size(),
657 return match_impl<char_cptr,cis_match>(wild_card.data(),
658 wild_card.data() + wild_card.size(),
660 str.data() + str.size(),
667 std::size_t& diff_index,
672 return (
"Z" == pattern);
674 else if (
'*' == pattern[0])
677 typedef std::string::const_iterator itr_t;
679 itr_t p_itr = pattern.begin();
680 itr_t s_itr = str .begin();
682 itr_t p_end = pattern.end();
683 itr_t s_end = str .end();
685 while ((s_end != s_itr) && (p_end != p_itr))
689 const char_t target =
static_cast<char>(std::toupper(*(p_itr - 1)));
693 diff_index =
static_cast<std::size_t
>(std::distance(str.begin(),s_itr));
694 diff_value =
static_cast<char>(std::toupper(*p_itr));
701 while (s_itr != s_end)
703 if (target != std::toupper(*s_itr))
713 std::toupper(*p_itr) != std::toupper(*s_itr)
716 diff_index =
static_cast<std::size_t
>(std::distance(str.begin(),s_itr));
717 diff_value =
static_cast<char>(std::toupper(*p_itr));
737 1.0E+001, 1.0E+002, 1.0E+003, 1.0E+004,
738 1.0E+005, 1.0E+006, 1.0E+007, 1.0E+008,
739 1.0E+009, 1.0E+010, 1.0E+011, 1.0E+012,
740 1.0E+013, 1.0E+014, 1.0E+015, 1.0E+016
749 static const double e = 2.71828182845904523536028747135266249775724709369996;
750 static const double pi = 3.14159265358979323846264338327950288419716939937510;
751 static const double pi_2 = 1.57079632679489661923132169163975144209858469968755;
752 static const double pi_4 = 0.78539816339744830961566084581987572104929234984378;
753 static const double pi_180 = 0.01745329251994329576923690768488612713442871888542;
754 static const double _1_pi = 0.31830988618379067153776752674502872406891929148091;
755 static const double _2_pi = 0.63661977236758134307553505349005744813783858296183;
756 static const double _180_pi = 57.29577951308232087679815481410517033240547246656443;
757 static const double log2 = 0.69314718055994530941723212145817656807550013436026;
758 static const double sqrt2 = 1.41421356237309504880168872420969807856967187537695;
768 template <
typename T>
775 #define exprtk_register_real_type_tag(T) \ 776 template<> struct number_type<T> \ 777 { typedef real_type_tag type; number_type() {} }; \ 779 #define exprtk_register_complex_type_tag(T) \ 780 template<> struct number_type<std::complex<T> > \ 781 { typedef complex_type_tag type; number_type() {} }; \ 783 #define exprtk_register_int_type_tag(T) \ 784 template<> struct number_type<T> \ 785 { typedef int_type_tag type; number_type() {} }; \ 802 #undef exprtk_register_real_type_tag 803 #undef exprtk_register_int_type_tag 805 template <
typename T>
808 static inline T
value()
810 const T epsilon = T(0.0000000001);
816 struct epsilon_type <float>
820 const float epsilon = float(0.000001
f);
826 struct epsilon_type <long double>
830 const long double epsilon = (
long double)(0.000000000001);
835 template <
typename T>
838 return std::not_equal_to<T>()(v,v);
841 template <
typename T>
844 return static_cast<int>(v);
847 template <
typename T>
850 return static_cast<long long int>(v);
853 template <
typename T>
856 return std::not_equal_to<T>()(T(0),v);
859 template <
typename T>
862 return std::equal_to<T>()(T(0),v);
865 template <
typename T>
868 return ((v < T(0)) ? -v : v);
871 template <
typename T>
874 return std::min<T>(v0,v1);
877 template <
typename T>
880 return std::max<T>(v0,v1);
883 template <
typename T>
896 template <
typename T>
899 return (v0 == v1) ? 1 : 0;
902 template <
typename T>
907 return v + (T(0.5) * v * v);
909 return std::exp(v) - T(1);
912 template <
typename T>
915 return T(std::exp<double>(v)) - T(1);
918 template <
typename T>
933 template <
typename T>
936 return (v0 != v1) ? 1 : 0;
939 template <
typename T>
942 return std::fmod(v0,v1);
945 template <
typename T>
951 template <
typename T>
957 template <
typename T>
960 return std::pow(static_cast<double>(v0),static_cast<double>(v1));
963 template <
typename T>
966 return std::log(v0) / std::log(v1);
969 template <
typename T>
972 return static_cast<T
>(logn_impl<double>(
static_cast<double>(v0),static_cast<double>(v1),
real_type_tag()));
975 template <
typename T>
982 return std::log(T(1) + v);
985 return (T(-0.5) * v + T(1)) * v;
988 return std::numeric_limits<T>::quiet_NaN();
991 template <
typename T>
996 return std::log(T(1) + v);
999 return std::numeric_limits<T>::quiet_NaN();
1002 template <
typename T>
1006 return std::numeric_limits<T>::quiet_NaN();
1008 const std::size_t n =
static_cast<std::size_t
>(v1);
1010 if ((v0 < T(0)) && (0 == (n % 2)))
1011 return std::numeric_limits<T>::quiet_NaN();
1016 template <
typename T>
1019 return root_impl<double>(
static_cast<double>(v0),static_cast<double>(v1),
real_type_tag());
1022 template <
typename T>
1025 return ((v < T(0)) ? std::ceil(v - T(0.5)) : std::floor(v + T(0.5)));
1028 template <
typename T>
1031 const int index = std::max<int>(0, std::min<int>(
pow10_size - 1, (int)std::floor(v1)));
1032 const T p10 = T(
pow10[index]);
1035 return T(std::ceil ((v0 * p10) - T(0.5)) / p10);
1037 return T(std::floor((v0 * p10) + T(0.5)) / p10);
1040 template <
typename T>
1046 template <
typename T>
1049 return std::sqrt((v0 * v0) + (v1 * v1));
1052 template <
typename T>
1055 return static_cast<T
>(std::sqrt(static_cast<double>((v0 * v0) + (v1 * v1))));
1058 template <
typename T>
1064 template <
typename T>
1070 template <
typename T>
1073 return v0 * (T(1) /
std::pow(T(2),static_cast<T>(static_cast<int>(v1))));
1076 template <
typename T>
1082 template <
typename T>
1085 return v0 *
std::pow(T(2),static_cast<T>(static_cast<int>(v1)));
1088 template <
typename T>
1094 template <
typename T>
1097 if (v > T(0))
return T(+1);
1098 else if (v < T(0))
return T(-1);
1102 template <
typename T>
1105 if (v > T(0))
return T(+1);
1106 else if (v < T(0))
return T(-1);
1110 template <
typename T>
1116 template <
typename T>
1122 template <
typename T>
1128 template <
typename T>
1134 template <
typename T>
1140 template <
typename T>
1146 template <
typename T>
1152 template <
typename T>
1158 template <
typename T>
1164 template <
typename T>
1170 template <
typename T>
1176 if ((v0_true && v1_true) || (!v0_true && !v1_true))
1182 template <
typename T>
1188 if ((v0_true && v1_true) || (!v0_true && !v1_true))
1194 #if (defined(_MSC_VER) && (_MSC_VER >= 1900)) || !defined(_MSC_VER) 1195 #define exprtk_define_erf(TT,impl) \ 1196 inline TT erf_impl(TT v) { return impl(v); } \ 1201 #undef exprtk_define_erf 1204 template <
typename T>
1207 #if defined(_MSC_VER) && (_MSC_VER < 1900) 1209 static const T c[] = {
1210 T( 1.26551223), T(1.00002368),
1211 T( 0.37409196), T(0.09678418),
1212 T(-0.18628806), T(0.27886807),
1213 T(-1.13520398), T(1.48851587),
1214 T(-0.82215223), T(0.17087277)
1219 T result = T(1) -
t * std::exp((-v * v) -
1220 c[0] +
t * (c[1] +
t *
1221 (c[2] +
t * (c[3] +
t *
1222 (c[4] +
t * (c[5] +
t *
1223 (c[6] +
t * (c[7] +
t *
1224 (c[8] +
t * (c[9]))))))))));
1226 return (v >= T(0)) ? result : -result;
1232 template <
typename T>
1238 #if (defined(_MSC_VER) && (_MSC_VER >= 1900)) || !defined(_MSC_VER) 1239 #define exprtk_define_erfc(TT,impl) \ 1240 inline TT erfc_impl(TT v) { return impl(v); } \ 1245 #undef exprtk_define_erfc 1248 template <
typename T>
1251 #if defined(_MSC_VER) && (_MSC_VER < 1900) 1258 template <
typename T>
1264 template <
typename T>
1270 return (v < T(0)) ? (T(1) - cnd) : cnd;
1273 template <
typename T>
1279 template <
typename T>
1282 if (std::abs(v) >= std::numeric_limits<T>::epsilon())
1283 return(std::sin(v) / v);
1288 template <
typename T>
1322 template <
typename T>
inline T
notl_impl(
const T v,
real_type_tag) {
return (std::not_equal_to<T>()(T(0),v) ? T(0) : T(1)); }
1359 template <
typename T>
1362 return std::equal_to<T>()(T(0),std::fmod(v,T(1)));
1365 template <
typename T>
1372 template <
typename Type>
1380 template <
typename T>
1387 template <
typename T>
1394 template <
typename T>
1401 template <
typename T>
1402 inline T
min(
const T v0,
const T v1)
1408 template <
typename T>
1409 inline T
max(
const T v0,
const T v1)
1415 template <
typename T>
1422 template <
typename T>
1429 template <
typename T>
1436 template <
typename T>
1437 inline T
pow(
const T v0,
const T v1)
1443 template <
typename T>
1444 inline T
logn(
const T v0,
const T v1)
1450 template <
typename T>
1451 inline T
root(
const T v0,
const T v1)
1457 template <
typename T>
1464 template <
typename T>
1471 template <
typename T>
1478 template <
typename T>
1479 inline T
shr(
const T v0,
const T v1)
1485 template <
typename T>
1486 inline T
shl(
const T v0,
const T v1)
1492 template <
typename T>
1499 template <
typename T>
1506 template <
typename T>
1510 return or_impl(v0, v1, num_type);
1513 template <
typename T>
1520 template <
typename T>
1527 template <
typename T>
1534 template <
typename T>
1541 template <
typename T,
unsigned int N>
1571 template <
typename T>
struct fast_exp<T, 4> {
static inline T
result(T v) { T v_2 = v * v;
return v_2 * v_2; } };
1572 template <
typename T>
struct fast_exp<T, 3> {
static inline T
result(T v) {
return v * v * v; } };
1573 template <
typename T>
struct fast_exp<T, 2> {
static inline T
result(T v) {
return v * v; } };
1574 template <
typename T>
struct fast_exp<T, 1> {
static inline T
result(T v) {
return v; } };
1575 template <
typename T>
struct fast_exp<T, 0> {
static inline T
result(T ) {
return T(1); } };
1577 #define exprtk_define_unary_function(FunctionName) \ 1578 template <typename T> \ 1579 inline T FunctionName (const T v) \ 1581 const typename details::number_type<T>::type num_type; \ 1582 return FunctionName##_impl(v,num_type); \ 1625 #undef exprtk_define_unary_function 1628 template <
typename T>
1631 static const double fract10[] =
1634 1.0E+001, 1.0E+002, 1.0E+003, 1.0E+004, 1.0E+005, 1.0E+006, 1.0E+007, 1.0E+008, 1.0E+009, 1.0E+010,
1635 1.0E+011, 1.0E+012, 1.0E+013, 1.0E+014, 1.0E+015, 1.0E+016, 1.0E+017, 1.0E+018, 1.0E+019, 1.0E+020,
1636 1.0E+021, 1.0E+022, 1.0E+023, 1.0E+024, 1.0E+025, 1.0E+026, 1.0E+027, 1.0E+028, 1.0E+029, 1.0E+030,
1637 1.0E+031, 1.0E+032, 1.0E+033, 1.0E+034, 1.0E+035, 1.0E+036, 1.0E+037, 1.0E+038, 1.0E+039, 1.0E+040,
1638 1.0E+041, 1.0E+042, 1.0E+043, 1.0E+044, 1.0E+045, 1.0E+046, 1.0E+047, 1.0E+048, 1.0E+049, 1.0E+050,
1639 1.0E+051, 1.0E+052, 1.0E+053, 1.0E+054, 1.0E+055, 1.0E+056, 1.0E+057, 1.0E+058, 1.0E+059, 1.0E+060,
1640 1.0E+061, 1.0E+062, 1.0E+063, 1.0E+064, 1.0E+065, 1.0E+066, 1.0E+067, 1.0E+068, 1.0E+069, 1.0E+070,
1641 1.0E+071, 1.0E+072, 1.0E+073, 1.0E+074, 1.0E+075, 1.0E+076, 1.0E+077, 1.0E+078, 1.0E+079, 1.0E+080,
1642 1.0E+081, 1.0E+082, 1.0E+083, 1.0E+084, 1.0E+085, 1.0E+086, 1.0E+087, 1.0E+088, 1.0E+089, 1.0E+090,
1643 1.0E+091, 1.0E+092, 1.0E+093, 1.0E+094, 1.0E+095, 1.0E+096, 1.0E+097, 1.0E+098, 1.0E+099, 1.0E+100,
1644 1.0E+101, 1.0E+102, 1.0E+103, 1.0E+104, 1.0E+105, 1.0E+106, 1.0E+107, 1.0E+108, 1.0E+109, 1.0E+110,
1645 1.0E+111, 1.0E+112, 1.0E+113, 1.0E+114, 1.0E+115, 1.0E+116, 1.0E+117, 1.0E+118, 1.0E+119, 1.0E+120,
1646 1.0E+121, 1.0E+122, 1.0E+123, 1.0E+124, 1.0E+125, 1.0E+126, 1.0E+127, 1.0E+128, 1.0E+129, 1.0E+130,
1647 1.0E+131, 1.0E+132, 1.0E+133, 1.0E+134, 1.0E+135, 1.0E+136, 1.0E+137, 1.0E+138, 1.0E+139, 1.0E+140,
1648 1.0E+141, 1.0E+142, 1.0E+143, 1.0E+144, 1.0E+145, 1.0E+146, 1.0E+147, 1.0E+148, 1.0E+149, 1.0E+150,
1649 1.0E+151, 1.0E+152, 1.0E+153, 1.0E+154, 1.0E+155, 1.0E+156, 1.0E+157, 1.0E+158, 1.0E+159, 1.0E+160,
1650 1.0E+161, 1.0E+162, 1.0E+163, 1.0E+164, 1.0E+165, 1.0E+166, 1.0E+167, 1.0E+168, 1.0E+169, 1.0E+170,
1651 1.0E+171, 1.0E+172, 1.0E+173, 1.0E+174, 1.0E+175, 1.0E+176, 1.0E+177, 1.0E+178, 1.0E+179, 1.0E+180,
1652 1.0E+181, 1.0E+182, 1.0E+183, 1.0E+184, 1.0E+185, 1.0E+186, 1.0E+187, 1.0E+188, 1.0E+189, 1.0E+190,
1653 1.0E+191, 1.0E+192, 1.0E+193, 1.0E+194, 1.0E+195, 1.0E+196, 1.0E+197, 1.0E+198, 1.0E+199, 1.0E+200,
1654 1.0E+201, 1.0E+202, 1.0E+203, 1.0E+204, 1.0E+205, 1.0E+206, 1.0E+207, 1.0E+208, 1.0E+209, 1.0E+210,
1655 1.0E+211, 1.0E+212, 1.0E+213, 1.0E+214, 1.0E+215, 1.0E+216, 1.0E+217, 1.0E+218, 1.0E+219, 1.0E+220,
1656 1.0E+221, 1.0E+222, 1.0E+223, 1.0E+224, 1.0E+225, 1.0E+226, 1.0E+227, 1.0E+228, 1.0E+229, 1.0E+230,
1657 1.0E+231, 1.0E+232, 1.0E+233, 1.0E+234, 1.0E+235, 1.0E+236, 1.0E+237, 1.0E+238, 1.0E+239, 1.0E+240,
1658 1.0E+241, 1.0E+242, 1.0E+243, 1.0E+244, 1.0E+245, 1.0E+246, 1.0E+247, 1.0E+248, 1.0E+249, 1.0E+250,
1659 1.0E+251, 1.0E+252, 1.0E+253, 1.0E+254, 1.0E+255, 1.0E+256, 1.0E+257, 1.0E+258, 1.0E+259, 1.0E+260,
1660 1.0E+261, 1.0E+262, 1.0E+263, 1.0E+264, 1.0E+265, 1.0E+266, 1.0E+267, 1.0E+268, 1.0E+269, 1.0E+270,
1661 1.0E+271, 1.0E+272, 1.0E+273, 1.0E+274, 1.0E+275, 1.0E+276, 1.0E+277, 1.0E+278, 1.0E+279, 1.0E+280,
1662 1.0E+281, 1.0E+282, 1.0E+283, 1.0E+284, 1.0E+285, 1.0E+286, 1.0E+287, 1.0E+288, 1.0E+289, 1.0E+290,
1663 1.0E+291, 1.0E+292, 1.0E+293, 1.0E+294, 1.0E+295, 1.0E+296, 1.0E+297, 1.0E+298, 1.0E+299, 1.0E+300,
1664 1.0E+301, 1.0E+302, 1.0E+303, 1.0E+304, 1.0E+305, 1.0E+306, 1.0E+307, 1.0E+308
1667 static const int fract10_size =
static_cast<int>(
sizeof(fract10) /
sizeof(
double));
1669 const int e = std::abs(exponent);
1671 if (exponent >= std::numeric_limits<T>::min_exponent10)
1673 if (
e < fract10_size)
1676 return T(d * fract10[
e]);
1678 return T(d / fract10[
e]);
1681 return T(d *
std::pow(10.0, 10.0 * exponent));
1685 d /= T(fract10[ -std::numeric_limits<T>::min_exponent10]);
1686 return T(d / fract10[-exponent + std::numeric_limits<T>::min_exponent10]);
1690 template <
typename Iterator,
typename T>
1696 const bool negative = (
'-' == (*itr));
1698 if (negative || (
'+' == (*itr)))
1706 while ((end != itr) && (zero == (*itr))) ++itr;
1708 bool return_result =
true;
1709 unsigned int digit = 0;
1710 const std::size_t length =
static_cast<std::size_t
>(std::distance(itr,end));
1717 #ifdef exprtk_use_lut 1719 #define exprtk_process_digit \ 1720 if ((digit = details::digit_table[(int)*itr++]) < 10) \ 1721 result = result * 10 + (digit); \ 1724 return_result = false; \ 1730 #define exprtk_process_digit \ 1731 if ((digit = (*itr++ - zero)) < 10) \ 1732 result = result * T(10) + digit; \ 1735 return_result = false; \ 1744 case 1 :
if ((digit = (*itr - zero))>= 10) { digit = 0; return_result =
false; }
1746 #undef exprtk_process_digit 1751 return_result =
false;
1753 if (length && return_result)
1755 result = result * 10 +
static_cast<T
>(digit);
1759 result = negative ? -result : result;
1760 return return_result;
1763 template <
typename Iterator,
typename T>
1764 static inline bool parse_nan(Iterator& itr,
const Iterator end, T&
t)
1768 static const std::size_t nan_length = 3;
1770 if (std::distance(itr,end) != static_cast<int>(nan_length))
1773 if (static_cast<type>(
'n') == (*itr))
1776 (static_cast<type>(
'a') != *(itr + 1)) ||
1777 (static_cast<type>(
'n') != *(itr + 2))
1784 (static_cast<type>(
'A') != *(itr + 1)) ||
1785 (static_cast<type>(
'N') != *(itr + 2))
1791 t = std::numeric_limits<T>::quiet_NaN();
1796 template <
typename Iterator,
typename T>
1797 static inline bool parse_inf(Iterator& itr,
const Iterator end, T&
t,
bool negative)
1799 static const char_t inf_uc[] =
"INFINITY";
1800 static const char_t inf_lc[] =
"infinity";
1801 static const std::size_t inf_length = 8;
1803 const std::size_t length =
static_cast<std::size_t
>(std::distance(itr,end));
1805 if ((3 != length) && (inf_length != length))
1808 char_cptr inf_itr = (
'i' == (*itr)) ? inf_lc : inf_uc;
1812 if (*inf_itr == static_cast<char>(*itr))
1823 t = -std::numeric_limits<T>::infinity();
1825 t = std::numeric_limits<T>::infinity();
1830 template <
typename Iterator,
typename T>
1833 if (end == itr_external)
return false;
1835 Iterator itr = itr_external;
1839 const bool negative = (
'-' == (*itr));
1841 if (negative ||
'+' == (*itr))
1847 bool instate =
false;
1851 #define parse_digit_1(d) \ 1852 if ((digit = (*itr - zero)) < 10) \ 1853 { d = d * T(10) + digit; } \ 1856 if (end == ++itr) break; \ 1858 #define parse_digit_2(d) \ 1859 if ((digit = (*itr - zero)) < 10) \ 1860 { d = d * T(10) + digit; } \ 1866 const Iterator curr = itr;
1868 while ((end != itr) && (zero == (*itr))) ++itr;
1876 #ifdef exprtk_enable_superscalar 1885 if (curr != itr) instate =
true;
1894 const Iterator curr = ++itr;
1900 #ifdef exprtk_enable_superscalar 1913 d +=
compute_pow10(tmp_d,static_cast<int>(-std::distance(curr,itr)));
1916 #undef parse_digit_1 1917 #undef parse_digit_2 1924 if ((
'e' == c) || (
'E' == c))
1941 if ((
'f' == c) || (
'F' == c) || (
'l' == c) || (
'L' == c))
1947 else if ((
'I' <= (*itr)) && ((*itr) <=
'n'))
1949 if ((
'i' == (*itr)) || (
'I' == (*itr)))
1953 else if ((
'n' == (*itr)) || (
'N' == (*itr)))
1963 else if ((
'I' <= (*itr)) && ((*itr) <=
'n'))
1965 if ((
'i' == (*itr)) || (
'I' == (*itr)))
1969 else if ((
'n' == (*itr)) || (
'N' == (*itr)))
1982 if ((end != itr) || (!instate))
1987 t =
static_cast<T
>((negative) ? -d : d);
1991 template <
typename T>
2002 template <
typename T>
2057 template <
typename Iterator>
2059 const Iterator begin,
const Iterator end,
2060 const Iterator base_begin = Iterator(0))
2063 value.assign(begin,end);
2065 position =
static_cast<std::size_t
>(std::distance(base_begin,begin));
2069 template <
typename Iterator>
2070 inline token&
set_symbol(
const Iterator begin,
const Iterator end,
const Iterator base_begin = Iterator(0))
2073 value.assign(begin,end);
2075 position =
static_cast<std::size_t
>(std::distance(base_begin,begin));
2079 template <
typename Iterator>
2080 inline token&
set_numeric(
const Iterator begin,
const Iterator end,
const Iterator base_begin = Iterator(0))
2083 value.assign(begin,end);
2085 position =
static_cast<std::size_t
>(std::distance(base_begin,begin));
2089 template <
typename Iterator>
2090 inline token&
set_string(
const Iterator begin,
const Iterator end,
const Iterator base_begin = Iterator(0))
2093 value.assign(begin,end);
2095 position =
static_cast<std::size_t
>(std::distance(base_begin,begin));
2107 template <
typename Iterator>
2109 const Iterator begin,
const Iterator end,
2110 const Iterator base_begin = Iterator(0))
2125 value.assign(begin,end);
2128 position =
static_cast<std::size_t
>(std::distance(base_begin,begin));
2137 case e_none :
return "NONE";
2138 case e_error :
return "ERROR";
2142 case e_eof :
return "EOF";
2152 case e_shr :
return ">>";
2153 case e_shl :
return "<<";
2154 case e_lte :
return "<=";
2155 case e_ne :
return "!=";
2156 case e_gte :
return ">=";
2157 case e_lt :
return "<";
2158 case e_gt :
return ">";
2159 case e_eq :
return "=";
2167 case e_add :
return "+";
2168 case e_sub :
return "-";
2169 case e_div :
return "/";
2170 case e_mul :
return "*";
2171 case e_mod :
return "%";
2172 case e_pow :
return "^";
2175 case e_swap :
return "<=>";
2176 default :
return "UNKNOWN";
2227 s_end_ = str.data() + str.size();
2351 #ifndef exprtk_disable_comments 2352 const char_t c0 = *(itr + 0);
2353 const char_t c1 = *(itr + 1);
2357 else if (!
is_end(itr + 1))
2359 if ((
'/' == c0) && (
'/' == c1))
return true;
2360 if ((
'/' == c0) && (
'*' == c1))
return true;
2376 #ifndef exprtk_disable_comments 2383 static inline bool comment_start(
const char_t c0,
const char_t c1,
int& mode,
int& incr)
2386 if (
'#' == c0) { mode = 1; incr = 1; }
2389 if (
'/' == c1) { mode = 1; incr = 2; }
2390 else if (
'*' == c1) { mode = 2; incr = 2; }
2395 static inline bool comment_end(
const char_t c0,
const char_t c1,
int& mode)
2398 ((1 == mode) && (
'\n' == c0)) ||
2399 ((2 == mode) && (
'*' == c0) && (
'/' == c1))
2415 else if (!test::comment_start(*
s_itr_, *(
s_itr_ + 1), mode, increment))
2424 if ((1 == mode) && test::comment_end(*
s_itr_, 0, mode))
2478 else if (
'$' == (*
s_itr_))
2483 #ifndef exprtk_disable_string_capabilities 2484 else if (
'\'' == (*
s_itr_))
2490 else if (
'~' == (*
s_itr_))
2521 if ((c0 ==
'<') && (c1 ==
'=') && (c2 ==
'>'))
2588 (
s_itr_ != initial_itr) &&
2626 bool dot_found =
false;
2627 bool e_found =
false;
2628 bool post_e_sign_found =
false;
2629 bool post_e_digit_found =
false;
2648 else if (
'e' == std::tolower(*
s_itr_))
2678 if (post_e_sign_found)
2686 post_e_sign_found =
true;
2693 post_e_digit_found =
true;
2745 #ifndef exprtk_disable_string_capabilities 2760 bool escaped_found =
false;
2761 bool escaped =
false;
2765 if (!escaped && (
'\\' == *
s_itr_))
2767 escaped_found =
true;
2786 #if defined(_MSC_VER) && (_MSC_VER == 1600) 2795 const bool x_seperator = (
'x' == *(
s_itr_ + 1)) ||
2801 if (!within_range || !x_seperator || !both_digits)
2836 static_cast<std::size_t>(std::distance(
base_itr_,initial_itr)));
2885 throw std::invalid_argument(
"token_scanner() - Invalid stride value");
2903 if (!
operator()(t0))
2915 if (!
operator()(t0, t1))
2928 if (!
operator()(t0, t1, t2))
2942 if (!
operator()(t0, t1, t2, t3))
2986 std::size_t changes = 0;
2988 for (std::size_t i = 0; i < g.
token_list_.size(); ++i)
3008 throw std::invalid_argument(
"token_inserter() - Invalid stride value");
3019 std::size_t changes = 0;
3021 for (std::size_t i = 0; i < (g.
token_list_.size() - stride_ + 1); ++i)
3023 int insert_index = -1;
3044 typedef std::iterator_traits<generator::token_list_t::iterator>::difference_type diff_t;
3046 if ((insert_index >= 0) && (insert_index <= (static_cast<int>(stride_) + 1)))
3049 g.
token_list_.begin() +
static_cast<diff_t
>(i +
static_cast<std::size_t
>(insert_index)),
t);
3058 #define token_inserter_empty_body \ 3078 #undef token_inserter_empty_body 3082 const std::size_t stride_;
3113 typedef std::iterator_traits<generator::token_list_t::iterator>::difference_type diff_t;
3118 std::size_t changes = 0;
3120 for (
int i = 0; i < static_cast<int>(g.
token_list_.size() - 1); ++i)
3124 while (
join(g[i], g[i + 1],
t))
3132 if (static_cast<std::size_t>(i + 1) >= g.
token_list_.size())
3142 typedef std::iterator_traits<generator::token_list_t::iterator>::difference_type diff_t;
3147 std::size_t changes = 0;
3149 for (
int i = 0; i < static_cast<int>(g.
token_list_.size() - 2); ++i)
3153 while (
join(g[i], g[i + 1], g[i + 2],
t))
3158 g.
token_list_.begin() +
static_cast<diff_t
>(i + 3));
3161 if (static_cast<std::size_t>(i + 2) >= g.
token_list_.size())
3180 printf(
"Token[%02d] @ %03d %6s --> '%s'\n",
3181 static_cast<int>(i),
3182 static_cast<int>(
t.position),
3183 t.to_str(
t.type).c_str(),
3207 new_token.
value =
"*";
3216 else if (!t0.
value.empty() && (
'$' == t0.
value[0]))
3242 return (match) ? 1 : -1;
3427 using lexer::token_scanner::operator();
3440 t.position =
stack_.top().second;
3458 stack_ = std::stack<std::pair<char,std::size_t> >();
3486 else if (c !=
stack_.top().first)
3504 std::stack<std::pair<char,std::size_t> >
stack_;
3512 using lexer::token_scanner::operator();
3581 const replace_map_t::iterator itr =
replace_map_.find(target_symbol);
3595 const replace_map_t::iterator itr =
replace_map_.find(target_symbol);
3602 replace_map_[target_symbol] = std::make_pair(replace_symbol,token_type);
3621 const replace_map_t::iterator itr =
replace_map_.find(
t.value);
3625 t.value = itr->second.first;
3626 t.type = itr->second.second;
3642 typedef std::pair<lexer::token::token_type,lexer::token::token_type>
token_pair_t;
3647 using lexer::token_scanner::operator();
3702 std::pair<lexer::token,lexer::token>
error(
const std::size_t index)
3711 return std::make_pair(error_token,error_token);
3754 default :
return false;
3774 default :
return true ;
3788 default :
return true ;
3798 default :
return false;
3815 typedef std::set<token_triplet_t>
set_t;
3819 using lexer::token_scanner::operator();
3865 std::pair<lexer::token,lexer::token>
error(
const std::size_t index)
3874 return std::make_pair(error_token,error_token);
3887 invalid_comb_.insert(std::make_pair(t0,std::make_pair(t1,t2)));
4166 template <
typename T>
4191 for (std::size_t i = 0; i <
data_ref_.size(); ++i)
4210 return data_[index];
4215 return data_[index];
4230 template <
typename T>
4232 const std::size_t size,
const std::size_t offset = 0)
4237 template <
typename T>
4239 const std::size_t size,
const std::size_t offset = 0)
4246 template <
typename T>
4327 template <
typename ViewType>
4401 template <
typename IntType>
4407 i =
static_cast<IntType
>(
v_);
4412 template <
typename UIntType>
4420 u =
static_cast<UIntType
>(
v_);
4429 template <
typename StringView>
4435 #ifndef exprtk_disable_return_statement 4443 template <
typename T>
4491 #ifndef exprtk_disable_return_statement 4575 case e_add :
return "+";
4576 case e_sub :
return "-";
4577 case e_mul :
return "*";
4578 case e_div :
return "/";
4579 case e_mod :
return "%";
4580 case e_pow :
return "^";
4587 case e_lt :
return "<";
4588 case e_lte :
return "<=";
4589 case e_eq :
return "==";
4591 case e_ne :
return "!=";
4593 case e_gte :
return ">=";
4594 case e_gt :
return ">";
4595 default :
return"N/A";
4610 namespace loop_unroll
4612 #ifndef exprtk_disable_superscalar_unroll 4633 #ifdef exprtk_enable_debugging 4642 static_cast<unsigned int>(size)));
4649 template <
typename T>
4813 #ifdef exprtk_enable_debugging 4819 for (std::size_t i = 0; i <
size(); ++i)
4841 const std::size_t size0 = cb0->
size;
4842 const std::size_t size1 = cb1->
size;
4847 return (size0) ? size0 : size1;
4857 template <
typename T>
4862 case e_abs :
return numeric::abs (arg);
4863 case e_acos :
return numeric::acos (arg);
4864 case e_acosh :
return numeric::acosh(arg);
4865 case e_asin :
return numeric::asin (arg);
4866 case e_asinh :
return numeric::asinh(arg);
4867 case e_atan :
return numeric::atan (arg);
4868 case e_atanh :
return numeric::atanh(arg);
4869 case e_ceil :
return numeric::ceil (arg);
4870 case e_cos :
return numeric::cos (arg);
4871 case e_cosh :
return numeric::cosh (arg);
4872 case e_exp :
return numeric::exp (arg);
4873 case e_expm1 :
return numeric::expm1(arg);
4874 case e_floor :
return numeric::floor(arg);
4875 case e_log :
return numeric::log (arg);
4876 case e_log10 :
return numeric::log10(arg);
4878 case e_log1p :
return numeric::log1p(arg);
4879 case e_neg :
return numeric::neg (arg);
4880 case e_pos :
return numeric::pos (arg);
4881 case e_round :
return numeric::round(arg);
4882 case e_sin :
return numeric::sin (arg);
4883 case e_sinc :
return numeric::sinc (arg);
4884 case e_sinh :
return numeric::sinh (arg);
4885 case e_sqrt :
return numeric::sqrt (arg);
4886 case e_tan :
return numeric::tan (arg);
4887 case e_tanh :
return numeric::tanh (arg);
4888 case e_cot :
return numeric::cot (arg);
4889 case e_sec :
return numeric::sec (arg);
4890 case e_csc :
return numeric::csc (arg);
4891 case e_r2d :
return numeric::r2d (arg);
4892 case e_d2r :
return numeric::d2r (arg);
4893 case e_d2g :
return numeric::d2g (arg);
4894 case e_g2d :
return numeric::g2d (arg);
4895 case e_notl :
return numeric::notl (arg);
4896 case e_sgn :
return numeric::sgn (arg);
4897 case e_erf :
return numeric::erf (arg);
4898 case e_erfc :
return numeric::erfc (arg);
4899 case e_ncdf :
return numeric::ncdf (arg);
4900 case e_frac :
return numeric::frac (arg);
4901 case e_trunc :
return numeric::trunc(arg);
4903 default :
exprtk_debug((
"numeric::details::process_impl<T> - Invalid unary operation.\n"));
4904 return std::numeric_limits<T>::quiet_NaN();
4908 template <
typename T>
4913 case e_add :
return (arg0 + arg1);
4914 case e_sub :
return (arg0 - arg1);
4915 case e_mul :
return (arg0 * arg1);
4916 case e_div :
return (arg0 / arg1);
4917 case e_mod :
return modulus<T>(arg0,arg1);
4918 case e_pow :
return pow<T>(arg0,arg1);
4919 case e_atan2 :
return atan2<T>(arg0,arg1);
4920 case e_min :
return std::min<T>(arg0,arg1);
4921 case e_max :
return std::max<T>(arg0,arg1);
4922 case e_logn :
return logn<T>(arg0,arg1);
4923 case e_lt :
return (arg0 < arg1) ? T(1) : T(0);
4924 case e_lte :
return (arg0 <= arg1) ? T(1) : T(0);
4925 case e_eq :
return std::equal_to<T>()(arg0,arg1) ? T(1) : T(0);
4926 case e_ne :
return std::not_equal_to<T>()(arg0,arg1) ? T(1) : T(0);
4927 case e_gte :
return (arg0 >= arg1) ? T(1) : T(0);
4928 case e_gt :
return (arg0 > arg1) ? T(1) : T(0);
4929 case e_and :
return and_opr <T>(arg0,arg1);
4930 case e_nand :
return nand_opr<T>(arg0,arg1);
4931 case e_or :
return or_opr <T>(arg0,arg1);
4932 case e_nor :
return nor_opr <T>(arg0,arg1);
4933 case e_xor :
return xor_opr <T>(arg0,arg1);
4934 case e_xnor :
return xnor_opr<T>(arg0,arg1);
4935 case e_root :
return root <T>(arg0,arg1);
4936 case e_roundn :
return roundn <T>(arg0,arg1);
4939 case e_hypot :
return hypot <T>(arg0,arg1);
4940 case e_shr :
return shr <T>(arg0,arg1);
4941 case e_shl :
return shl <T>(arg0,arg1);
4943 default :
exprtk_debug((
"numeric::details::process_impl<T> - Invalid binary operation.\n"));
4944 return std::numeric_limits<T>::quiet_NaN();
4948 template <
typename T>
4953 case e_add :
return (arg0 + arg1);
4954 case e_sub :
return (arg0 - arg1);
4955 case e_mul :
return (arg0 * arg1);
4956 case e_div :
return (arg0 / arg1);
4957 case e_mod :
return arg0 % arg1;
4958 case e_pow :
return pow<T>(arg0,arg1);
4959 case e_min :
return std::min<T>(arg0,arg1);
4960 case e_max :
return std::max<T>(arg0,arg1);
4961 case e_logn :
return logn<T>(arg0,arg1);
4962 case e_lt :
return (arg0 < arg1) ? T(1) : T(0);
4963 case e_lte :
return (arg0 <= arg1) ? T(1) : T(0);
4964 case e_eq :
return (arg0 == arg1) ? T(1) : T(0);
4965 case e_ne :
return (arg0 != arg1) ? T(1) : T(0);
4966 case e_gte :
return (arg0 >= arg1) ? T(1) : T(0);
4967 case e_gt :
return (arg0 > arg1) ? T(1) : T(0);
4968 case e_and :
return ((arg0 != T(0)) && (arg1 != T(0))) ? T(1) : T(0);
4969 case e_nand :
return ((arg0 != T(0)) && (arg1 != T(0))) ? T(0) : T(1);
4970 case e_or :
return ((arg0 != T(0)) || (arg1 != T(0))) ? T(1) : T(0);
4971 case e_nor :
return ((arg0 != T(0)) || (arg1 != T(0))) ? T(0) : T(1);
4972 case e_xor :
return arg0 ^ arg1;
4973 case e_xnor :
return !(arg0 ^ arg1);
4974 case e_root :
return root<T>(arg0,arg1);
4975 case e_equal :
return arg0 == arg1;
4976 case e_nequal :
return arg0 != arg1;
4977 case e_hypot :
return hypot<T>(arg0,arg1);
4978 case e_shr :
return arg0 >> arg1;
4979 case e_shl :
return arg0 << arg1;
4981 default :
exprtk_debug((
"numeric::details::process_impl<IntType> - Invalid binary operation.\n"));
4982 return std::numeric_limits<T>::quiet_NaN();
4987 template <
typename T>
4993 template <
typename T>
5000 template <
typename T>
5054 return std::numeric_limits<T>::quiet_NaN();
5068 template <
typename T>
5073 return std::not_equal_to<double>()(0.0,v);
5078 return std::not_equal_to<long double>()(0.0L,v);
5083 return std::not_equal_to<float>()(0.0
f,v);
5086 template <
typename T>
5089 return std::not_equal_to<std::complex<T> >()(std::complex<T>(0),v);
5092 template <
typename T>
5095 return std::not_equal_to<T>()(T(0),node->
value());
5098 template <
typename T>
5101 return std::equal_to<T>()(T(0),node->
value());
5104 template <
typename T>
5110 template <
typename T>
5116 template <
typename T>
5122 template <
typename T>
5128 template <
typename T>
5140 template <
typename T>
5146 template <
typename T>
5152 template <
typename T>
5158 template <
typename T>
5164 template <
typename T>
5169 switch (node->
type())
5181 default :
return false;
5188 template <
typename T>
5194 template <
typename T>
5200 template <
typename T>
5206 template <
typename T>
5212 template <
typename T>
5218 template <
typename T>
5224 template <
typename T>
5232 template <
typename T>
5243 template <
typename T>
5250 template <std::
size_t N,
typename T>
5253 for (std::size_t i = 0; i < N; ++i)
5255 if (0 == b[i])
return false;
5261 template <
typename T,
5263 template <
typename,
typename>
class Sequence>
5266 for (std::size_t i = 0; i < b.size(); ++i)
5268 if (0 == b[i])
return false;
5274 template <std::
size_t N,
typename T>
5277 for (std::size_t i = 0; i < N; ++i)
5288 template <
typename T,
5290 template <
typename,
typename>
class Sequence>
5293 for (std::size_t i = 0; i < b.size(); ++i)
5304 template <
typename NodeAllocator,
typename T, std::
size_t N>
5307 for (std::size_t i = 0; i < N; ++i)
5313 template <
typename NodeAllocator,
5316 template <
typename,
typename>
class Sequence>
5319 for (std::size_t i = 0; i < b.size(); ++i)
5327 template <
typename NodeAllocator,
typename T>
5343 template <
typename T>
5350 template <
typename Type>
5425 template <
typename Allocator,
5426 template <
typename,
typename>
class Sequence>
5507 template <
typename Allocator>
5547 template <
typename T>
5554 return std::numeric_limits<T>::quiet_NaN();
5563 template <
typename T>
5617 template <
typename T>
5649 template <
typename T>
5652 template <
typename T>
5655 template <
typename T>
5670 #ifndef exprtk_disable_string_capabilities 5671 template <
typename T>
5685 virtual std::size_t
size()
const = 0;
5688 template <
typename T>
5700 rp_.
n0_c = std::make_pair<bool,std::size_t>(
true,0);
5701 rp_.
n1_c = std::make_pair<bool,std::size_t>(
true,v.size() - 1);
5708 return std::numeric_limits<T>::quiet_NaN();
5756 template <
typename T>
5812 template <
typename T, std::
size_t D,
bool B>
5815 template <std::
size_t N>
5820 template <
typename T, std::
size_t D>
5823 template <std::
size_t N>
5833 template <std::
size_t N,
typename T>
5860 template <
typename T, std::
size_t N>
5863 for (std::size_t i = 0; i < N; ++i)
5865 if (branch[i].first && branch[i].second)
5872 template <
typename T,
5874 template <
typename,
typename>
class Sequence>
5877 for (std::size_t i = 0; i < branch.size(); ++i)
5879 if (branch[i].first && branch[i].second)
5887 template <
typename T>
5900 init_branches<2>(
branch_, branch0, branch1);
5905 cleanup_branches::execute<T,2>(
branch_);
5910 const T arg0 =
branch_[0].first->value();
5911 const T arg1 =
branch_[1].first->value();
5913 return numeric::process<T>(
operation_,arg0,arg1);
5930 else if (1 == index)
5942 template <
typename T,
typename Operation>
5952 init_branches<2>(
branch_, branch0, branch1);
5957 cleanup_branches::execute<T,2>(
branch_);
5962 const T arg0 =
branch_[0].first->value();
5963 const T arg1 =
branch_[1].first->value();
5975 return Operation::operation();
5982 else if (1 == index)
5993 template <
typename T>
6007 init_branches<3>(
branch_, branch0, branch1, branch2);
6012 cleanup_branches::execute<T,3>(
branch_);
6017 const T arg0 =
branch_[0].first->value();
6018 const T arg1 =
branch_[1].first->value();
6019 const T arg2 =
branch_[2].first->value();
6023 case e_inrange :
return (arg1 < arg0) ? T(0) : ((arg1 > arg2) ? T(0) : T(1));
6025 case e_clamp :
return (arg1 < arg0) ? arg0 : (arg1 > arg2 ? arg2 : arg1);
6027 case e_iclamp :
if ((arg1 <= arg0) || (arg1 >= arg2))
6030 return ((T(2) * arg1 <= (arg2 + arg0)) ? arg0 : arg2);
6032 default :
exprtk_debug((
"trinary_node::value() - Error: Invalid operation\n"));
6033 return std::numeric_limits<T>::quiet_NaN();
6048 template <
typename T>
6063 init_branches<4>(
branch_, branch0, branch1, branch2, branch3);
6068 cleanup_branches::execute<T,4>(
branch_);
6073 return std::numeric_limits<T>::quiet_NaN();
6087 template <
typename T>
6146 template <
typename T>
6180 return std::numeric_limits<T>::quiet_NaN();
6196 #ifndef exprtk_disable_break_continue 6197 template <
typename T>
6212 template <
typename T>
6236 return std::numeric_limits<T>::quiet_NaN();
6251 template <
typename T>
6260 return std::numeric_limits<T>::quiet_NaN();
6271 template <
typename T>
6323 template <
typename T>
6376 template <
typename T>
6463 #ifndef exprtk_disable_break_continue 6464 template <
typename T>
6525 template <
typename T>
6587 template <
typename T>
6694 template <
typename T>
6701 template <
typename Allocator,
6702 template <
typename,
typename>
class Sequence>
6703 explicit switch_node(
const Sequence<expression_ptr,Allocator>& arg_list)
6705 if (1 != (arg_list.size() & 1))
6711 for (std::size_t i = 0; i < arg_list.size(); ++i)
6729 for (std::size_t i = 0; i <
arg_list_.size(); ++i)
6742 const std::size_t upper_bound = (
arg_list_.size() - 1);
6744 for (std::size_t i = 0; i < upper_bound; i += 2)
6751 return consequent->
value();
6758 return std::numeric_limits<T>::quiet_NaN();
6772 template <
typename T,
typename Switch_N>
6779 template <
typename Allocator,
6780 template <
typename,
typename>
class Sequence>
6791 template <
typename T>
6798 template <
typename Allocator,
6799 template <
typename,
typename>
class Sequence>
6802 if (0 != (arg_list.size() & 1))
6808 for (std::size_t i = 0; i < arg_list.size(); ++i)
6826 for (std::size_t i = 0; i <
arg_list_.size(); ++i)
6841 return std::numeric_limits<T>::quiet_NaN();
6844 const std::size_t upper_bound = (
arg_list_.size() - 1);
6846 for (std::size_t i = 0; i < upper_bound; i += 2)
6853 result = consequent->
value();
6871 template <
typename T>
6879 virtual T&
ref() = 0;
6880 virtual const T&
ref()
const = 0;
6883 template <
typename T>
6899 inline bool operator <(const variable_node<T>& v)
const 6929 template <
typename T>
6932 template <
typename T>
6941 n0_c (
std::make_pair(false,0)),
6942 n1_c (
std::make_pair(false,0)),
6950 n0_c = std::make_pair(
false,0);
6951 n1_c = std::make_pair(
false,0);
6952 cache = std::make_pair(0,0);
6986 return (
n0_c.first &&
n1_c.first) &&
6992 return (
n0_e.first &&
n1_e.first) &&
7000 else if (
n0_e.first)
7002 T r0_value =
n0_e.second->value();
7014 else if (
n1_e.first)
7016 T r1_value =
n1_e.second->value();
7042 return (
n1_c.second -
n0_c.second + 1);
7050 std::pair<bool,expression_node_ptr>
n0_e;
7051 std::pair<bool,expression_node_ptr>
n1_e;
7057 template <
typename T>
7060 template <
typename T>
7083 template <
typename T>
7094 virtual std::size_t
size ()
const = 0;
7102 virtual const vds_t&
vds ()
const = 0;
7107 template <
typename T>
7108 class vector_node :
public expression_node <T>,
7109 public vector_interface<T>
7176 template <
typename T>
7234 template <
typename T>
7295 template <
typename T>
7346 template <
typename T>
7354 const std::size_t& size,
7355 const std::vector<expression_ptr>& initialiser_list,
7356 const bool single_value_initialse)
7378 for (std::size_t i = 0; i <
size_; ++i)
7387 for (std::size_t i = 0; i < il_size; ++i)
7392 if (il_size <
size_)
7394 for (std::size_t i = il_size; i <
size_; ++i)
7419 template <
typename T>
7449 template <
typename T>
7480 template <
typename T>
7538 for (std::size_t i = 0; i <
vec_size_; ++i)
7540 std::swap(vec0[i],vec1[i]);
7546 return std::numeric_limits<T>::quiet_NaN();
7588 #ifndef exprtk_disable_string_capabilities 7589 template <
typename T>
7607 rp_.
n0_c = std::make_pair<bool,std::size_t>(
true,0);
7608 rp_.
n1_c = std::make_pair<bool,std::size_t>(
true,v.size() - 1);
7613 inline bool operator <(const stringvar_node<T>& v)
const 7620 rp_.
n1_c.second = (*value_).size() - 1;
7623 return std::numeric_limits<T>::quiet_NaN();
7633 return &(*value_)[0];
7638 return ref().size();
7672 template <
typename T>
7675 template <
typename T>
7696 inline bool operator <(const string_range_node<T>& v)
const 7703 return std::numeric_limits<T>::quiet_NaN();
7713 return &(*value_)[0];
7718 return ref().size();
7757 template <
typename T>
7760 template <
typename T>
7781 return std::numeric_limits<T>::quiet_NaN();
7827 template <
typename T>
7850 range_.
n0_c = std::make_pair<bool,std::size_t>(
true,0);
7851 range_.
n1_c = std::make_pair<bool,std::size_t>(
true,0);
7887 std::size_t str_r0 = 0;
7888 std::size_t str_r1 = 0;
7898 range (str_r0,str_r1,base_str_size) &&
7902 const std::size_t
size = (r1 - r0) + 1;
7911 return std::numeric_limits<T>::quiet_NaN();
7956 template <
typename T>
7980 range_.
n0_c = std::make_pair<bool,std::size_t>(
true,0);
7981 range_.
n1_c = std::make_pair<bool,std::size_t>(
true,0);
8025 std::size_t str0_r0 = 0;
8026 std::size_t str0_r1 = 0;
8028 std::size_t str1_r0 = 0;
8029 std::size_t str1_r1 = 0;
8039 const std::size_t size0 = (str0_r1 - str0_r0) + 1;
8040 const std::size_t size1 = (str1_r1 - str1_r0) + 1;
8050 return std::numeric_limits<T>::quiet_NaN();
8094 template <
typename T>
8138 return std::numeric_limits<T>::quiet_NaN();
8178 template <
typename T>
8242 std::size_t str0_r0 = 0;
8243 std::size_t str0_r1 = 0;
8245 std::size_t str1_r0 = 0;
8246 std::size_t str1_r1 = 0;
8248 range_t& range0 = (*str0_range_ptr_);
8249 range_t& range1 = (*str1_range_ptr_);
8256 const std::size_t size0 = range0.
cache_size();
8257 const std::size_t size1 = range1.
cache_size();
8258 const std::size_t max_size =
std::min(size0,size1);
8266 while (s0 < upper_bound)
8268 #define exprtk_loop(N) \ 8269 std::swap(s0[N], s1[N]); \ 8273 #ifndef exprtk_disable_superscalar_unroll 8291 #define case_stmt(N) \ 8292 case N : { std::swap(s0[i],s1[i]); ++i; } \ 8294 #ifndef exprtk_disable_superscalar_unroll 8312 return std::numeric_limits<T>::quiet_NaN();
8332 template <
typename T>
8349 return T((*value_).size());
8362 template <
typename T>
8365 template <
typename T>
8397 T result = std::numeric_limits<T>::quiet_NaN();
8423 { s.assign(
data,size); }
8429 { s.append(
data,size); }
8432 template <
typename T,
typename AssignmentProcess = asn_assignment>
8494 range_t& range = (*str1_range_ptr_);
8506 return std::numeric_limits<T>::quiet_NaN();
8548 template <
typename T,
typename AssignmentProcess = asn_assignment>
8617 std::size_t s0_r0 = 0;
8618 std::size_t s0_r1 = 0;
8620 std::size_t s1_r0 = 0;
8621 std::size_t s1_r1 = 0;
8623 range_t& range0 = (*str0_range_ptr_);
8624 range_t& range1 = (*str1_range_ptr_);
8631 std::size_t
size =
std::min((s0_r1 - s0_r0),(s1_r1 - s1_r0)) + 1;
8639 return std::numeric_limits<T>::quiet_NaN();
8682 template <
typename T>
8709 range_.
n0_c = std::make_pair<bool,std::size_t>(
true,0);
8710 range_.
n1_c = std::make_pair<bool,std::size_t>(
true,0);
8763 const std::size_t
size = (r1 - r0) + 1;
8781 const std::size_t
size = (r1 - r0) + 1;
8793 return std::numeric_limits<T>::quiet_NaN();
8841 template <
typename T>
8864 range_.
n0_c = std::make_pair<bool,std::size_t>(
true,0);
8865 range_.
n1_c = std::make_pair<bool,std::size_t>(
true,0);
8901 const std::size_t
size = (r1 - r0) + 1;
8913 return std::numeric_limits<T>::quiet_NaN();
8958 template <
typename T,
typename VarArgFunction>
8972 template <
typename Allocator,
8973 template <
typename,
typename>
class Sequence>
8998 if (arg_list.size() > 1)
9000 const std::size_t arg_list_size = arg_list.size() - 1;
9005 for (std::size_t i = 0; i < arg_list_size; ++i)
9029 for (std::size_t i = 0; i <
arg_list_.size(); ++i)
9047 return std::numeric_limits<T>::quiet_NaN();
9092 template <
typename T, std::
size_t N>
9099 template <
typename T, std::
size_t N>
9106 template <
typename T>
9117 #define define_sfop3(NN,OP0,OP1) \ 9118 template <typename T> \ 9119 struct sf##NN##_op : public sf_base<T> \ 9121 typedef typename sf_base<T>::Type Type; \ 9122 static inline T process(Type x, Type y, Type z) \ 9126 static inline std::string id() \ 9181 #define define_sfop4(NN,OP0,OP1) \ 9182 template <typename T> \ 9183 struct sf##NN##_op : public sf_base<T> \ 9185 typedef typename sf_base<T>::Type Type; \ 9186 static inline T process(Type x, Type y, Type z, Type w) \ 9190 static inline std::string id() { return OP1; } \ 9313 template <
typename T,
typename SpecialFunction>
9321 expression_ptr branch0,
9322 expression_ptr branch1,
9323 expression_ptr branch2)
9327 inline T
value()
const 9337 template <
typename T,
typename SpecialFunction>
9363 template <
typename T,
typename SpecialFunction>
9396 template <
typename T,
typename SpecialFunction>
9431 template <
typename T,
typename VarArgFunction>
9438 template <
typename Allocator,
9439 template <
typename,
typename>
class Sequence>
9440 explicit vararg_node(
const Sequence<expression_ptr,Allocator>& arg_list)
9445 for (std::size_t i = 0; i < arg_list.size(); ++i)
9463 for (std::size_t i = 0; i <
arg_list_.size(); ++i)
9477 return std::numeric_limits<T>::quiet_NaN();
9491 template <
typename T,
typename VarArgFunction>
9498 template <
typename Allocator,
9499 template <
typename,
typename>
class Sequence>
9504 for (std::size_t i = 0; i < arg_list.size(); ++i)
9524 return std::numeric_limits<T>::quiet_NaN();
9537 template <
typename T,
typename VecFunction>
9573 return std::numeric_limits<T>::quiet_NaN();
9588 template <
typename T>
9618 return std::numeric_limits<T>::quiet_NaN();
9626 template <
typename T>
9656 return std::numeric_limits<T>::quiet_NaN();
9664 template <
typename T>
9694 return std::numeric_limits<T>::quiet_NaN();
9702 template <
typename T>
9732 return std::numeric_limits<T>::quiet_NaN();
9740 template <
typename T>
9774 while (
vec < upper_bound)
9776 #define exprtk_loop(N) \ 9781 #ifndef exprtk_disable_superscalar_unroll 9796 #define case_stmt(N) \ 9797 case N : *vec++ = v; \ 9799 #ifndef exprtk_disable_superscalar_unroll 9818 return std::numeric_limits<T>::quiet_NaN();
9857 template <
typename T>
9923 while (vec0 < upper_bound)
9925 #define exprtk_loop(N) \ 9926 vec0[N] = vec1[N]; \ 9930 #ifndef exprtk_disable_superscalar_unroll 9946 #define case_stmt(N) \ 9947 case N : *vec0++ = *vec1++; \ 9949 #ifndef exprtk_disable_superscalar_unroll 9968 return std::numeric_limits<T>::quiet_NaN();
10010 template <
typename T,
typename Operation>
10039 return std::numeric_limits<T>::quiet_NaN();
10047 template <
typename T,
typename Operation>
10076 return std::numeric_limits<T>::quiet_NaN();
10084 template <
typename T,
typename Operation>
10113 return std::numeric_limits<T>::quiet_NaN();
10121 template <
typename T,
typename Operation>
10150 return std::numeric_limits<T>::quiet_NaN();
10158 template <
typename T,
typename Operation>
10192 while (
vec < upper_bound)
10194 #define exprtk_loop(N) \ 10195 Operation::assign(vec[N],v); \ 10199 #ifndef exprtk_disable_superscalar_unroll 10214 #define case_stmt(N) \ 10215 case N : Operation::assign(*vec++,v); \ 10217 #ifndef exprtk_disable_superscalar_unroll 10237 return std::numeric_limits<T>::quiet_NaN();
10281 template <
typename T,
typename Operation>
10339 while (vec0 < upper_bound)
10341 #define exprtk_loop(N) \ 10342 vec0[N] = Operation::process(vec0[N], vec1[N]); \ 10346 #ifndef exprtk_disable_superscalar_unroll 10364 #define case_stmt(N) \ 10365 case N : { vec0[i] = Operation::process(vec0[i], vec1[i]); ++i; } \ 10367 #ifndef exprtk_disable_superscalar_unroll 10386 return std::numeric_limits<T>::quiet_NaN();
10432 template <
typename T,
typename Operation>
10453 bool v0_is_ivec =
false;
10454 bool v1_is_ivec =
false;
10491 if (v0_is_ivec && (vec0.
size() <= vec1.
size()))
10493 else if (v1_is_ivec && (vec1.
size() <= vec0.
size()))
10525 while (vec2 < upper_bound)
10527 #define exprtk_loop(N) \ 10528 vec2[N] = Operation::process(vec0[N], vec1[N]); \ 10532 #ifndef exprtk_disable_superscalar_unroll 10551 #define case_stmt(N) \ 10552 case N : { vec2[i] = Operation::process(vec0[i], vec1[i]); ++i; } \ 10554 #ifndef exprtk_disable_superscalar_unroll 10573 return std::numeric_limits<T>::quiet_NaN();
10616 template <
typename T,
typename Operation>
10635 bool v0_is_ivec =
false;
10683 while (vec0 < upper_bound)
10685 #define exprtk_loop(N) \ 10686 vec1[N] = Operation::process(vec0[N], v); \ 10690 #ifndef exprtk_disable_superscalar_unroll 10708 #define case_stmt(N) \ 10709 case N : { vec1[i] = Operation::process(vec0[i], v); ++i; } \ 10711 #ifndef exprtk_disable_superscalar_unroll 10730 return std::numeric_limits<T>::quiet_NaN();
10771 template <
typename T,
typename Operation>
10790 bool v1_is_ivec =
false;
10838 while (vec0 < upper_bound)
10840 #define exprtk_loop(N) \ 10841 vec0[N] = Operation::process(v, vec1[N]); \ 10845 #ifndef exprtk_disable_superscalar_unroll 10863 #define case_stmt(N) \ 10864 case N : { vec0[i] = Operation::process(v, vec1[i]); ++i; } \ 10866 #ifndef exprtk_disable_superscalar_unroll 10885 return std::numeric_limits<T>::quiet_NaN();
10926 template <
typename T,
typename Operation>
10943 bool vec0_is_ivec =
false;
10956 vec0_is_ivec =
true;
10990 while (vec0 < upper_bound)
10992 #define exprtk_loop(N) \ 10993 vec1[N] = Operation::process(vec0[N]); \ 10997 #ifndef exprtk_disable_superscalar_unroll 11015 #define case_stmt(N) \ 11016 case N : { vec1[i] = Operation::process(vec0[i]); ++i; } \ 11018 #ifndef exprtk_disable_superscalar_unroll 11037 return std::numeric_limits<T>::quiet_NaN();
11078 template <
typename T>
11094 std::not_equal_to<T>()
11096 std::not_equal_to<T>()
11102 template <
typename T>
11118 std::not_equal_to<T>()
11120 std::not_equal_to<T>()
11126 template <
typename T,
typename IFunction, std::
size_t N>
11143 cleanup_branches::execute<T,N>(
branch_);
11146 template <std::
size_t NumBranches>
11151 #pragma warning(push) 11152 #pragma warning(disable: 4127) 11154 if (N != NumBranches)
11158 for (std::size_t i = 0; i < NumBranches; ++i)
11168 #pragma warning(pop) 11172 inline bool operator <(const function_N_node<T,IFunction,N>& fn)
const 11174 return this < (&fn);
11181 #pragma warning(push) 11182 #pragma warning(disable: 4127) 11185 return std::numeric_limits<T>::quiet_NaN();
11193 #pragma warning(pop) 11197 template <
typename T_, std::
size_t BranchCount>
11202 for (std::size_t i = 0; i < BranchCount; ++i)
11204 v[i] = b[i].first->value();
11209 template <
typename T_>
11214 v[0] = b[0].first->value();
11215 v[1] = b[1].first->value();
11216 v[2] = b[2].first->value();
11217 v[3] = b[3].first->value();
11218 v[4] = b[4].first->value();
11222 template <
typename T_>
11227 v[0] = b[0].first->value();
11228 v[1] = b[1].first->value();
11229 v[2] = b[2].first->value();
11230 v[3] = b[3].first->value();
11234 template <
typename T_>
11239 v[0] = b[0].first->value();
11240 v[1] = b[1].first->value();
11241 v[2] = b[2].first->value();
11245 template <
typename T_>
11250 v[0] = b[0].first->value();
11251 v[1] = b[1].first->value();
11255 template <
typename T_>
11260 v[0] = b[0].first->value();
11264 template <
typename T_, std::
size_t ParamCount>
11267 template <
typename T_>
11271 {
return f(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7],v[8],v[9],v[10],v[11],v[12],v[13],v[14],v[15],v[16],v[17],v[18],v[19]); }
11274 template <
typename T_>
11278 {
return f(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7],v[8],v[9],v[10],v[11],v[12],v[13],v[14],v[15],v[16],v[17],v[18]); }
11281 template <
typename T_>
11285 {
return f(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7],v[8],v[9],v[10],v[11],v[12],v[13],v[14],v[15],v[16],v[17]); }
11288 template <
typename T_>
11292 {
return f(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7],v[8],v[9],v[10],v[11],v[12],v[13],v[14],v[15],v[16]); }
11295 template <
typename T_>
11299 {
return f(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7],v[8],v[9],v[10],v[11],v[12],v[13],v[14],v[15]); }
11302 template <
typename T_>
11306 {
return f(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7],v[8],v[9],v[10],v[11],v[12],v[13],v[14]); }
11309 template <
typename T_>
11313 {
return f(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7],v[8],v[9],v[10],v[11],v[12],v[13]); }
11316 template <
typename T_>
11320 {
return f(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7],v[8],v[9],v[10],v[11],v[12]); }
11323 template <
typename T_>
11327 {
return f(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7],v[8],v[9],v[10],v[11]); }
11330 template <
typename T_>
11334 {
return f(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7],v[8],v[9],v[10]); }
11337 template <
typename T_>
11341 {
return f(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7],v[8],v[9]); }
11344 template <
typename T_>
11348 {
return f(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7],v[8]); }
11351 template <
typename T_>
11355 {
return f(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7]); }
11358 template <
typename T_>
11362 {
return f(v[0],v[1],v[2],v[3],v[4],v[5],v[6]); }
11365 template <
typename T_>
11369 {
return f(v[0],v[1],v[2],v[3],v[4],v[5]); }
11372 template <
typename T_>
11376 {
return f(v[0],v[1],v[2],v[3],v[4]); }
11379 template <
typename T_>
11383 {
return f(v[0],v[1],v[2],v[3]); }
11386 template <
typename T_>
11390 {
return f(v[0],v[1],v[2]); }
11393 template <
typename T_>
11397 {
return f(v[0],v[1]); }
11400 template <
typename T_>
11404 {
return f(v[0]); }
11419 template <
typename T,
typename IFunction>
11431 inline bool operator <(const function_N_node<T,IFunction,0>& fn)
const 11433 return this < (&fn);
11441 return std::numeric_limits<T>::quiet_NaN();
11454 template <
typename T,
typename VarArgFunction>
11462 const std::vector<expression_ptr>& arg_list)
11466 value_list_.resize(arg_list.size(),std::numeric_limits<T>::quiet_NaN());
11471 for (std::size_t i = 0; i <
arg_list_.size(); ++i)
11480 inline bool operator <(const vararg_function_node<T,VarArgFunction>& fn)
const 11482 return this < (&fn);
11493 return std::numeric_limits<T>::quiet_NaN();
11505 for (std::size_t i = 0; i <
arg_list_.size(); ++i)
11516 template <
typename T,
typename GenericFunction>
11537 GenericFunction* func = (GenericFunction*)(0))
11554 for (std::size_t i = 0; i <
arg_list_.size(); ++i)
11572 #ifndef exprtk_disable_string_capabilities 11591 if (0 == (ri = dynamic_cast<range_interface_t*>(
arg_list_[i])))
11603 range_list_[i].range = reinterpret_cast<range_t*>(0);
11613 if (0 == (var = dynamic_cast<variable_node_ptr_t>(
arg_list_[i])))
11633 inline bool operator <(const generic_function_node<T,GenericFunction>& fn)
const 11635 return this < (&fn);
11644 typedef typename GenericFunction::parameter_list_t parameter_list_t;
11650 return std::numeric_limits<T>::quiet_NaN();
11662 for (std::size_t i = 0; i <
branch_.size(); ++i)
11667 for (std::size_t i = 0; i <
branch_.size(); ++i)
11674 std::size_t r0 = 0;
11675 std::size_t r1 = 0;
11677 if (rp(r0,r1,rdt.
size))
11682 #ifndef exprtk_disable_string_capabilities 11708 #ifndef exprtk_disable_string_capabilities 11709 template <
typename T,
typename StringFunction>
11720 const std::vector<typename gen_function_t::expression_ptr>& arg_list)
11723 range_.
n0_c = std::make_pair<bool,std::size_t>(
true,0);
11724 range_.
n1_c = std::make_pair<bool,std::size_t>(
true,0);
11729 inline bool operator <(const string_function_node<T,StringFunction>& fn)
const 11731 return this < (&fn);
11740 typedef typename StringFunction::parameter_list_t parameter_list_t;
11742 const T result = (*gen_function_t::function_)
11752 return std::numeric_limits<T>::quiet_NaN();
11792 template <
typename T,
typename GenericFunction>
11801 const std::size_t& param_seq_index,
11802 const std::vector<typename gen_function_t::expression_ptr>& arg_list)
11813 typedef typename GenericFunction::parameter_list_t parameter_list_t;
11820 return std::numeric_limits<T>::quiet_NaN();
11833 #ifndef exprtk_disable_string_capabilities 11834 template <
typename T,
typename StringFunction>
11843 const std::size_t& param_seq_index,
11844 const std::vector<typename str_function_t::expression_ptr>& arg_list)
11855 typedef typename StringFunction::parameter_list_t parameter_list_t;
11868 return std::numeric_limits<T>::quiet_NaN();
11885 template <
typename T>
11898 return std::numeric_limits<T>::quiet_NaN();
11902 #ifndef exprtk_disable_return_statement 11903 template <
typename T>
11904 class return_node :
public generic_function_node<T,null_igenfunc<T> >
11913 return_node(
const std::vector<typename gen_function_t::expression_ptr>& arg_list,
11934 return std::numeric_limits<T>::quiet_NaN();
11947 template <
typename T>
11982 return std::numeric_limits<T>::quiet_NaN();
12005 #define exprtk_define_unary_op(OpName) \ 12006 template <typename T> \ 12007 struct OpName##_op \ 12009 typedef typename functor_t<T>::Type Type; \ 12010 typedef typename expression_node<T>::node_type node_t; \ 12012 static inline T process(Type v) \ 12014 return numeric:: OpName (v); \ 12017 static inline node_t type() \ 12019 return expression_node<T>::e_##OpName; \ 12022 static inline details::operator_type operation() \ 12024 return details::e_##OpName; \ 12068 #undef exprtk_define_unary_op 12070 template <
typename T>
12082 template <
typename T>
12085 typedef typename opr_base<T>::Type
Type;
12095 template <
typename T>
12098 typedef typename opr_base<T>::Type
Type;
12108 template <
typename T>
12111 typedef typename opr_base<T>::Type
Type;
12121 template <
typename T>
12124 typedef typename opr_base<T>::Type
Type;
12134 template <
typename T>
12137 typedef typename opr_base<T>::Type
Type;
12146 template <
typename T>
12149 typedef typename opr_base<T>::Type
Type;
12158 template <
typename T>
12161 typedef typename opr_base<T>::Type
Type;
12169 template <
typename T>
12172 typedef typename opr_base<T>::Type
Type;
12180 template <
typename T>
12183 typedef typename opr_base<T>::Type
Type;
12191 template <
typename T>
12194 typedef typename opr_base<T>::Type
Type;
12202 template <
typename T>
12205 typedef typename opr_base<T>::Type
Type;
12206 static inline T
process(
Type t1,
Type t2) {
return (std::equal_to<T>()(t1,t2) ? T(1) : T(0)); }
12212 template <
typename T>
12215 typedef typename opr_base<T>::Type
Type;
12223 template <
typename T>
12226 typedef typename opr_base<T>::Type
Type;
12228 static inline T
process(
Type t1,
Type t2) {
return (std::not_equal_to<T>()(t1,t2) ? T(1) : T(0)); }
12234 template <
typename T>
12237 typedef typename opr_base<T>::Type
Type;
12244 template <
typename T>
12247 typedef typename opr_base<T>::Type
Type;
12254 template <
typename T>
12257 typedef typename opr_base<T>::Type
Type;
12264 template <
typename T>
12267 typedef typename opr_base<T>::Type
Type;
12274 template <
typename T>
12277 typedef typename opr_base<T>::Type
Type;
12284 template <
typename T>
12287 typedef typename opr_base<T>::Type
Type;
12294 template <
typename T>
12297 typedef typename opr_base<T>::Type
Type;
12299 static inline T
process(
const T&,
const T&) {
return std::numeric_limits<T>::quiet_NaN(); }
12305 template <
typename T>
12308 typedef typename opr_base<T>::Type
Type;
12310 static inline T
process(
const T&,
const T&) {
return std::numeric_limits<T>::quiet_NaN(); }
12316 template <
typename T>
12319 typedef typename opr_base<T>::Type
Type;
12321 static inline T
process(
const T&,
const T&) {
return std::numeric_limits<T>::quiet_NaN(); }
12327 template <
typename T>
12330 typedef typename opr_base<T>::Type
Type;
12332 static inline T
process(
const T& t0,
const T& t1,
const T& t2) {
return ((t0 <= t1) && (t1 <= t2)) ? T(1) : T(0); }
12335 return ((t0 <= t1) && (t1 <= t2)) ? T(1) : T(0);
12341 template <
typename T>
12347 template <
typename T>
12353 template <
typename T>
12356 typedef typename opr_base<T>::Type
Type;
12358 template <
typename Type,
12359 typename Allocator,
12360 template <
typename,
typename>
class Sequence>
12361 static inline T
process(
const Sequence<Type,Allocator>& arg_list)
12363 switch (arg_list.size())
12365 case 0 :
return T(0);
12375 for (std::size_t i = 0; i < arg_list.size(); ++i)
12377 result +=
value(arg_list[i]);
12385 template <
typename Sequence>
12388 return value(arg_list[0]);
12391 template <
typename Sequence>
12394 return value(arg_list[0]) +
value(arg_list[1]);
12397 template <
typename Sequence>
12400 return value(arg_list[0]) +
value(arg_list[1]) +
12401 value(arg_list[2]) ;
12404 template <
typename Sequence>
12407 return value(arg_list[0]) +
value(arg_list[1]) +
12411 template <
typename Sequence>
12414 return value(arg_list[0]) +
value(arg_list[1]) +
12416 value(arg_list[4]) ;
12420 template <
typename T>
12423 typedef typename opr_base<T>::Type
Type;
12425 template <
typename Type,
12426 typename Allocator,
12427 template <
typename,
typename>
class Sequence>
12428 static inline T
process(
const Sequence<Type,Allocator>& arg_list)
12430 switch (arg_list.size())
12432 case 0 :
return T(0);
12440 T result = T(
value(arg_list[0]));
12442 for (std::size_t i = 1; i < arg_list.size(); ++i)
12444 result *=
value(arg_list[i]);
12452 template <
typename Sequence>
12455 return value(arg_list[0]);
12458 template <
typename Sequence>
12461 return value(arg_list[0]) *
value(arg_list[1]);
12464 template <
typename Sequence>
12467 return value(arg_list[0]) *
value(arg_list[1]) *
12468 value(arg_list[2]) ;
12471 template <
typename Sequence>
12474 return value(arg_list[0]) *
value(arg_list[1]) *
12478 template <
typename Sequence>
12481 return value(arg_list[0]) *
value(arg_list[1]) *
12483 value(arg_list[4]) ;
12487 template <
typename T>
12490 typedef typename opr_base<T>::Type
Type;
12492 template <
typename Type,
12493 typename Allocator,
12494 template <
typename,
typename>
class Sequence>
12495 static inline T
process(
const Sequence<Type,Allocator>& arg_list)
12497 switch (arg_list.size())
12499 case 0 :
return T(0);
12509 template <
typename Sequence>
12512 return value(arg_list[0]);
12515 template <
typename Sequence>
12518 return (
value(arg_list[0]) +
value(arg_list[1])) / T(2);
12521 template <
typename Sequence>
12524 return (
value(arg_list[0]) +
value(arg_list[1]) +
value(arg_list[2])) / T(3);
12527 template <
typename Sequence>
12530 return (
value(arg_list[0]) +
value(arg_list[1]) +
12531 value(arg_list[2]) +
value(arg_list[3])) / T(4);
12534 template <
typename Sequence>
12537 return (
value(arg_list[0]) +
value(arg_list[1]) +
12539 value(arg_list[4])) / T(5);
12543 template <
typename T>
12546 typedef typename opr_base<T>::Type
Type;
12548 template <
typename Type,
12549 typename Allocator,
12550 template <
typename,
typename>
class Sequence>
12551 static inline T
process(
const Sequence<Type,Allocator>& arg_list)
12553 switch (arg_list.size())
12555 case 0 :
return T(0);
12563 T result = T(
value(arg_list[0]));
12565 for (std::size_t i = 1; i < arg_list.size(); ++i)
12567 const T v =
value(arg_list[i]);
12578 template <
typename Sequence>
12581 return value(arg_list[0]);
12584 template <
typename Sequence>
12587 return std::min<T>(
value(arg_list[0]),
value(arg_list[1]));
12590 template <
typename Sequence>
12593 return std::min<T>(std::min<T>(
value(arg_list[0]),
value(arg_list[1])),
value(arg_list[2]));
12596 template <
typename Sequence>
12599 return std::min<T>(
12600 std::min<T>(
value(arg_list[0]),
value(arg_list[1])),
12601 std::min<T>(
value(arg_list[2]),
value(arg_list[3])));
12604 template <
typename Sequence>
12607 return std::min<T>(
12608 std::min<T>(std::min<T>(
value(arg_list[0]),
value(arg_list[1])),
12609 std::min<T>(
value(arg_list[2]),
value(arg_list[3]))),
12610 value(arg_list[4]));
12614 template <
typename T>
12617 typedef typename opr_base<T>::Type
Type;
12619 template <
typename Type,
12620 typename Allocator,
12621 template <
typename,
typename>
class Sequence>
12622 static inline T
process(
const Sequence<Type,Allocator>& arg_list)
12624 switch (arg_list.size())
12626 case 0 :
return T(0);
12634 T result = T(
value(arg_list[0]));
12636 for (std::size_t i = 1; i < arg_list.size(); ++i)
12638 const T v =
value(arg_list[i]);
12649 template <
typename Sequence>
12652 return value(arg_list[0]);
12655 template <
typename Sequence>
12658 return std::max<T>(
value(arg_list[0]),
value(arg_list[1]));
12661 template <
typename Sequence>
12664 return std::max<T>(std::max<T>(
value(arg_list[0]),
value(arg_list[1])),
value(arg_list[2]));
12667 template <
typename Sequence>
12670 return std::max<T>(
12671 std::max<T>(
value(arg_list[0]),
value(arg_list[1])),
12672 std::max<T>(
value(arg_list[2]),
value(arg_list[3])));
12675 template <
typename Sequence>
12678 return std::max<T>(
12679 std::max<T>(std::max<T>(
value(arg_list[0]),
value(arg_list[1])),
12680 std::max<T>(
value(arg_list[2]),
value(arg_list[3]))),
12681 value(arg_list[4]));
12685 template <
typename T>
12688 typedef typename opr_base<T>::Type
Type;
12690 template <
typename Type,
12691 typename Allocator,
12692 template <
typename,
typename>
class Sequence>
12693 static inline T
process(
const Sequence<Type,Allocator>& arg_list)
12695 switch (arg_list.size())
12704 for (std::size_t i = 0; i < arg_list.size(); ++i)
12706 if (std::equal_to<T>()(T(0),
value(arg_list[i])))
12715 template <
typename Sequence>
12718 return std::not_equal_to<T>()
12719 (T(0),
value(arg_list[0])) ? T(1) : T(0);
12722 template <
typename Sequence>
12726 std::not_equal_to<T>()(T(0),
value(arg_list[0])) &&
12727 std::not_equal_to<T>()(T(0),
value(arg_list[1]))
12731 template <
typename Sequence>
12735 std::not_equal_to<T>()(T(0),
value(arg_list[0])) &&
12736 std::not_equal_to<T>()(T(0),
value(arg_list[1])) &&
12737 std::not_equal_to<T>()(T(0),
value(arg_list[2]))
12741 template <
typename Sequence>
12745 std::not_equal_to<T>()(T(0),
value(arg_list[0])) &&
12746 std::not_equal_to<T>()(T(0),
value(arg_list[1])) &&
12747 std::not_equal_to<T>()(T(0),
value(arg_list[2])) &&
12748 std::not_equal_to<T>()(T(0),
value(arg_list[3]))
12752 template <
typename Sequence>
12756 std::not_equal_to<T>()(T(0),
value(arg_list[0])) &&
12757 std::not_equal_to<T>()(T(0),
value(arg_list[1])) &&
12758 std::not_equal_to<T>()(T(0),
value(arg_list[2])) &&
12759 std::not_equal_to<T>()(T(0),
value(arg_list[3])) &&
12760 std::not_equal_to<T>()(T(0),
value(arg_list[4]))
12765 template <
typename T>
12768 typedef typename opr_base<T>::Type
Type;
12770 template <
typename Type,
12771 typename Allocator,
12772 template <
typename,
typename>
class Sequence>
12773 static inline T
process(
const Sequence<Type,Allocator>& arg_list)
12775 switch (arg_list.size())
12784 for (std::size_t i = 0; i < arg_list.size(); ++i)
12786 if (std::not_equal_to<T>()(T(0),
value(arg_list[i])))
12795 template <
typename Sequence>
12798 return std::not_equal_to<T>()
12799 (T(0),
value(arg_list[0])) ? T(1) : T(0);
12802 template <
typename Sequence>
12806 std::not_equal_to<T>()(T(0),
value(arg_list[0])) ||
12807 std::not_equal_to<T>()(T(0),
value(arg_list[1]))
12811 template <
typename Sequence>
12815 std::not_equal_to<T>()(T(0),
value(arg_list[0])) ||
12816 std::not_equal_to<T>()(T(0),
value(arg_list[1])) ||
12817 std::not_equal_to<T>()(T(0),
value(arg_list[2]))
12821 template <
typename Sequence>
12825 std::not_equal_to<T>()(T(0),
value(arg_list[0])) ||
12826 std::not_equal_to<T>()(T(0),
value(arg_list[1])) ||
12827 std::not_equal_to<T>()(T(0),
value(arg_list[2])) ||
12828 std::not_equal_to<T>()(T(0),
value(arg_list[3]))
12832 template <
typename Sequence>
12836 std::not_equal_to<T>()(T(0),
value(arg_list[0])) ||
12837 std::not_equal_to<T>()(T(0),
value(arg_list[1])) ||
12838 std::not_equal_to<T>()(T(0),
value(arg_list[2])) ||
12839 std::not_equal_to<T>()(T(0),
value(arg_list[3])) ||
12840 std::not_equal_to<T>()(T(0),
value(arg_list[4]))
12845 template <
typename T>
12848 typedef typename opr_base<T>::Type
Type;
12850 template <
typename Type,
12851 typename Allocator,
12852 template <
typename,
typename>
class Sequence>
12853 static inline T
process(
const Sequence<Type,Allocator>& arg_list)
12855 switch (arg_list.size())
12857 case 0 :
return std::numeric_limits<T>::quiet_NaN();
12868 for (std::size_t i = 0; i < (arg_list.size() - 1); ++i)
12870 value(arg_list[i]);
12873 return value(arg_list.back());
12878 template <
typename Sequence>
12881 return value(arg_list[0]);
12884 template <
typename Sequence>
12887 value(arg_list[0]);
12888 return value(arg_list[1]);
12891 template <
typename Sequence>
12894 value(arg_list[0]);
12895 value(arg_list[1]);
12896 return value(arg_list[2]);
12899 template <
typename Sequence>
12902 value(arg_list[0]);
12903 value(arg_list[1]);
12904 value(arg_list[2]);
12905 return value(arg_list[3]);
12908 template <
typename Sequence>
12911 value(arg_list[0]);
12912 value(arg_list[1]);
12913 value(arg_list[2]);
12914 value(arg_list[3]);
12915 return value(arg_list[4]);
12918 template <
typename Sequence>
12921 value(arg_list[0]);
12922 value(arg_list[1]);
12923 value(arg_list[2]);
12924 value(arg_list[3]);
12925 value(arg_list[4]);
12926 return value(arg_list[5]);
12929 template <
typename Sequence>
12932 value(arg_list[0]);
12933 value(arg_list[1]);
12934 value(arg_list[2]);
12935 value(arg_list[3]);
12936 value(arg_list[4]);
12937 value(arg_list[5]);
12938 return value(arg_list[6]);
12941 template <
typename Sequence>
12944 value(arg_list[0]);
12945 value(arg_list[1]);
12946 value(arg_list[2]);
12947 value(arg_list[3]);
12948 value(arg_list[4]);
12949 value(arg_list[5]);
12950 value(arg_list[6]);
12951 return value(arg_list[7]);
12955 template <
typename T>
12963 const std::size_t vec_size = v->
vec()->
vds().
size();
12967 if (vec_size <= static_cast<std::size_t>(lud.
batch_size))
12975 #define case_stmt(N) \ 12976 case N : result += vec[i++]; \ 12978 #ifndef exprtk_disable_superscalar_unroll 12997 T(0), T(0), T(0), T(0), T(0), T(0), T(0), T(0),
12998 T(0), T(0), T(0), T(0), T(0), T(0), T(0), T(0)
13003 while (vec < upper_bound)
13005 #define exprtk_loop(N) \ 13010 #ifndef exprtk_disable_superscalar_unroll 13027 #define case_stmt(N) \ 13028 case N : r[0] += vec[i++]; \ 13030 #ifndef exprtk_disable_superscalar_unroll 13046 return (r[ 0] + r[ 1] + r[ 2] + r[ 3])
13047 #ifndef exprtk_disable_superscalar_unroll 13048 + (r[ 4] + r[ 5] + r[ 6] + r[ 7])
13049 + (r[ 8] + r[ 9] + r[10] + r[11])
13050 + (r[12] + r[13] + r[14] + r[15])
13056 template <
typename T>
13064 const std::size_t vec_size = v->
vec()->
vds().
size();
13068 if (vec_size <= static_cast<std::size_t>(lud.
batch_size))
13076 #define case_stmt(N) \ 13077 case N : result *= vec[i++]; \ 13079 #ifndef exprtk_disable_superscalar_unroll 13098 T(1), T(1), T(1), T(1), T(1), T(1), T(1), T(1),
13099 T(1), T(1), T(1), T(1), T(1), T(1), T(1), T(1)
13104 while (vec < upper_bound)
13106 #define exprtk_loop(N) \ 13111 #ifndef exprtk_disable_superscalar_unroll 13128 #define case_stmt(N) \ 13129 case N : r[0] *= vec[i++]; \ 13131 #ifndef exprtk_disable_superscalar_unroll 13147 return (r[ 0] * r[ 1] * r[ 2] * r[ 3])
13148 #ifndef exprtk_disable_superscalar_unroll 13149 + (r[ 4] * r[ 5] * r[ 6] * r[ 7])
13150 + (r[ 8] * r[ 9] * r[10] * r[11])
13151 + (r[12] * r[13] * r[14] * r[15])
13157 template <
typename T>
13164 const std::size_t vec_size = v->
vec()->
vds().
size();
13170 template <
typename T>
13178 const std::size_t vec_size = v->
vec()->
vds().
size();
13182 for (std::size_t i = 1; i < vec_size; ++i)
13194 template <
typename T>
13202 const std::size_t vec_size = v->
vec()->
vds().
size();
13206 for (std::size_t i = 1; i < vec_size; ++i)
13218 template <
typename T>
13231 virtual const T&
v0()
const = 0;
13233 virtual const T&
v1()
const = 0;
13236 template <
typename T>
13249 virtual const T
c()
const = 0;
13251 virtual const T&
v()
const = 0;
13254 template <
typename T>
13267 virtual const T
c()
const = 0;
13269 virtual const T&
v()
const = 0;
13272 template <
typename T>
13280 virtual const T&
v()
const = 0;
13283 template <
typename T>
13291 virtual const T&
v()
const = 0;
13294 template <
typename T>
13307 virtual const T
c()
const = 0;
13309 virtual void set_c(
const T) = 0;
13314 template <
typename T>
13327 virtual const T
c()
const = 0;
13329 virtual void set_c(
const T) = 0;
13334 template <
typename T>
13347 virtual const T&
v()
const = 0;
13350 template <
typename T>
13364 template <
typename T>
13378 template <
typename T>
13389 template <
typename T>
13400 template <
typename T,
typename Operation>
13424 return Operation::operation();
13427 inline const T&
v()
const 13440 template <
typename T>
13513 template <
typename T,
typename Operation>
13546 return Operation::operation();
13573 template <
typename T>
struct is_ref<T&> {
enum {result = 1}; };
13574 template <
typename T>
struct is_ref<const T&> {
enum {result = 0}; };
13576 template <std::
size_t State>
13582 #define exprtk_crtype(Type) \ 13583 param_to_str<is_const_ref< Type >::result>::result() \ 13585 template <
typename T>
13596 return bf1(bf0(t0,t1),t2);
13599 template <
typename T0,
typename T1,
typename T2>
13614 return bf0(t0,bf1(t1,t2));
13617 template <
typename T0,
typename T1,
typename T2>
13628 template <
typename T>
13637 const T& t2,
const T& t3,
13641 return bf1(bf0(t0,t1),bf2(t2,t3));
13644 template <
typename T0,
typename T1,
typename T2,
typename T3>
13658 const T& t2,
const T& t3,
13662 return bf0(t0,bf1(t1,bf2(t2,t3)));
13664 template <
typename T0,
typename T1,
typename T2,
typename T3>
13678 const T& t2,
const T& t3,
13682 return bf0(t0,bf2(bf1(t1,t2),t3));
13685 template <
typename T0,
typename T1,
typename T2,
typename T3>
13699 const T& t2,
const T& t3,
13703 return bf2(bf1(bf0(t0,t1),t2),t3);
13706 template <
typename T0,
typename T1,
typename T2,
typename T3>
13720 const T& t2,
const T& t3,
13724 return bf2(bf0(t0,bf1(t1,t2)),t3);
13727 template <
typename T0,
typename T1,
typename T2,
typename T3>
13739 #undef exprtk_crtype 13741 template <
typename T,
typename T0,
typename T1>
13743 template <
typename T,
typename T0,
typename T1>
13746 #define synthesis_node_type_define(T0_,T1_,v_) \ 13747 template <typename T, typename T0, typename T1> \ 13748 struct nodetype_T0oT1<T,T0_,T1_> { static const typename expression_node<T>::node_type result; }; \ 13749 template <typename T, typename T0, typename T1> \ 13750 const typename expression_node<T>::node_type nodetype_T0oT1<T,T0_,T1_>::result = expression_node<T>:: v_; \ 13761 #undef synthesis_node_type_define 13763 template <
typename T,
typename T0,
typename T1,
typename T2>
13765 template <
typename T,
typename T0,
typename T1,
typename T2>
13768 #define synthesis_node_type_define(T0_,T1_,T2_,v_) \ 13769 template <typename T, typename T0, typename T1, typename T2> \ 13770 struct nodetype_T0oT1oT2<T,T0_,T1_,T2_> { static const typename expression_node<T>::node_type result; }; \ 13771 template <typename T, typename T0, typename T1, typename T2> \ 13772 const typename expression_node<T>::node_type nodetype_T0oT1oT2<T,T0_,T1_,T2_>::result = expression_node<T>:: v_; \ 13783 #undef synthesis_node_type_define 13785 template <
typename T,
typename T0,
typename T1,
typename T2,
typename T3>
13787 template <
typename T,
typename T0,
typename T1,
typename T2,
typename T3>
13790 #define synthesis_node_type_define(T0_,T1_,T2_,T3_,v_) \ 13791 template <typename T, typename T0, typename T1, typename T2, typename T3> \ 13792 struct nodetype_T0oT1oT2oT3<T,T0_,T1_,T2_,T3_> { static const typename expression_node<T>::node_type result; }; \ 13793 template <typename T, typename T0, typename T1, typename T2, typename T3> \ 13794 const typename expression_node<T>::node_type nodetype_T0oT1oT2oT3<T,T0_,T1_,T2_,T3_>::result = expression_node<T>:: v_; \ 13812 #undef synthesis_node_type_define 13814 template <
typename T,
typename T0,
typename T1>
13861 template <
typename Allocator>
13867 .template allocate_type<node_type, T0, T1, bfunc_t&>
13881 template <
typename T,
typename T0,
typename T1,
typename T2,
typename ProcessMode>
13948 return process_mode_t::template id<T0,T1,T2>();
13951 template <
typename Allocator>
13955 .template allocate_type<node_type, T0, T1, T2, bfunc_t, bfunc_t>
13956 (p0, p1, p2, p3, p4);
13971 template <
typename T,
typename T0_,
typename T1_,
typename T2_,
typename T3_,
typename ProcessMode>
14043 return process_mode_t::template id<T0, T1, T2, T3>();
14046 template <
typename Allocator>
14052 .template allocate_type<node_type, T0, T1, T2, T3, bfunc_t, bfunc_t>
14053 (p0, p1, p2, p3, p4, p5, p6);
14070 template <
typename T,
typename T0,
typename T1,
typename T2>
14133 template <
typename Allocator>
14137 .template allocate_type<node_type, T0, T1, T2, tfunc_t>
14152 template <
typename T,
typename T0,
typename T1,
typename T2>
14160 virtual T0 t0()
const = 0;
14162 virtual T1 t1()
const = 0;
14164 virtual T2 t2()
const = 0;
14167 template <
typename T,
typename T0,
typename T1,
typename T2,
typename SF3Operation>
14224 template <
typename Allocator>
14228 .template allocate_type<node_type, T0, T1, T2>
14242 template <
typename T>
14252 default :
return false;
14256 template <
typename T,
typename T0,
typename T1,
typename T2,
typename T3>
14325 template <
typename Allocator>
14329 .template allocate_type<node_type, T0, T1, T2, T3, qfunc_t>
14330 (p0, p1, p2, p3, p4);
14345 template <
typename T,
typename T0,
typename T1,
typename T2,
typename T3,
typename SF4Operation>
14408 template <
typename Allocator>
14412 .template allocate_type<node_type, T0, T1, T2, T3>
14427 template <
typename T>
14441 default :
return false;
14445 template <
typename T,
typename T0,
typename T1>
14451 template <
typename T,
typename T0,
typename T1,
typename T2>
14460 template <
typename T,
typename T0,
typename T1,
typename T2,
typename T3>
14471 template <
typename T,
typename Operation>
14497 return Operation::operation();
14521 template <
typename T,
typename Operation>
14547 return Operation::operation();
14550 inline const T
c()
const 14555 inline const T&
v()
const 14571 template <
typename T,
typename Operation>
14592 return Operation::operation();
14595 inline const T
c()
const 14600 inline const T&
v()
const 14616 template <
typename T,
typename Operation>
14629 init_branches<1>(
branch_,brnch);
14634 cleanup_branches::execute<T,1>(
branch_);
14644 return Operation::operation();
14647 inline const T&
v()
const 14666 template <
typename T,
typename Operation>
14679 init_branches<1>(
branch_,brnch);
14684 cleanup_branches::execute<T,1>(
branch_);
14694 return Operation::operation();
14697 inline const T&
v()
const 14716 template <
typename T,
typename Operation>
14729 init_branches<1>(
branch_,brnch);
14734 cleanup_branches::execute<T,1>(
branch_);
14744 return Operation::operation();
14747 inline const T
c()
const 14754 (*
const_cast<T*
>(&
c_)) = new_c;
14777 template <
typename T,
typename Operation>
14790 init_branches<1>(
branch_,brnch);
14795 cleanup_branches::execute<T,1>(
branch_);
14805 return Operation::operation();
14808 inline const T
c()
const 14815 (*
const_cast<T*
>(&
c_)) = new_c;
14838 #ifndef exprtk_disable_string_capabilities 14839 template <
typename T,
typename SType0,
typename SType1,
typename Operation>
14865 return Operation::operation();
14889 template <
typename T,
typename SType0,
typename SType1,
typename RangePack,
typename Operation>
14911 std::size_t r0 = 0;
14912 std::size_t r1 = 0;
14914 if (
rp0_(r0, r1,
s0_.size()))
14927 return Operation::operation();
14952 template <
typename T,
typename SType0,
typename SType1,
typename RangePack,
typename Operation>
14974 std::size_t r0 = 0;
14975 std::size_t r1 = 0;
14977 if (
rp1_(r0, r1,
s1_.size()))
14990 return Operation::operation();
15015 template <
typename T,
typename SType0,
typename SType1,
typename RangePack,
typename Operation>
15039 std::size_t r0_0 = 0;
15040 std::size_t r0_1 = 0;
15041 std::size_t r1_0 = 0;
15042 std::size_t r1_1 = 0;
15045 rp0_(r0_0, r1_0,
s0_.size()) &&
15050 s0_.substr(r0_0, (r1_0 - r0_0) + 1),
15051 s1_.substr(r0_1, (r1_1 - r0_1) + 1)
15065 return Operation::operation();
15091 template <
typename T,
typename Operation>
15155 std::size_t str0_r0 = 0;
15156 std::size_t str0_r1 = 0;
15158 std::size_t str1_r0 = 0;
15159 std::size_t str1_r1 = 0;
15161 range_t& range0 = (*str0_range_ptr_);
15162 range_t& range1 = (*str1_range_ptr_);
15176 return std::numeric_limits<T>::quiet_NaN();
15186 return Operation::operation();
15200 template <
typename T,
typename SType0,
typename SType1,
typename SType2,
typename Operation>
15227 return Operation::operation();
15258 template <
typename T,
typename PowOp>
15272 return PowOp::result(
v_);
15288 template <
typename T,
typename PowOp>
15299 init_branches<1>(
branch_, brnch);
15304 cleanup_branches::execute<T,1>(
branch_);
15309 return PowOp::result(
branch_[0].first->value());
15325 template <
typename T,
typename PowOp>
15339 return (T(1) / PowOp::result(
v_));
15355 template <
typename T,
typename PowOp>
15366 init_branches<1>(
branch_, brnch);
15371 cleanup_branches::execute<T,1>(
branch_);
15376 return (T(1) / PowOp::result(
branch_[0].first->value()));
15392 template <
typename T>
15398 template <
typename T>
15404 template <
typename T>
15410 template <
typename T>
15416 template <
typename T>
15422 template <
typename T>
15428 template <
typename T>
15434 template <
typename T>
15440 template <
typename T>
15446 template <
typename T>
15452 template <
typename T>
15458 template <
typename T>
15464 template <
typename T>
15470 template <
typename T>
15476 template <
typename T>
15482 template <
typename T>
15488 template <
typename T>
15494 template <
typename T>
15500 template <
typename T>
15506 template <
typename T>
15511 switch (node->
type())
15524 default :
return false;
15535 template <
typename ResultNode,
typename OpType,
typename ExprNode>
15538 return allocate<ResultNode>(operation, branch[0]);
15541 template <
typename ResultNode,
typename OpType,
typename ExprNode>
15544 return allocate<ResultNode>(operation, branch[0], branch[1]);
15547 template <
typename ResultNode,
typename OpType,
typename ExprNode>
15550 return allocate<ResultNode>(operation, branch[0], branch[1], branch[2]);
15553 template <
typename ResultNode,
typename OpType,
typename ExprNode>
15556 return allocate<ResultNode>(operation, branch[0], branch[1], branch[2], branch[3]);
15559 template <
typename ResultNode,
typename OpType,
typename ExprNode>
15562 return allocate<ResultNode>(operation, branch[0],branch[1], branch[2], branch[3], branch[4]);
15565 template <
typename ResultNode,
typename OpType,
typename ExprNode>
15568 return allocate<ResultNode>(operation, branch[0], branch[1], branch[2], branch[3], branch[4], branch[5]);
15571 template <
typename node_type>
15574 return (
new node_type());
15577 template <
typename node_type,
15579 typename Allocator,
15580 template <
typename,
typename>
class Sequence>
15583 return (
new node_type(seq));
15586 template <
typename node_type,
typename T1>
15589 return (
new node_type(t1));
15592 template <
typename node_type,
typename T1>
15595 return (
new node_type(t1));
15598 template <
typename node_type,
15599 typename T1,
typename T2>
15602 return (
new node_type(t1, t2));
15605 template <
typename node_type,
15606 typename T1,
typename T2>
15609 return (
new node_type(t1, t2));
15612 template <
typename node_type,
15613 typename T1,
typename T2>
15616 return (
new node_type(t1, t2));
15619 template <
typename node_type,
15620 typename T1,
typename T2>
15623 return (
new node_type(t1, t2));
15626 template <
typename node_type,
15627 typename T1,
typename T2>
15630 return (
new node_type(t1, t2));
15633 template <
typename node_type,
15634 typename T1,
typename T2,
typename T3>
15637 return (
new node_type(t1, t2, t3));
15640 template <
typename node_type,
15641 typename T1,
typename T2,
typename T3,
typename T4>
15644 return (
new node_type(t1, t2, t3, t4));
15647 template <
typename node_type,
15648 typename T1,
typename T2,
typename T3>
15651 return (
new node_type(t1, t2, t3));
15654 template <
typename node_type,
15655 typename T1,
typename T2,
typename T3,
typename T4>
15658 return (
new node_type(t1, t2, t3, t4));
15661 template <
typename node_type,
15662 typename T1,
typename T2,
typename T3,
typename T4,
typename T5>
15665 return (
new node_type(t1, t2, t3, t4, t5));
15668 template <
typename node_type,
15669 typename T1,
typename T2,
typename T3>
15671 const T3& t3)
const 15673 return (
new node_type(t1, t2, t3));
15676 template <
typename node_type,
15677 typename T1,
typename T2,
15678 typename T3,
typename T4>
15680 const T3& t3,
const T4& t4)
const 15682 return (
new node_type(t1, t2, t3, t4));
15685 template <
typename node_type,
15686 typename T1,
typename T2,
15687 typename T3,
typename T4,
typename T5>
15689 const T3& t3,
const T4& t4,
15690 const T5& t5)
const 15692 return (
new node_type(t1, t2, t3, t4, t5));
15695 template <
typename node_type,
15696 typename T1,
typename T2,
15697 typename T3,
typename T4,
typename T5,
typename T6>
15699 const T3& t3,
const T4& t4,
15700 const T5& t5,
const T6& t6)
const 15702 return (
new node_type(t1, t2, t3, t4, t5, t6));
15705 template <
typename node_type,
15706 typename T1,
typename T2,
15707 typename T3,
typename T4,
15708 typename T5,
typename T6,
typename T7>
15710 const T3& t3,
const T4& t4,
15711 const T5& t5,
const T6& t6,
15712 const T7& t7)
const 15714 return (
new node_type(t1, t2, t3, t4, t5, t6, t7));
15717 template <
typename node_type,
15718 typename T1,
typename T2,
15719 typename T3,
typename T4,
15720 typename T5,
typename T6,
15721 typename T7,
typename T8>
15723 const T3& t3,
const T4& t4,
15724 const T5& t5,
const T6& t6,
15725 const T7& t7,
const T8& t8)
const 15727 return (
new node_type(t1, t2, t3, t4, t5, t6, t7, t8));
15730 template <
typename node_type,
15731 typename T1,
typename T2,
15732 typename T3,
typename T4,
15733 typename T5,
typename T6,
15734 typename T7,
typename T8,
typename T9>
15736 const T3& t3,
const T4& t4,
15737 const T5& t5,
const T6& t6,
15738 const T7& t7,
const T8& t8,
15739 const T9& t9)
const 15741 return (
new node_type(t1, t2, t3, t4, t5, t6, t7, t8, t9));
15744 template <
typename node_type,
15745 typename T1,
typename T2,
15746 typename T3,
typename T4,
15747 typename T5,
typename T6,
15748 typename T7,
typename T8,
15749 typename T9,
typename T10>
15751 const T3& t3,
const T4& t4,
15752 const T5& t5,
const T6& t6,
15753 const T7& t7,
const T8& t8,
15754 const T9& t9,
const T10& t10)
const 15756 return (
new node_type(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10));
15759 template <
typename node_type,
15760 typename T1,
typename T2,
typename T3>
15763 return (
new node_type(t1, t2, t3));
15766 template <
typename node_type,
15767 typename T1,
typename T2,
15768 typename T3,
typename T4>
15770 T3 t3, T4 t4)
const 15772 return (
new node_type(t1, t2, t3, t4));
15775 template <
typename node_type,
15776 typename T1,
typename T2,
15777 typename T3,
typename T4,
15783 return (
new node_type(t1, t2, t3, t4, t5));
15786 template <
typename node_type,
15787 typename T1,
typename T2,
15788 typename T3,
typename T4,
15789 typename T5,
typename T6>
15792 T5 t5, T6 t6)
const 15794 return (
new node_type(t1, t2, t3, t4, t5, t6));
15797 template <
typename node_type,
15798 typename T1,
typename T2,
15799 typename T3,
typename T4,
15800 typename T5,
typename T6,
typename T7>
15806 return (
new node_type(t1, t2, t3, t4, t5, t6, t7));
15809 template <
typename T>
15819 #define register_op(Symbol,Type,Args) \ 15820 m.insert(std::make_pair(std::string(Symbol),details::base_operation_t(Type,Args))); \ 15918 template <
typename FunctionType>
15921 func.allow_zero_parameters() =
true;
15923 if (0 != func.min_num_args())
15925 func.min_num_args() = 0;
15929 template <
typename FunctionType>
15932 func.allow_zero_parameters() =
false;
15935 template <
typename FunctionType>
15938 func.has_side_effects() =
true;
15941 template <
typename FunctionType>
15944 func.has_side_effects() =
false;
15947 template <
typename FunctionType>
15950 func.min_num_args() = num_args;
15952 if ((0 != func.min_num_args()) && func.allow_zero_parameters())
15953 func.allow_zero_parameters() =
false;
15956 template <
typename FunctionType>
15959 func.max_num_args() = num_args;
15962 template <
typename T>
15974 #define empty_method_body \ 15976 return std::numeric_limits<T>::quiet_NaN(); \ 15982 inline virtual T operator() (const T&)
15985 inline virtual T operator() (const T&,const T&)
15988 inline virtual T operator() (const T&, const T&, const T&)
15991 inline virtual T operator() (const T&, const T&, const T&, const T&)
15994 inline virtual T operator() (const T&, const T&, const T&, const T&, const T&)
15997 inline virtual T operator() (const T&, const T&, const T&, const T&, const T&, const T&)
16000 inline virtual T operator() (const T&, const T&, const T&, const T&, const T&, const T&, const T&)
16003 inline virtual T operator() (const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&)
16006 inline virtual T operator() (const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&)
16009 inline virtual T operator() (const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&)
16012 inline virtual T operator() (const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&,
16016 inline virtual T operator() (const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&,
16017 const T&, const T&)
16020 inline virtual T operator() (const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&,
16021 const T&, const T&, const T&)
16024 inline virtual T operator() (const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&,
16025 const T&, const T&, const T&, const T&)
16028 inline virtual T operator() (const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&,
16029 const T&, const T&, const T&, const T&, const T&)
16032 inline virtual T operator() (const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&,
16033 const T&, const T&, const T&, const T&, const T&, const T&)
16036 inline virtual T operator() (const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&,
16037 const T&, const T&, const T&, const T&, const T&, const T&, const T&)
16040 inline virtual T operator() (const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&,
16041 const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&)
16044 inline virtual T operator() (const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&,
16045 const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&)
16048 inline virtual T operator() (const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&,
16049 const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&, const T&)
16052 #undef empty_method_body 16057 template <
typename T>
16067 exprtk_debug((
"ivararg_function::operator() - Operator has not been overridden.\n"));
16068 return std::numeric_limits<T>::quiet_NaN();
16072 template <
typename T>
16089 : parameter_sequence(param_seq),
16096 #define igeneric_function_empty_body(N) \ 16098 exprtk_debug(("igeneric_function::operator() - Operator has not been overridden. ["#N"]\n")); \ 16099 return std::numeric_limits<T>::quiet_NaN(); \ 16118 std::
string parameter_sequence;
16125 template <typename T>
16130 typedef T (*ff00_functor)();
16131 typedef T (*ff01_functor)(T);
16132 typedef T (*ff02_functor)(T, T);
16133 typedef T (*ff03_functor)(T, T, T);
16134 typedef T (*ff04_functor)(T, T, T, T);
16135 typedef T (*ff05_functor)(T, T, T, T, T);
16136 typedef T (*ff06_functor)(T, T, T, T, T, T);
16137 typedef T (*ff07_functor)(T, T, T, T, T, T, T);
16138 typedef T (*ff08_functor)(T, T, T, T, T, T, T, T);
16139 typedef T (*ff09_functor)(T, T, T, T, T, T, T, T, T);
16140 typedef T (*ff10_functor)(T, T, T, T, T, T, T, T, T, T);
16141 typedef T (*ff11_functor)(T, T, T, T, T, T, T, T, T, T, T);
16142 typedef T (*ff12_functor)(T, T, T, T, T, T, T, T, T, T, T, T);
16143 typedef T (*ff13_functor)(T, T, T, T, T, T, T, T, T, T, T, T, T);
16144 typedef T (*ff14_functor)(T, T, T, T, T, T, T, T, T, T, T, T, T, T);
16145 typedef T (*ff15_functor)(T, T, T, T, T, T, T, T, T, T, T, T, T, T, T);
16154 inline T operator() ()
16164 inline T operator() (
const T& v0)
16174 inline T operator() (
const T& v0,
const T& v1)
16175 {
return f(v0, v1); }
16184 inline T operator() (
const T& v0,
const T& v1,
const T& v2)
16185 {
return f(v0, v1, v2); }
16194 inline T operator() (
const T& v0,
const T& v1,
const T& v2,
const T& v3)
16195 {
return f(v0, v1, v2, v3); }
16204 inline T operator() (
const T& v0,
const T& v1,
const T& v2,
const T& v3,
const T& v4)
16205 {
return f(v0, v1, v2, v3, v4); }
16214 inline T operator() (
const T& v0,
const T& v1,
const T& v2,
const T& v3,
const T& v4,
const T& v5)
16215 {
return f(v0, v1, v2, v3, v4, v5); }
16224 inline T operator() (
const T& v0,
const T& v1,
const T& v2,
const T& v3,
const T& v4,
16225 const T& v5,
const T& v6)
16226 {
return f(v0, v1, v2, v3, v4, v5, v6); }
16235 inline T operator() (
const T& v0,
const T& v1,
const T& v2,
const T& v3,
const T& v4,
16236 const T& v5,
const T& v6,
const T& v7)
16237 {
return f(v0, v1, v2, v3, v4, v5, v6, v7); }
16246 inline T operator() (
const T& v0,
const T& v1,
const T& v2,
const T& v3,
const T& v4,
16247 const T& v5,
const T& v6,
const T& v7,
const T& v8)
16248 {
return f(v0, v1, v2, v3, v4, v5, v6, v7, v8); }
16257 inline T operator() (
const T& v0,
const T& v1,
const T& v2,
const T& v3,
const T& v4,
16258 const T& v5,
const T& v6,
const T& v7,
const T& v8,
const T& v9)
16259 {
return f(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9); }
16268 inline T operator() (
const T& v0,
const T& v1,
const T& v2,
const T& v3,
const T& v4,
16269 const T& v5,
const T& v6,
const T& v7,
const T& v8,
const T& v9,
const T& v10)
16270 {
return f(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10); }
16279 inline T operator() (
const T& v00,
const T& v01,
const T& v02,
const T& v03,
const T& v04,
16280 const T& v05,
const T& v06,
const T& v07,
const T& v08,
const T& v09,
16281 const T& v10,
const T& v11)
16282 {
return f(v00, v01, v02, v03, v04, v05, v06, v07, v08, v09, v10, v11); }
16291 inline T operator() (
const T& v00,
const T& v01,
const T& v02,
const T& v03,
const T& v04,
16292 const T& v05,
const T& v06,
const T& v07,
const T& v08,
const T& v09,
16293 const T& v10,
const T& v11,
const T& v12)
16294 {
return f(v00, v01, v02, v03, v04, v05, v06, v07, v08, v09, v10, v11, v12); }
16303 inline T operator() (
const T& v00,
const T& v01,
const T& v02,
const T& v03,
const T& v04,
16304 const T& v05,
const T& v06,
const T& v07,
const T& v08,
const T& v09,
16305 const T& v10,
const T& v11,
const T& v12,
const T& v13)
16306 {
return f(v00, v01, v02, v03, v04, v05, v06, v07, v08, v09, v10, v11, v12, v13); }
16315 inline T operator() (
const T& v00,
const T& v01,
const T& v02,
const T& v03,
const T& v04,
16316 const T& v05,
const T& v06,
const T& v07,
const T& v08,
const T& v09,
16317 const T& v10,
const T& v11,
const T& v12,
const T& v13,
const T& v14)
16318 {
return f(v00, v01, v02, v03, v04, v05, v06, v07, v08, v09, v10, v11, v12, v13, v14); }
16322 template <
typename Type,
typename RawType>
16331 #ifndef exprtk_disable_string_capabilities 16338 typedef std::map<std::string,type_pair_t,details::ilesscompare>
type_map_t;
16342 enum { lut_size = 256 };
16353 if (symbol_name.empty())
16355 else if (map.end() != map.find(symbol_name))
16361 template <
typename PtrType>
16369 while (map.end() != itr)
16371 if (itr->second.second == ptr)
16384 if (symbol_name.empty())
16390 if (map.end() == itr)
16393 return (*itr).second.first;
16397 template <
typename Tie,
typename RType>
16400 if (symbol_name.size() > 1)
16411 const tm_itr_t itr = map.find(symbol_name);
16413 if (map.end() == itr)
16415 map[symbol_name] = Tie::make(
t,is_const);
16424 static inline std::pair<bool,vector_t*>
make(std::pair<T*,std::size_t> v,
const bool is_const =
false)
16426 return std::make_pair(is_const,
new vector_t(v.first, v.second));
16432 template <
typename Allocator>
16433 static inline std::pair<bool,vector_t*>
make(std::vector<T,Allocator>& v,
const bool is_const =
false)
16435 return std::make_pair(is_const,
new vector_t(v));
16443 return std::make_pair(is_const,
new vector_t(v));
16449 template <
typename Allocator>
16450 static inline std::pair<bool,vector_t*>
make(std::deque<T,Allocator>& v,
const bool is_const =
false)
16452 return std::make_pair(is_const,
new vector_t(v));
16456 template <std::
size_t v_size>
16457 inline bool add(
const std::string& symbol_name, T (&v)[v_size],
const bool is_const =
false)
16459 return add_impl<tie_array,std::pair<T*,std::size_t> >
16460 (symbol_name, std::make_pair(v,v_size), is_const);
16463 inline bool add(
const std::string& symbol_name, T* v,
const std::size_t v_size,
const bool is_const =
false)
16465 return add_impl<tie_array,std::pair<T*,std::size_t> >
16466 (symbol_name, std::make_pair(v,v_size), is_const);
16469 template <
typename Allocator>
16470 inline bool add(
const std::string& symbol_name, std::vector<T,Allocator>& v,
const bool is_const =
false)
16472 return add_impl<tie_stdvec,std::vector<T,Allocator>&>
16473 (symbol_name, v, is_const);
16478 return add_impl<tie_vecview,exprtk::vector_view<T>&>
16479 (symbol_name, v, is_const);
16482 template <
typename Allocator>
16483 inline bool add(
const std::string& symbol_name, std::deque<T,Allocator>& v,
const bool is_const =
false)
16485 return add_impl<tie_stddeq,std::deque<T,Allocator>&>
16486 (symbol_name, v, is_const);
16493 static inline std::pair<bool,variable_node_t*> make(T&
t,
const bool is_const =
false)
16498 #ifndef exprtk_disable_string_capabilities 16499 static inline std::pair<bool,stringvar_node_t*> make(
std::string&
t,
const bool is_const =
false)
16505 static inline std::pair<bool,function_t*> make(
function_t&
t,
const bool is_constant =
false)
16507 return std::make_pair(is_constant,&
t);
16510 static inline std::pair<bool,vararg_function_t*> make(
vararg_function_t&
t,
const bool is_const =
false)
16512 return std::make_pair(is_const,&
t);
16515 static inline std::pair<bool,generic_function_t*> make(
generic_function_t&
t,
const bool is_constant =
false)
16517 return std::make_pair(is_constant,&
t);
16521 const tm_itr_t itr = map.find(symbol_name);
16523 if (map.end() == itr)
16525 map[symbol_name] = tie::make(
t,is_const);
16536 if (map.end() == itr)
16537 return reinterpret_cast<type_ptr>(0);
16539 return itr->second.second;
16542 template <
typename TType,
typename TRawType,
typename PtrType>
16545 static inline bool test(
const PtrType,
const void*)
16551 template <
typename TType,
typename TRawType>
16556 exprtk_debug((
"ptr_match::test() - %p <--> %p\n",(
void*)(&(p->
ref())),ptr));
16557 return (&(p->
ref()) == ptr);
16565 while (map.end() != itr)
16567 type_ptr ret_ptr = itr->second.second;
16569 if (ptr_match<Type,RawType,type_ptr>::test(ret_ptr,ptr))
16580 inline bool remove(
const std::string& symbol_name,
const bool delete_node =
true)
16582 const tm_itr_t itr = map.find(symbol_name);
16584 if (map.end() != itr)
16588 static inline void process(std::pair<bool,variable_node_t*>& n) {
delete n.second; }
16589 static inline void process(std::pair<bool,vector_t*>& n) {
delete n.second; }
16590 #ifndef exprtk_disable_string_capabilities 16591 static inline void process(std::pair<bool,stringvar_node_t*>& n) {
delete n.second; }
16593 static inline void process(std::pair<bool,function_t*>&) { }
16614 static inline double set(double) {
return (0.0); }
16615 static inline double set(
long double) {
return (0.0); }
16616 static inline float set(float) {
return (0.0
f); }
16620 static RawType null_type = init_type::set(RawType());
16624 if (map.end() == itr)
16627 return itr->second.second->ref();
16630 inline void clear(
const bool delete_node =
true)
16634 static inline void process(std::pair<bool,variable_node_t*>& n) {
delete n.second; }
16635 static inline void process(std::pair<bool,vector_t*>& n) {
delete n.second; }
16636 static inline void process(std::pair<bool,function_t*>&) { }
16637 #ifndef exprtk_disable_string_capabilities 16638 static inline void process(std::pair<bool,stringvar_node_t*>& n) {
delete n.second; }
16662 template <
typename Allocator,
16663 template <
typename,
typename>
class Sequence>
16664 inline std::size_t
get_list(Sequence<std::pair<std::string,RawType>,Allocator>& list)
const 16666 std::size_t count = 0;
16675 list.push_back(std::make_pair((*itr).first,itr->second.second->ref()));
16684 template <
typename Allocator,
16685 template <
typename,
typename>
class Sequence>
16686 inline std::size_t
get_list(Sequence<std::string,Allocator>& vlist)
const 16688 std::size_t count = 0;
16697 vlist.push_back((*itr).first);
16711 #ifndef exprtk_disable_string_capabilities 16722 static const std::size_t lut_size = 256;
16730 #ifndef exprtk_disable_string_capabilities 16755 for (std::size_t i = 0; i < free_function_list_.size(); ++i)
16757 delete free_function_list_[i];
16763 return (reserved_symbol_table_.end() != reserved_symbol_table_.find(symbol));
16774 sd =
reinterpret_cast<st_data*
>(0);
16795 if (data_ && (0 == ref_count))
16797 st_data::destroy(data_);
16806 template <
typename SymTab>
16833 : control_block_(control_block::create())
16840 control_block::destroy(control_block_,
this);
16846 control_block_->ref_count++;
16853 control_block::destroy(control_block_,
reinterpret_cast<symbol_table<T>*
>(0));
16856 control_block_->ref_count++;
16869 local_data().variable_store.clear(delete_node);
16874 local_data().function_store.clear();
16879 #ifndef exprtk_disable_string_capabilities 16880 local_data().stringvar_store.clear();
16886 local_data().vector_store.clear();
16891 local_data().local_symbol_list_.clear();
16896 if (!valid())
return;
16897 clear_variables ();
16898 clear_functions ();
16901 clear_local_constants();
16907 return local_data().variable_store.size;
16912 #ifndef exprtk_disable_string_capabilities 16916 return local_data().stringvar_store.size;
16925 return local_data().function_store.size;
16933 return local_data().vector_store.size;
16942 else if (!valid_symbol(variable_name))
16943 return reinterpret_cast<variable_ptr>(0);
16945 return local_data().variable_store.get(variable_name);
16953 return local_data().variable_store.get_from_varptr(
16954 reinterpret_cast<const void*>(&var_ref));
16957 #ifndef exprtk_disable_string_capabilities 16962 else if (!valid_symbol(string_name))
16963 return reinterpret_cast<stringvar_ptr>(0);
16965 return local_data().stringvar_store.get(string_name);
16973 else if (!valid_symbol(function_name))
16974 return reinterpret_cast<function_ptr>(0);
16976 return local_data().function_store.get(function_name);
16983 else if (!valid_symbol(vararg_function_name))
16984 return reinterpret_cast<vararg_function_ptr>(0);
16986 return local_data().vararg_function_store.get(vararg_function_name);
16993 else if (!valid_symbol(function_name))
16994 return reinterpret_cast<generic_function_ptr>(0);
16996 return local_data().generic_function_store.get(function_name);
17003 else if (!valid_symbol(function_name))
17004 return reinterpret_cast<generic_function_ptr>(0);
17006 return local_data().string_function_store.get(function_name);
17013 else if (!valid_symbol(function_name))
17014 return reinterpret_cast<generic_function_ptr>(0);
17016 return local_data().overload_function_store.get(function_name);
17025 else if (!valid_symbol(vector_name))
17026 return reinterpret_cast<vector_holder_ptr>(0);
17028 return local_data().vector_store.get(vector_name);
17033 static T null_var = T(0);
17036 else if (!valid_symbol(symbol_name))
17039 return local_data().variable_store.type_ref(symbol_name);
17042 #ifndef exprtk_disable_string_capabilities 17047 return null_stringvar;
17048 else if (!valid_symbol(symbol_name))
17049 return null_stringvar;
17051 return local_data().stringvar_store.type_ref(symbol_name);
17059 else if (!valid_symbol(symbol_name))
17062 return local_data().variable_store.is_constant(symbol_name);
17065 #ifndef exprtk_disable_string_capabilities 17070 else if (!valid_symbol(symbol_name))
17072 else if (!local_data().stringvar_store.symbol_exists(symbol_name))
17075 return local_data().stringvar_store.is_constant(symbol_name);
17083 else if (!valid_symbol(variable_name))
17085 else if (symbol_exists(variable_name))
17088 local_data().local_symbol_list_.push_back(
value);
17089 T&
t = local_data().local_symbol_list_.back();
17091 return add_variable(variable_name,
t);
17094 #ifndef exprtk_disable_string_capabilities 17099 else if (!valid_symbol(stringvar_name))
17101 else if (symbol_exists(stringvar_name))
17104 local_data().local_stringvar_list_.push_back(
value);
17105 std::string& s = local_data().local_stringvar_list_.back();
17107 return add_stringvar(stringvar_name,s);
17115 else if (!valid_symbol(variable_name))
17117 else if (symbol_exists(variable_name))
17120 return local_data().variable_store.add(variable_name,
t,is_constant);
17127 else if (!valid_symbol(constant_name))
17129 else if (symbol_exists(constant_name))
17132 local_data().local_symbol_list_.push_back(
value);
17133 T&
t = local_data().local_symbol_list_.back();
17135 return add_variable(constant_name,
t,
true);
17138 #ifndef exprtk_disable_string_capabilities 17143 else if (!valid_symbol(stringvar_name))
17145 else if (symbol_exists(stringvar_name))
17148 return local_data().stringvar_store.add(stringvar_name,s,is_constant);
17156 else if (!valid_symbol(function_name))
17158 else if (symbol_exists(function_name))
17161 return local_data().function_store.add(function_name,
function);
17168 else if (!valid_symbol(vararg_function_name))
17170 else if (symbol_exists(vararg_function_name))
17173 return local_data().vararg_function_store.add(vararg_function_name,vararg_function);
17180 else if (!valid_symbol(function_name))
17182 else if (symbol_exists(function_name))
17186 (generic_function_t::e_rtrn_scalar ==
function.
rtrn_type) ||
17187 (generic_function_t::e_rtrn_string ==
function.
rtrn_type)
17189 std::string::npos !=
function.parameter_sequence.find_first_not_of(
"STVZ*?|")
17193 (generic_function_t::e_rtrn_overload ==
function.
rtrn_type) &&
17194 std::string::npos !=
function.parameter_sequence.find_first_not_of(
"STVZ*?|:")
17200 case generic_function_t::e_rtrn_scalar :
17201 return local_data().generic_function_store.add(function_name,
function);
17203 case generic_function_t::e_rtrn_string :
17204 return local_data().string_function_store.add(function_name,
function);
17206 case generic_function_t::e_rtrn_overload :
17207 return local_data().overload_function_store.add(function_name,
function);
17213 #define exprtk_define_freefunction(NN) \ 17214 inline bool add_function(const std::string& function_name, ff##NN##_functor function) \ 17217 { return false; } \ 17218 if (!valid_symbol(function_name)) \ 17219 { return false; } \ 17220 if (symbol_exists(function_name)) \ 17221 { return false; } \ 17223 exprtk::ifunction<T>* ifunc = new freefunc##NN(function); \ 17225 local_data().free_function_list_.push_back(ifunc); \ 17227 return add_function(function_name,(*local_data().free_function_list_.back())); \ 17239 #undef exprtk_define_freefunction 17245 else if (!valid_symbol(function_name,
false))
17247 else if (symbol_exists(function_name,
false))
17250 return local_data().function_store.add(function_name,
function);
17257 else if (!valid_symbol(vararg_function_name,
false))
17259 else if (symbol_exists(vararg_function_name,
false))
17262 return local_data().vararg_function_store.add(vararg_function_name,vararg_function);
17269 else if (!valid_symbol(function_name,
false))
17271 else if (symbol_exists(function_name,
false))
17275 (generic_function_t::e_rtrn_scalar ==
function.
rtrn_type) ||
17276 (generic_function_t::e_rtrn_string ==
function.
rtrn_type)
17278 std::string::npos !=
function.parameter_sequence.find_first_not_of(
"STV*?|")
17282 generic_function_t::e_rtrn_overload &&
17283 std::string::npos !=
function.parameter_sequence.find_first_not_of(
"STV*?|:")
17289 case generic_function_t::e_rtrn_scalar :
17290 return local_data().generic_function_store.add(function_name,
function);
17292 case generic_function_t::e_rtrn_string :
17293 return local_data().string_function_store.add(function_name,
function);
17295 case generic_function_t::e_rtrn_overload :
17296 return local_data().overload_function_store.add(function_name,
function);
17302 template <std::
size_t N>
17307 else if (!valid_symbol(vector_name))
17309 else if (symbol_exists(vector_name))
17312 return local_data().vector_store.add(vector_name,v);
17319 else if (!valid_symbol(vector_name))
17321 else if (symbol_exists(vector_name))
17323 else if (0 == v_size)
17326 return local_data().vector_store.add(vector_name,v,v_size);
17329 template <
typename Allocator>
17334 else if (!valid_symbol(vector_name))
17336 else if (symbol_exists(vector_name))
17338 else if (0 == v.size())
17341 return local_data().vector_store.add(vector_name,v);
17348 else if (!valid_symbol(vector_name))
17350 else if (symbol_exists(vector_name))
17352 else if (0 == v.
size())
17355 return local_data().vector_store.add(vector_name,v);
17363 return local_data().variable_store.remove(variable_name, delete_node);
17366 #ifndef exprtk_disable_string_capabilities 17372 return local_data().stringvar_store.remove(string_name);
17381 return local_data().function_store.remove(function_name);
17389 return local_data().vararg_function_store.remove(vararg_function_name);
17397 return local_data().vector_store.remove(vector_name);
17402 return add_pi () &&
17410 static const T local_pi = details::numeric::details::const_pi_impl<T>(num_type);
17411 return add_constant(
"pi",local_pi);
17417 return add_constant(
"epsilon",local_epsilon);
17422 static const T local_infinity = std::numeric_limits<T>::infinity();
17423 return add_constant(
"inf",local_infinity);
17426 template <
typename Package>
17429 return package.register_package(*
this);
17432 template <
typename Allocator,
17433 template <
typename,
typename>
class Sequence>
17439 return local_data().variable_store.get_list(vlist);
17442 template <
typename Allocator,
17443 template <
typename,
typename>
class Sequence>
17449 return local_data().variable_store.get_list(vlist);
17452 #ifndef exprtk_disable_string_capabilities 17453 template <
typename Allocator,
17454 template <
typename,
typename>
class Sequence>
17460 return local_data().stringvar_store.get_list(svlist);
17463 template <
typename Allocator,
17464 template <
typename,
typename>
class Sequence>
17470 return local_data().stringvar_store.get_list(svlist);
17474 template <
typename Allocator,
17475 template <
typename,
typename>
class Sequence>
17481 return local_data().vector_store.get_list(vlist);
17493 else if (local_data().variable_store.symbol_exists(symbol_name))
17495 #ifndef exprtk_disable_string_capabilities 17496 else if (local_data().stringvar_store.symbol_exists(symbol_name))
17499 else if (local_data().vector_store.symbol_exists(symbol_name))
17501 else if (local_data().function_store.symbol_exists(symbol_name))
17503 else if (check_reserved_symb && local_data().is_reserved_symbol(symbol_name))
17514 return local_data().variable_store.symbol_exists(variable_name);
17517 #ifndef exprtk_disable_string_capabilities 17523 return local_data().stringvar_store.symbol_exists(stringvar_name);
17530 else if (!valid_symbol(symbol_name))
17532 else if (!local_data().stringvar_store.symbol_exists(symbol_name))
17536 local_data().stringvar_store.symbol_exists(symbol_name) ||
17537 local_data().stringvar_store.is_constant (symbol_name)
17547 return local_data().function_store.symbol_exists(function_name);
17555 return local_data().vararg_function_store.symbol_exists(vararg_function_name);
17563 return local_data().vector_store.symbol_exists(vector_name);
17568 return local_data().variable_store.entity_name(ptr);
17573 return local_data().vector_store.entity_name(ptr);
17576 #ifndef exprtk_disable_string_capabilities 17579 return local_data().stringvar_store.entity_name(ptr);
17584 return local_data().stringvar_store.entity_name(ptr);
17591 return control_block_ && control_block_->data_;
17597 std::vector<std::string> name_list;
17599 st.
local_data().function_store.get_list(name_list);
17601 if (!name_list.empty())
17603 for (std::size_t i = 0; i < name_list.size(); ++i)
17606 add_function(name_list[i],ifunc);
17612 std::vector<std::string> name_list;
17614 st.
local_data().vararg_function_store.get_list(name_list);
17616 if (!name_list.empty())
17618 for (std::size_t i = 0; i < name_list.size(); ++i)
17621 add_function(name_list[i],ivafunc);
17627 std::vector<std::string> name_list;
17629 st.
local_data().generic_function_store.get_list(name_list);
17631 if (!name_list.empty())
17633 for (std::size_t i = 0; i < name_list.size(); ++i)
17636 add_function(name_list[i],ifunc);
17642 std::vector<std::string> name_list;
17644 st.
local_data().string_function_store.get_list(name_list);
17646 if (!name_list.empty())
17648 for (std::size_t i = 0; i < name_list.size(); ++i)
17651 add_function(name_list[i],ifunc);
17657 std::vector<std::string> name_list;
17659 st.
local_data().overload_function_store.get_list(name_list);
17661 if (!name_list.empty())
17663 for (std::size_t i = 0; i < name_list.size(); ++i)
17666 add_function(name_list[i],ifunc);
17676 if (symbol.empty())
17680 else if (symbol.size() > 1)
17682 for (std::size_t i = 1; i < symbol.size(); ++i)
17689 if ((
'.' == symbol[i]) && (i < (symbol.size() - 1)))
17697 return (check_reserved_symb) ? (!local_data().is_reserved_symbol(symbol)) :
true;
17702 if (symbol.empty())
17706 else if (symbol.size() > 1)
17708 for (std::size_t i = 1; i < symbol.size(); ++i)
17715 if ((
'.' == symbol[i]) && (i < (symbol.size() - 1)))
17730 return *(control_block_->data_);
17735 return *(control_block_->data_);
17743 template <
typename T>
17746 template <
typename T>
17793 retinv_null(false),
17794 return_invoked(&retinv_null)
17801 retinv_null(false),
17802 return_invoked(&retinv_null)
17812 if (!local_data_list.empty())
17814 for (std::size_t i = 0; i < local_data_list.size(); ++i)
17816 switch (local_data_list[i].
type)
17818 case e_expr :
delete reinterpret_cast<expression_ptr>(local_data_list[i].pointer);
17821 case e_vecholder :
delete reinterpret_cast<vector_holder_ptr>(local_data_list[i].pointer);
17824 case e_data :
delete (T*)(local_data_list[i].pointer);
17827 case e_vecdata :
delete [] (T*)(local_data_list[i].pointer);
17830 case e_string :
delete (
std::string*)(local_data_list[i].pointer);
17878 : control_block_(0)
17884 : control_block_ (
e.control_block_ ),
17885 symbol_table_list_(
e.symbol_table_list_)
17887 control_block_->ref_count++;
17891 : control_block_(0)
17901 if (control_block_)
17904 (0 != control_block_->ref_count) &&
17905 (0 == --control_block_->ref_count)
17908 delete control_block_;
17911 control_block_ = 0;
17914 control_block_ =
e.control_block_;
17915 control_block_->ref_count++;
17916 symbol_table_list_ =
e.symbol_table_list_;
17924 return (
this == &
e);
17930 (0 == control_block_ ) ||
17931 (0 == control_block_->expr)
17937 control_block::destroy(control_block_);
17944 control_block::destroy(control_block_);
17949 return control_block_->expr->value();
17952 inline T operator() ()
const 17957 inline operator T()
const 17962 inline operator bool()
const 17969 symbol_table_list_.push_back(st);
17974 return symbol_table_list_[index];
17979 return symbol_table_list_[index];
17986 if (control_block_->results)
17987 return (*control_block_->results);
17991 return null_results;
17997 return (*control_block_->return_invoked);
18004 return symbol_table_list_;
18011 if (control_block_)
18013 if (0 == --control_block_->ref_count)
18015 delete control_block_;
18019 control_block_ = control_block::create(expr);
18027 if (control_block_)
18030 local_data_list.push_back(
18032 data_pack(reinterpret_cast<void*>(expr),
18033 control_block::e_expr));
18042 if (control_block_)
18045 local_data_list.push_back(
18047 data_pack(reinterpret_cast<void*>(vec_holder),
18048 control_block::e_vecholder));
18057 if (control_block_)
18059 typename control_block::data_type dt = control_block::e_data;
18063 case 0 : dt = control_block::e_data;
break;
18064 case 1 : dt = control_block::e_vecdata;
break;
18065 case 2 : dt = control_block::e_string;
break;
18069 local_data_list.push_back(
18071 data_pack(reinterpret_cast<void*>(
data), dt, size));
18078 if (control_block_)
18080 return control_block_->local_data_list;
18084 static typename control_block::local_data_list_t null_local_data_list;
18085 return null_local_data_list;
18091 if (control_block_ && rc)
18093 control_block_->results = rc;
18099 if (control_block_)
18101 control_block_->return_invoked = retinvk_ptr;
18113 template <
typename T>
18149 template <
typename T>
18155 namespace parser_error
18192 t.diagnostic = diagnostic;
18193 t.src_location = src_location;
18206 t.diagnostic = diagnostic;
18207 t.src_location = src_location;
18238 std::size_t error_line_start = 0;
18240 for (std::size_t i =
error.token.position; i > 0; --i)
18244 if ((
'\n' == c) || (
'\r' == c))
18246 error_line_start = i + 1;
18254 error.column_no =
error.token.position - error_line_start;
18256 next_nl_position - error_line_start);
18260 for (std::size_t i = 0; i < next_nl_position; ++i)
18271 printf(
"Position: %02d Type: [%s] Msg: %s\n",
18272 static_cast<int>(
error.token.position),
18274 error.diagnostic.c_str());
18280 template <
typename Parser>
18283 p.state_.type_check_enabled =
false;
18287 template <
typename T>
18288 class parser :
public lexer::parser_helper
18330 #ifndef exprtk_disable_break_continue 18342 #ifndef exprtk_disable_string_capabilities 18381 typedef std::map<std::string,std::pair<trinary_functor_t ,operator_t> >
sf3_map_t;
18382 typedef std::map<std::string,std::pair<quaternary_functor_t,operator_t> >
sf4_map_t;
18385 typedef std::multimap<std::string,details::base_operation_t,details::ilesscompare>
base_ops_map_t;
18430 #ifndef exprtk_disable_string_capabilities 18436 size (
std::numeric_limits<
std::size_t>::
max()),
18437 index(
std::numeric_limits<
std::size_t>::
max()),
18438 depth(
std::numeric_limits<
std::size_t>::
max()),
18446 #ifndef exprtk_disable_string_capabilities
18457 else if (depth < se.
depth)
18459 else if (depth > se.
depth)
18461 else if (index < se.
index)
18463 else if (index > se.
index)
18482 #ifndef exprtk_disable_string_capabilities 18498 #ifndef exprtk_disable_string_capabilities 18513 input_param_cnt_(0)
18518 return element_.size();
18523 return element_.empty();
18528 if (index < element_.size())
18529 return element_[index];
18531 return null_element_;
18537 const std::size_t current_depth = parser_.state_.scope_depth;
18539 for (std::size_t i = 0; i < element_.size(); ++i)
18543 if (se.
depth > current_depth)
18547 (se.
index == index)
18552 return null_element_;
18558 const std::size_t current_depth = parser_.state_.scope_depth;
18560 for (std::size_t i = 0; i < element_.size(); ++i)
18564 if (se.
depth > current_depth)
18568 (se.
index == index) &&
18574 return null_element_;
18579 for (std::size_t i = 0; i < element_.size(); ++i)
18594 element_.push_back(se);
18595 std::sort(element_.begin(),element_.end());
18603 static_cast<int>(parser_.state_.scope_depth)));
18605 for (std::size_t i = 0; i < element_.size(); ++i)
18612 static_cast<int>(i),
18622 #ifdef exprtk_enable_debugging 18628 case scope_element::e_variable :
if (se.
data )
delete (T*) se.
data;
18632 case scope_element::e_vector :
if (se.
data )
delete[] (T*) se.
data;
18639 #ifndef exprtk_disable_string_capabilities 18653 for (std::size_t i = 0; i < element_.size(); ++i)
18655 free_element(element_[i]);
18660 input_param_cnt_ = 0;
18665 return ++input_param_cnt_;
18670 for (std::size_t i = 0; i < element_.size(); ++i)
18682 if (&(vn->
ref()) == (&v))
18711 parser_.state_.scope_depth++;
18712 #ifdef exprtk_enable_debugging 18713 const std::string depth(2 * parser_.state_.scope_depth,
'-');
18716 static_cast<int>(parser_.state_.scope_depth)));
18722 parser_.sem_.deactivate(parser_.state_.scope_depth);
18723 parser_.state_.scope_depth--;
18724 #ifdef exprtk_enable_debugging 18725 const std::string depth(2 * parser_.state_.scope_depth,
'-');
18728 static_cast<int>(parser_.state_.scope_depth)));
18746 #ifndef exprtk_disable_string_capabilities 18755 return symtab_list_.empty();
18760 symtab_list_.clear();
18767 for (std::size_t i = 0; i < symtab_list_.size(); ++i)
18769 if (symtab_list_[i].valid())
18779 if (!symtab_list_.empty())
18780 return symtab_list_[0].valid_symbol(symbol);
18787 if (!symtab_list_.empty())
18788 return symtab_list_[0].valid_function(symbol);
18795 if (!valid_symbol(variable_name))
18800 for (std::size_t i = 0; i < symtab_list_.size(); ++i)
18802 if (!symtab_list_[i].valid())
18805 result = local_data(i)
18806 .variable_store.get(variable_name);
18818 for (std::size_t i = 0; i < symtab_list_.size(); ++i)
18820 if (!symtab_list_[i].valid())
18823 result = local_data(i).variable_store
18824 .get_from_varptr(reinterpret_cast<const void*>(&var_ref));
18832 #ifndef exprtk_disable_string_capabilities 18835 if (!valid_symbol(string_name))
18840 for (std::size_t i = 0; i < symtab_list_.size(); ++i)
18842 if (!symtab_list_[i].valid())
18845 result = local_data(i)
18846 .stringvar_store.get(string_name);
18857 if (!valid_function_name(function_name))
18862 for (std::size_t i = 0; i < symtab_list_.size(); ++i)
18864 if (!symtab_list_[i].valid())
18867 result = local_data(i)
18868 .function_store.get(function_name);
18878 if (!valid_function_name(vararg_function_name))
18883 for (std::size_t i = 0; i < symtab_list_.size(); ++i)
18885 if (!symtab_list_[i].valid())
18888 result = local_data(i)
18889 .vararg_function_store.get(vararg_function_name);
18899 if (!valid_function_name(function_name))
18904 for (std::size_t i = 0; i < symtab_list_.size(); ++i)
18906 if (!symtab_list_[i].valid())
18909 result = local_data(i)
18910 .generic_function_store.get(function_name);
18920 if (!valid_function_name(function_name))
18925 for (std::size_t i = 0; i < symtab_list_.size(); ++i)
18927 if (!symtab_list_[i].valid())
18931 local_data(i).string_function_store.get(function_name);
18941 if (!valid_function_name(function_name))
18946 for (std::size_t i = 0; i < symtab_list_.size(); ++i)
18948 if (!symtab_list_[i].valid())
18952 local_data(i).overload_function_store.get(function_name);
18962 if (!valid_symbol(vector_name))
18967 for (std::size_t i = 0; i < symtab_list_.size(); ++i)
18969 if (!symtab_list_[i].valid())
18973 local_data(i).vector_store.get(vector_name);
18983 if (!valid_symbol(symbol_name))
18986 for (std::size_t i = 0; i < symtab_list_.size(); ++i)
18988 if (!symtab_list_[i].valid())
18990 else if (local_data(i).variable_store.is_constant(symbol_name))
18997 #ifndef exprtk_disable_string_capabilities 19000 if (!valid_symbol(symbol_name))
19003 for (std::size_t i = 0; i < symtab_list_.size(); ++i)
19005 if (!symtab_list_[i].valid())
19007 else if (!local_data(i).stringvar_store.symbol_exists(symbol_name))
19009 else if ( local_data(i).stringvar_store.is_constant(symbol_name))
19019 for (std::size_t i = 0; i < symtab_list_.size(); ++i)
19021 if (!symtab_list_[i].valid())
19023 else if (symtab_list_[i].symbol_exists(symbol))
19032 for (std::size_t i = 0; i < symtab_list_.size(); ++i)
19034 if (!symtab_list_[i].valid())
19037 symtab_list_[i].local_data().variable_store
19038 .symbol_exists(variable_name)
19046 #ifndef exprtk_disable_string_capabilities 19049 for (std::size_t i = 0; i < symtab_list_.size(); ++i)
19051 if (!symtab_list_[i].valid())
19054 symtab_list_[i].local_data().stringvar_store
19055 .symbol_exists(stringvar_name)
19065 for (std::size_t i = 0; i < symtab_list_.size(); ++i)
19067 if (!symtab_list_[i].valid())
19070 symtab_list_[i].local_data().stringvar_store
19071 .symbol_exists(symbol_name)
19075 local_data(i).stringvar_store.symbol_exists(symbol_name) ||
19076 local_data(i).stringvar_store.is_constant (symbol_name)
19088 for (std::size_t i = 0; i < symtab_list_.size(); ++i)
19090 if (!symtab_list_[i].valid())
19093 local_data(i).vararg_function_store
19094 .symbol_exists(function_name)
19104 for (std::size_t i = 0; i < symtab_list_.size(); ++i)
19106 if (!symtab_list_[i].valid())
19109 local_data(i).vararg_function_store
19110 .symbol_exists(vararg_function_name)
19120 for (std::size_t i = 0; i < symtab_list_.size(); ++i)
19122 if (!symtab_list_[i].valid())
19125 local_data(i).vector_store
19126 .symbol_exists(vector_name)
19136 return local_data().variable_store.entity_name(ptr);
19141 return local_data().vector_store.entity_name(ptr);
19144 #ifndef exprtk_disable_string_capabilities 19147 return local_data().stringvar_store.entity_name(ptr);
19152 return local_data().stringvar_store.entity_name(ptr);
19158 return symtab_list_[index].local_data();
19163 return symtab_list_[index].local_data();
19168 return symtab_list_[index];
19175 : type_check_enabled(true)
19182 parsing_return_stmt =
false;
19183 parsing_break_stmt =
false;
19184 return_stmt_present =
false;
19185 side_effect_present =
false;
19189 #ifndef exprtk_enable_debugging 19192 void activate_side_effect(
const std::string& source)
19195 if (!side_effect_present)
19197 side_effect_present =
true;
19199 exprtk_debug((
"activate_side_effect() - caller: %s\n",source.c_str()));
19218 e_usr_unknown_type = 0,
19219 e_usr_variable_type = 1,
19220 e_usr_constant_type = 2
19225 e_usrmode_default = 0,
19226 e_usrmode_extended = 1
19243 if (e_usrmode_default != mode)
19246 st = e_usr_variable_type;
19247 default_value = T(0);
19248 error_message.clear();
19264 e_ct_variables = 1,
19265 e_ct_functions = 2,
19266 e_ct_assignments = 4
19277 e_st_local_variable = 6,
19278 e_st_local_vector = 7,
19279 e_st_local_string = 8
19290 : options_(options),
19291 collect_variables_ ((options_ & e_ct_variables ) == e_ct_variables ),
19292 collect_functions_ ((options_ & e_ct_functions ) == e_ct_functions ),
19293 collect_assignments_((options_ & e_ct_assignments) == e_ct_assignments),
19294 return_present_ (false),
19295 final_stmt_return_(false)
19298 template <
typename Allocator,
19299 template <
typename,
typename>
class Sequence>
19300 inline std::size_t
symbols(Sequence<symbol_t,Allocator>& symbols_list)
19302 if (!collect_variables_ && !collect_functions_)
19304 else if (symbol_name_list_.empty())
19307 for (std::size_t i = 0; i < symbol_name_list_.size(); ++i)
19312 std::sort(symbol_name_list_.begin(),symbol_name_list_.end());
19314 std::unique_copy(symbol_name_list_.begin(),
19315 symbol_name_list_.end (),
19316 std::back_inserter(symbols_list));
19318 return symbols_list.size();
19321 template <
typename Allocator,
19322 template <
typename,
typename>
class Sequence>
19325 if (!collect_assignments_)
19327 else if (assignment_name_list_.empty())
19330 for (std::size_t i = 0; i < assignment_name_list_.size(); ++i)
19335 std::sort(assignment_name_list_.begin(),assignment_name_list_.end());
19337 std::unique_copy(assignment_name_list_.begin(),
19338 assignment_name_list_.end (),
19339 std::back_inserter(assignment_list));
19341 return assignment_list.size();
19346 symbol_name_list_ .clear();
19347 assignment_name_list_.clear();
19348 retparam_list_ .clear();
19349 return_present_ =
false;
19350 final_stmt_return_ =
false;
19355 return collect_variables_;
19360 return collect_functions_;
19365 return collect_assignments_;
19370 return return_present_;
19375 return final_stmt_return_;
19382 return retparam_list_;
19391 case e_st_variable :
19394 case e_st_local_variable :
19395 case e_st_local_vector :
19396 case e_st_local_string :
if (collect_variables_)
19398 .push_back(std::make_pair(symbol, st));
19401 case e_st_function :
if (collect_functions_)
19403 .push_back(std::make_pair(symbol, st));
19414 case e_st_variable :
19416 case e_st_string :
if (collect_assignments_)
19417 assignment_name_list_
19418 .push_back(std::make_pair(symbol, st));
19452 e_numeric_check = 4,
19453 e_bracket_check = 8,
19454 e_sequence_check = 16,
19455 e_commutative_check = 32,
19456 e_strength_reduction = 64,
19457 e_disable_vardef = 128,
19458 e_collect_vars = 256,
19459 e_collect_funcs = 512,
19460 e_collect_assings = 1024,
19461 e_disable_usr_on_rsrvd = 2048,
19462 e_disable_zero_return = 4096
19487 e_ctrl_unknown = 0,
19498 e_logic_unknown = 0,
19506 e_arith_unknown = 0,
19508 e_arith_div, e_arith_mod, e_arith_pow
19513 e_assign_unknown = 0,
19520 e_ineq_unknown = 0,
19526 static const std::size_t compile_all_opts = e_replacer +
19531 e_commutative_check +
19532 e_strength_reduction;
19536 load_compile_options(compile_options);
19541 disabled_func_set_.clear();
19547 disabled_ctrl_set_.clear();
19553 disabled_logic_set_.clear();
19559 disabled_arithmetic_set_.clear();
19565 disabled_assignment_set_.clear();
19571 disabled_inequality_set_.clear();
19577 disable_vardef_ =
false;
19585 std::insert_iterator<disabled_entity_set_t>
19586 (disabled_func_set_, disabled_func_set_.begin()));
19594 std::insert_iterator<disabled_entity_set_t>
19595 (disabled_ctrl_set_, disabled_ctrl_set_.begin()));
19603 std::insert_iterator<disabled_entity_set_t>
19604 (disabled_logic_set_, disabled_logic_set_.begin()));
19612 std::insert_iterator<disabled_entity_set_t>
19613 (disabled_arithmetic_set_, disabled_arithmetic_set_.begin()));
19621 std::insert_iterator<disabled_entity_set_t>
19622 (disabled_assignment_set_, disabled_assignment_set_.begin()));
19630 std::insert_iterator<disabled_entity_set_t>
19631 (disabled_inequality_set_, disabled_inequality_set_.begin()));
19637 disable_vardef_ =
true;
19657 if (disabled_func_set_.empty())
19660 return (disabled_func_set_.end() == disabled_func_set_.find(function_name));
19665 if (disabled_ctrl_set_.empty())
19668 return (disabled_ctrl_set_.end() == disabled_ctrl_set_.find(control_struct));
19673 if (disabled_logic_set_.empty())
19676 return (disabled_logic_set_.end() == disabled_logic_set_.find(logic_operation));
19681 if (disabled_logic_set_.empty())
19684 return disabled_arithmetic_set_.end() == disabled_arithmetic_set_
19685 .find(arith_opr_to_string(arithmetic_operation));
19690 if (disabled_assignment_set_.empty())
19693 return disabled_assignment_set_.end() == disabled_assignment_set_
19694 .find(assign_opr_to_string(assignment));
19699 if (disabled_inequality_set_.empty())
19702 return disabled_inequality_set_.end() == disabled_inequality_set_
19703 .find(inequality_opr_to_string(inequality));
19708 if (disabled_func_set_.empty())
19711 return (disabled_func_set_.end() != disabled_func_set_.find(function_name));
19716 if (disabled_ctrl_set_.empty())
19719 return (disabled_ctrl_set_.end() != disabled_ctrl_set_.find(control_struct));
19724 if (disabled_logic_set_.empty())
19727 return (disabled_logic_set_.end() != disabled_logic_set_.find(logic_operation));
19732 if (disabled_assignment_set_.empty())
19735 return disabled_assignment_set_.end() != disabled_assignment_set_
19736 .find(assign_opr_to_string(assignment_operation));
19741 if (disabled_arithmetic_set_.empty())
19744 return disabled_arithmetic_set_.end() != disabled_arithmetic_set_
19745 .find(arith_opr_to_string(arithmetic_operation));
19750 if (disabled_inequality_set_.empty())
19753 return disabled_inequality_set_.end() != disabled_inequality_set_
19754 .find(inequality_opr_to_string(inequality));
19760 (e_bf_unknown != bf) &&
19773 (e_ctrl_unknown != ctrl_struct) &&
19786 (e_logic_unknown !=
logic) &&
19799 (e_arith_unknown != arithmetic) &&
19812 (e_assign_unknown != assignment) &&
19825 (e_ineq_unknown != inequality) &&
19838 (e_bf_unknown != bf) &&
19844 if (disabled_func_set_.end() != itr)
19846 disabled_func_set_.erase(itr);
19856 (e_ctrl_unknown != ctrl_struct) &&
19862 if (disabled_ctrl_set_.end() != itr)
19864 disabled_ctrl_set_.erase(itr);
19874 (e_logic_unknown !=
logic) &&
19880 if (disabled_logic_set_.end() != itr)
19882 disabled_logic_set_.erase(itr);
19892 (e_arith_unknown != arithmetic) &&
19898 if (disabled_arithmetic_set_.end() != itr)
19900 disabled_arithmetic_set_.erase(itr);
19910 (e_assign_unknown != assignment) &&
19916 if (disabled_assignment_set_.end() != itr)
19918 disabled_assignment_set_.erase(itr);
19928 (e_ineq_unknown != inequality) &&
19934 if (disabled_inequality_set_.end() != itr)
19936 disabled_inequality_set_.erase(itr);
19947 enable_replacer_ = (compile_options & e_replacer ) == e_replacer;
19948 enable_joiner_ = (compile_options & e_joiner ) == e_joiner;
19949 enable_numeric_check_ = (compile_options & e_numeric_check ) == e_numeric_check;
19950 enable_bracket_check_ = (compile_options & e_bracket_check ) == e_bracket_check;
19951 enable_sequence_check_ = (compile_options & e_sequence_check ) == e_sequence_check;
19952 enable_commutative_check_ = (compile_options & e_commutative_check ) == e_commutative_check;
19953 enable_strength_reduction_ = (compile_options & e_strength_reduction ) == e_strength_reduction;
19954 enable_collect_vars_ = (compile_options & e_collect_vars ) == e_collect_vars;
19955 enable_collect_funcs_ = (compile_options & e_collect_funcs ) == e_collect_funcs;
19956 enable_collect_assings_ = (compile_options & e_collect_assings ) == e_collect_assings;
19957 disable_vardef_ = (compile_options & e_disable_vardef ) == e_disable_vardef;
19958 disable_rsrvd_sym_usr_ = (compile_options & e_disable_usr_on_rsrvd) == e_disable_usr_on_rsrvd;
19959 disable_zero_return_ = (compile_options & e_disable_zero_return ) == e_disable_zero_return;
19972 default :
return "";
19985 default :
return "";
20001 default :
return "";
20032 : settings_(settings),
20033 resolve_unknown_symbol_(false),
20034 results_context_(0),
20035 unknown_symbol_resolver_(reinterpret_cast<unknown_symbol_resolver*>(0)),
20037 #pragma warning(push)
20038 #pragma warning (disable:4355)
20042 #pragma warning(pop)
20044 operator_joiner_2_(2),
20045 operator_joiner_3_(3)
20047 init_precompilation();
20050 load_unary_operations_map (unary_op_map_ );
20051 load_binary_operations_map (binary_op_map_ );
20052 load_inv_binary_operations_map(inv_binary_op_map_);
20053 load_sf3_map (sf3_map_ );
20054 load_sf4_map (sf4_map_ );
20056 expression_generator_.init_synthesize_map();
20057 expression_generator_.set_parser(*
this);
20058 expression_generator_.set_uom(unary_op_map_);
20059 expression_generator_.set_bom(binary_op_map_);
20060 expression_generator_.set_ibom(inv_binary_op_map_);
20061 expression_generator_.set_sf3m(sf3_map_);
20062 expression_generator_.set_sf4m(sf4_map_);
20063 expression_generator_.set_strength_reduction_state(settings_.strength_reduction_enabled());
20071 if (settings_.collect_variables_enabled())
20072 dec_.collect_variables() =
true;
20074 if (settings_.collect_functions_enabled())
20075 dec_.collect_functions() =
true;
20077 if (settings_.collect_assignments_enabled())
20078 dec_.collect_assignments() =
true;
20080 if (settings_.replacer_enabled())
20082 symbol_replacer_.clear();
20085 helper_assembly_.token_modifier_list.clear();
20086 helper_assembly_.register_modifier(&symbol_replacer_);
20089 if (settings_.commutative_check_enabled())
20096 helper_assembly_.token_inserter_list.clear();
20097 helper_assembly_.register_inserter(&commutative_inserter_);
20100 if (settings_.joiner_enabled())
20102 helper_assembly_.token_joiner_list.clear();
20103 helper_assembly_.register_joiner(&operator_joiner_2_);
20104 helper_assembly_.register_joiner(&operator_joiner_3_);
20108 settings_.numeric_check_enabled () ||
20109 settings_.bracket_check_enabled () ||
20110 settings_.sequence_check_enabled()
20113 helper_assembly_.token_scanner_list.clear();
20115 if (settings_.numeric_check_enabled())
20117 helper_assembly_.register_scanner(&numeric_checker_);
20120 if (settings_.bracket_check_enabled())
20122 helper_assembly_.register_scanner(&bracket_checker_);
20125 if (settings_.sequence_check_enabled())
20127 helper_assembly_.register_scanner(&sequence_validator_ );
20128 helper_assembly_.register_scanner(&sequence_validator_3tkns_);
20136 error_list_ .clear();
20137 brkcnt_list_ .clear();
20138 synthesis_error_.clear();
20143 expression_generator_.set_allocator(node_allocator_);
20145 if (expression_string.empty())
20149 "ERR000 - Empty expression!",
20155 if (!init(expression_string))
20157 process_lexer_errors();
20161 if (lexer().empty())
20165 "ERR001 - Empty expression!",
20171 if (!run_assemblies())
20185 if ((0 !=
e) && (token_t::e_eof == current_token().
type))
20187 bool* retinvk_ptr = 0;
20189 if (state_.return_stmt_present)
20191 dec_.return_present_ =
true;
20193 e = expression_generator_
20194 .return_envelope(
e,results_context_,retinvk_ptr);
20200 register_local_vars(expr);
20201 register_return_results(expr);
20207 if (error_list_.empty())
20212 "ERR002 - Invalid expression encountered",
20235 compile(expression_string,expr);
20242 for (std::size_t i = 0; i < lexer().size(); ++i)
20244 if (lexer()[i].is_error())
20248 switch (lexer()[i].type)
20265 default : diagnostic +=
"Unknown compiler error";
20271 diagnostic +
": " + lexer()[i].
value,
20279 if (settings_.commutative_check_enabled())
20281 helper_assembly_.run_inserters(lexer());
20284 if (settings_.joiner_enabled())
20286 helper_assembly_.run_joiners(lexer());
20289 if (settings_.replacer_enabled())
20291 helper_assembly_.run_modifiers(lexer());
20295 settings_.numeric_check_enabled () ||
20296 settings_.bracket_check_enabled () ||
20297 settings_.sequence_check_enabled()
20300 if (!helper_assembly_.run_scanners(lexer()))
20302 if (helper_assembly_.error_token_scanner)
20309 if (0 != (bracket_checker_ptr = dynamic_cast<lexer::helper::bracket_checker*>(helper_assembly_.error_token_scanner)))
20314 "ERR004 - Mismatched brackets: '" + bracket_checker_ptr->
error_token().
value +
"'",
20317 else if (0 != (numeric_checker_ptr = dynamic_cast<lexer::helper::numeric_checker*>(helper_assembly_.error_token_scanner)))
20319 for (std::size_t i = 0; i < numeric_checker_ptr->
error_count(); ++i)
20326 "ERR005 - Invalid numeric token: '" + error_token.
value +
"'",
20335 else if (0 != (sequence_validator_ptr = dynamic_cast<lexer::helper::sequence_validator*>(helper_assembly_.error_token_scanner)))
20337 for (std::size_t i = 0; i < sequence_validator_ptr->
error_count(); ++i)
20339 std::pair<lexer::token,lexer::token> error_token = sequence_validator_ptr->
error(i);
20344 "ERR006 - Invalid token sequence: '" +
20345 error_token.first.value +
"' and '" +
20346 error_token.second.value +
"'",
20355 else if (0 != (sequence_validator3_ptr = dynamic_cast<lexer::helper::sequence_validator_3tokens*>(helper_assembly_.error_token_scanner)))
20357 for (std::size_t i = 0; i < sequence_validator3_ptr->
error_count(); ++i)
20359 std::pair<lexer::token,lexer::token> error_token = sequence_validator3_ptr->
error(i);
20364 "ERR007 - Invalid token sequence: '" +
20365 error_token.first.value +
"' and '" +
20366 error_token.second.value +
"'",
20391 if (index < error_list_.size())
20392 return error_list_[index];
20394 throw std::invalid_argument(
"parser::get_error() - Invalid error index specificed");
20399 if (!error_list_.empty())
20401 return error_list_[0].diagnostic;
20409 return error_list_.size();
20412 inline dependent_entity_collector&
dec()
20419 if (!settings_.replacer_enabled())
20429 if (!settings_.replacer_enabled())
20434 return symbol_replacer_.remove(symbol);
20439 resolve_unknown_symbol_ =
true;
20442 unknown_symbol_resolver_ = usr;
20444 unknown_symbol_resolver_ = &default_usr_;
20449 enable_unknown_symbol_resolver(&usr);
20454 resolve_unknown_symbol_ =
false;
20455 unknown_symbol_resolver_ = &default_usr_;
20462 const std::size_t length = symbol.size();
20470 return settings_.function_enabled(symbol) &&
20471 (base_ops_map_.end() != base_ops_map_.find(symbol));
20498 settings_.function_enabled(symbol);
20503 return settings_.arithmetic_disabled(operation);
20508 return settings_.assignment_disabled(operation);
20513 return settings_.inequality_disabled(operation);
20516 #ifdef exprtk_enable_debugging 20517 inline void next_token()
20519 const std::string ct_str = current_token().value;
20520 parser_helper::next_token();
20521 const std::string depth(2 * state_.scope_depth,
' ');
20523 "prev[%s] --> curr[%s]\n",
20526 current_token().value.c_str()));
20532 std::vector<expression_node_ptr> arg_list;
20533 std::vector<bool> side_effect_list;
20535 scoped_vec_delete<expression_node_t> sdd((*
this),arg_list);
20542 state_.side_effect_present =
false;
20544 begin_token = current_token();
20550 if (error_list_.empty())
20555 "ERR008 - Invalid expression encountered",
20559 return error_node();
20563 arg_list.push_back(arg);
20565 side_effect_list.push_back(state_.side_effect_present);
20567 end_token = current_token();
20569 const std::string sub_expr = construct_subexpr(begin_token, end_token);
20572 static_cast<int>(arg_list.size() - 1),
20573 sub_expr.c_str()));
20575 exprtk_debug((
"parse_corpus(%02d) - Side effect present: %s\n",
20576 static_cast<int>(arg_list.size() - 1),
20577 state_.side_effect_present ?
"true" :
"false"));
20579 exprtk_debug((
"-------------------------------------------------\n"));
20582 if (lexer().finished())
20584 else if (token_is(token_t::e_eof,prsrhlpr_t::e_hold))
20586 if (lexer().finished())
20594 !arg_list.empty() &&
20598 dec_.final_stmt_return_ =
true;
20603 sdd.delete_ptr = (0 == result);
20612 for (std::size_t i = 0; i < result.size(); ++i)
20651 return error_node();
20654 bool break_loop =
false;
20656 state_t current_state;
20660 current_state.reset();
20662 switch (current_token().
type)
20671 case token_t::e_lt : current_state.set(e_level05,e_level06,details:: e_lt);
break;
20672 case token_t::e_lte : current_state.set(e_level05,e_level06,details:: e_lte);
break;
20673 case token_t::e_eq : current_state.set(e_level05,e_level06,details:: e_eq);
break;
20674 case token_t::e_ne : current_state.set(e_level05,e_level06,details:: e_ne);
break;
20675 case token_t::e_gte : current_state.set(e_level05,e_level06,details:: e_gte);
break;
20676 case token_t::e_gt : current_state.set(e_level05,e_level06,details:: e_gt);
break;
20677 case token_t::e_add : current_state.set(e_level07,e_level08,details:: e_add);
break;
20678 case token_t::e_sub : current_state.set(e_level07,e_level08,details:: e_sub);
break;
20679 case token_t::e_div : current_state.set(e_level10,e_level11,details:: e_div);
break;
20680 case token_t::e_mul : current_state.set(e_level10,e_level11,details:: e_mul);
break;
20681 case token_t::e_mod : current_state.set(e_level10,e_level11,details:: e_mod);
break;
20682 case token_t::e_pow : current_state.set(e_level12,e_level12,details:: e_pow);
break;
20683 default :
if (token_t::e_symbol == current_token().
type)
20705 #ifndef exprtk_disable_sc_andor 20724 #ifndef exprtk_disable_sc_andor 20775 else if (current_state.left < precedence)
20785 if (is_invalid_arithmetic_operation(current_state.operation))
20792 "ERR009 - Invalid arithmetic operation '" +
details::to_str(current_state.operation) +
"'",
20795 return error_node();
20797 else if (is_invalid_inequality_operation(current_state.operation))
20804 "ERR010 - Invalid inequality operation '" +
details::to_str(current_state.operation) +
"'",
20807 return error_node();
20809 else if (is_invalid_assignment_operation(current_state.operation))
20816 "ERR011 - Invalid assignment operation '" +
details::to_str(current_state.operation) +
"'",
20819 return error_node();
20822 if (0 != (right_branch = parse_expression(current_state.right)))
20830 free_node(node_allocator_, right_branch);
20835 "ERR012 - Return statements cannot be part of sub-expressions",
20838 return error_node();
20841 new_expression = expression_generator_
20843 current_state.operation,
20849 if (0 == new_expression)
20851 if (error_list_.empty())
20856 !synthesis_error_.empty() ?
20858 "ERR013 - General parsing error at token: '" + prev_token.
value +
"'",
20863 free_node(node_allocator_, right_branch);
20865 return error_node();
20870 token_is(token_t::e_ternary,prsrhlpr_t::e_hold) &&
20871 (precedence == e_level00)
20874 expression = parse_ternary_conditional_statement(new_expression);
20890 ubn_t* n =
dynamic_cast<ubn_t*
>(node);
20906 uvn_t* n =
dynamic_cast<uvn_t*
>(node);
20910 const T& v = n->
v();
20914 (0 != (return_node = symtab_store_.get_variable(v))) ||
20915 (0 != (return_node = sem_ .get_variable(v)))
20919 node = return_node;
20928 "ERR014 - Failed to find variable node in symbol table",
20946 template <
typename Type, std::
size_t N>
20952 : delete_ptr(true),
20958 : delete_ptr(true),
20967 for (std::size_t i = 0; i < N; ++i)
20969 free_node(parser_.node_allocator_,p_[i]);
20983 template <
typename Type>
20989 : delete_ptr(true),
20996 if (delete_ptr && !deq_.empty())
20998 for (std::size_t i = 0; i < deq_.size(); ++i)
21000 free_node(parser_.node_allocator_,deq_[i]);
21016 template <
typename Type>
21022 : delete_ptr(true),
21029 if (delete_ptr && !vec_.empty())
21031 for (std::size_t i = 0; i < vec_.size(); ++i)
21033 free_node(parser_.node_allocator_,vec_[i]);
21065 original_value_(bb)
21070 b = b || original_value_;
21081 switch (function->param_count)
21083 case 0 : func_node = parse_function_call_0 (
function,function_name);
break;
21084 case 1 : func_node = parse_function_call< 1>(
function,function_name);
break;
21085 case 2 : func_node = parse_function_call< 2>(
function,function_name);
break;
21086 case 3 : func_node = parse_function_call< 3>(
function,function_name);
break;
21087 case 4 : func_node = parse_function_call< 4>(
function,function_name);
break;
21088 case 5 : func_node = parse_function_call< 5>(
function,function_name);
break;
21089 case 6 : func_node = parse_function_call< 6>(
function,function_name);
break;
21090 case 7 : func_node = parse_function_call< 7>(
function,function_name);
break;
21091 case 8 : func_node = parse_function_call< 8>(
function,function_name);
break;
21092 case 9 : func_node = parse_function_call< 9>(
function,function_name);
break;
21093 case 10 : func_node = parse_function_call<10>(
function,function_name);
break;
21094 case 11 : func_node = parse_function_call<11>(
function,function_name);
break;
21095 case 12 : func_node = parse_function_call<12>(
function,function_name);
break;
21096 case 13 : func_node = parse_function_call<13>(
function,function_name);
break;
21097 case 14 : func_node = parse_function_call<14>(
function,function_name);
break;
21098 case 15 : func_node = parse_function_call<15>(
function,function_name);
break;
21099 case 16 : func_node = parse_function_call<16>(
function,function_name);
break;
21100 case 17 : func_node = parse_function_call<17>(
function,function_name);
break;
21101 case 18 : func_node = parse_function_call<18>(
function,function_name);
break;
21102 case 19 : func_node = parse_function_call<19>(
function,function_name);
break;
21103 case 20 : func_node = parse_function_call<20>(
function,function_name);
break;
21108 "ERR015 - Invalid number of parameters for function: '" + function_name +
"'",
21111 return error_node();
21122 "ERR016 - Failed to generate call to function: '" + function_name +
"'",
21125 return error_node();
21129 template <std::
size_t NumberofParameters>
21133 #pragma warning(push) 21134 #pragma warning(disable: 4127) 21136 if (0 == NumberofParameters)
21141 "ERR017 - Expecting ifunction '" + function_name +
"' to have non-zero parameter count",
21144 return error_node();
21147 #pragma warning(pop) 21153 std::fill_n(branch, NumberofParameters, reinterpret_cast<expression_node_ptr>(0));
21155 scoped_delete<expression_node_t,NumberofParameters> sd((*
this),branch);
21159 if (!token_is(token_t::e_lbracket))
21164 "ERR018 - Expecting argument list for function: '" + function_name +
"'",
21167 return error_node();
21170 for (
int i = 0; i < static_cast<int>(NumberofParameters); ++i)
21172 branch[i] = parse_expression();
21174 if (0 == branch[i])
21179 "ERR019 - Failed to parse argument " +
details::to_str(i) +
" for function: '" + function_name +
"'",
21182 return error_node();
21184 else if (i < static_cast<int>(NumberofParameters - 1))
21186 if (!token_is(token_t::e_comma))
21191 "ERR020 - Invalid number of arguments for function: '" + function_name +
"'",
21194 return error_node();
21199 if (!token_is(token_t::e_rbracket))
21204 "ERR021 - Invalid number of arguments for function: '" + function_name +
"'",
21207 return error_node();
21210 result = expression_generator_.function(
function,branch);
21212 sd.delete_ptr =
false;
21221 state_.side_effect_present =
function->has_side_effects();
21226 token_is(token_t::e_lbracket) &&
21227 !token_is(token_t::e_rbracket)
21233 "ERR022 - Expecting '()' to proceed call to function: '" + function_name +
"'",
21238 return error_node();
21244 template <std::
size_t MaxNumberofParameters>
21247 std::fill_n(param_list, MaxNumberofParameters, reinterpret_cast<expression_node_ptr>(0));
21249 scoped_delete<expression_node_t,MaxNumberofParameters> sd((*
this),param_list);
21253 if (!token_is(token_t::e_lbracket))
21258 "ERR023 - Expected a '(' at start of function call to '" + function_name +
21259 "', instead got: '" + current_token().
value +
"'",
21265 if (token_is(token_t::e_rbracket, e_hold))
21270 "ERR024 - Expected at least one input parameter for function call '" + function_name +
"'",
21276 std::size_t param_index = 0;
21278 for (; param_index < MaxNumberofParameters; ++param_index)
21280 param_list[param_index] = parse_expression();
21282 if (0 == param_list[param_index])
21284 else if (token_is(token_t::e_rbracket))
21286 sd.delete_ptr =
false;
21289 else if (token_is(token_t::e_comma))
21296 "ERR025 - Expected a ',' between function input parameters, instead got: '" + current_token().
value +
"'",
21308 "ERR026 - Invalid number of input parameters passed to function '" + function_name +
"'",
21314 return (param_index + 1);
21319 typedef std::pair<base_ops_map_t::iterator,base_ops_map_t::iterator> map_range_t;
21321 const std::string operation_name = current_token().value;
21322 const token_t diagnostic_token = current_token();
21324 map_range_t itr_range = base_ops_map_.equal_range(operation_name);
21326 if (0 == std::distance(itr_range.first,itr_range.second))
21331 "ERR027 - No entry found for base operation: " + operation_name,
21334 return error_node();
21337 static const std::size_t MaxNumberofParameters = 4;
21340 const std::size_t parameter_count = parse_base_function_call(param_list, operation_name);
21342 if ((parameter_count > 0) && (parameter_count <= MaxNumberofParameters))
21344 for (base_ops_map_t::iterator itr = itr_range.first; itr != itr_range.second; ++itr)
21348 if (operation.
num_params == parameter_count)
21350 switch (parameter_count)
21352 #define base_opr_case(N) \ 21354 expression_node_ptr pl##N[N] = {0}; \ 21355 std::copy(param_list, param_list + N, pl##N); \ 21356 lodge_symbol(operation_name, e_st_function); \ 21357 return expression_generator_(operation.type, pl##N); \ 21364 #undef base_opr_case 21370 for (std::size_t i = 0; i < MaxNumberofParameters; ++i)
21372 free_node(node_allocator_, param_list[i]);
21378 "ERR028 - Invalid number of input parameters for call to function: '" + operation_name +
"'",
21381 return error_node();
21391 bool result =
true;
21393 if (!token_is(token_t::e_comma))
21398 "ERR029 - Expected ',' between if-statement condition and consequent",
21402 else if (0 == (consequent = parse_expression()))
21407 "ERR030 - Failed to parse consequent for if-statement",
21411 else if (!token_is(token_t::e_comma))
21416 "ERR031 - Expected ',' between if-statement consequent and alternative",
21420 else if (0 == (alternative = parse_expression()))
21425 "ERR032 - Failed to parse alternative for if-statement",
21429 else if (!token_is(token_t::e_rbracket))
21434 "ERR033 - Expected ')' at the end of if-statement",
21439 #ifndef exprtk_disable_string_capabilities 21445 if (consq_is_str || alter_is_str)
21447 if (consq_is_str && alter_is_str)
21449 return expression_generator_
21450 .conditional_string(condition,consequent,alternative);
21456 "ERR034 - Return types of ternary if-statement differ",
21467 free_node(node_allocator_, consequent);
21468 free_node(node_allocator_,alternative);
21470 return error_node();
21473 return expression_generator_
21474 .conditional(condition,consequent,alternative);
21482 bool result =
true;
21484 if (token_is(token_t::e_lcrlbracket,prsrhlpr_t::e_hold))
21486 if (0 == (consequent = parse_multi_sequence(
"if-statement-01")))
21491 "ERR035 - Failed to parse body of consequent for if-statement",
21500 settings_.commutative_check_enabled() &&
21507 if (0 != (consequent = parse_expression()))
21509 if (!token_is(token_t::e_eof))
21514 "ERR036 - Expected ';' at the end of the consequent for if-statement",
21525 "ERR037 - Failed to parse body of consequent for if-statement",
21538 if (token_is(token_t::e_lcrlbracket,prsrhlpr_t::e_hold))
21540 if (0 == (alternative = parse_multi_sequence(
"else-statement-01")))
21545 "ERR038 - Failed to parse body of the 'else' for if-statement",
21553 if (0 == (alternative = parse_conditional_statement()))
21558 "ERR039 - Failed to parse body of if-else statement",
21564 else if (0 != (alternative = parse_expression()))
21566 if (!token_is(token_t::e_eof))
21571 "ERR040 - Expected ';' at the end of the 'else-if' for the if-statement",
21582 "ERR041 - Failed to parse body of the 'else' for if-statement",
21590 #ifndef exprtk_disable_string_capabilities 21596 if (consq_is_str || alter_is_str)
21598 if (consq_is_str && alter_is_str)
21600 return expression_generator_
21601 .conditional_string(condition, consequent, alternative);
21607 "ERR042 - Return types of ternary if-statement differ",
21618 free_node(node_allocator_, consequent);
21619 free_node(node_allocator_, alternative);
21621 return error_node();
21624 return expression_generator_
21625 .conditional(condition, consequent, alternative);
21634 if (!token_is(token_t::e_lbracket))
21639 "ERR043 - Expected '(' at start of if-statement, instead got: '" + current_token().
value +
"'",
21642 return error_node();
21644 else if (0 == (condition = parse_expression()))
21649 "ERR044 - Failed to parse condition for if-statement",
21652 return error_node();
21654 else if (token_is(token_t::e_comma,prsrhlpr_t::e_hold))
21657 return parse_conditional_statement_01(condition);
21659 else if (token_is(token_t::e_rbracket))
21675 return parse_conditional_statement_02(condition);
21681 "ERR045 - Invalid if-statement",
21686 return error_node();
21695 bool result =
true;
21697 if (0 == condition)
21702 "ERR046 - Encountered invalid condition branch for ternary if-statement",
21705 return error_node();
21707 else if (!token_is(token_t::e_ternary))
21712 "ERR047 - Expected '?' after condition of ternary if-statement",
21717 else if (0 == (consequent = parse_expression()))
21722 "ERR048 - Failed to parse consequent for ternary if-statement",
21727 else if (!token_is(token_t::e_colon))
21732 "ERR049 - Expected ':' between ternary if-statement consequent and alternative",
21737 else if (0 == (alternative = parse_expression()))
21742 "ERR050 - Failed to parse alternative for ternary if-statement",
21748 #ifndef exprtk_disable_string_capabilities 21754 if (consq_is_str || alter_is_str)
21756 if (consq_is_str && alter_is_str)
21758 return expression_generator_
21759 .conditional_string(condition, consequent, alternative);
21765 "ERR051 - Return types of ternary if-statement differ",
21776 free_node(node_allocator_, consequent);
21777 free_node(node_allocator_, alternative);
21779 return error_node();
21782 return expression_generator_
21783 .conditional(condition, consequent, alternative);
21793 bool result =
true;
21797 if (!token_is(token_t::e_lbracket))
21802 "ERR052 - Expected '(' at start of while-loop condition statement",
21805 return error_node();
21807 else if (0 == (condition = parse_expression()))
21812 "ERR053 - Failed to parse condition for while-loop",
21815 return error_node();
21817 else if (!token_is(token_t::e_rbracket))
21822 "ERR054 - Expected ')' at end of while-loop condition statement",
21828 brkcnt_list_.push_front(
false);
21832 if (0 == (branch = parse_multi_sequence(
"while-loop")))
21837 "ERR055 - Failed to parse body of while-loop"));
21840 else if (0 == (result_node = expression_generator_.while_loop(condition,
21842 brkcnt_list_.front())))
21847 "ERR056 - Failed to synthesize while-loop",
21858 free_node(node_allocator_, result_node);
21860 brkcnt_list_.pop_front();
21862 return error_node();
21865 return result_node;
21875 std::vector<expression_node_ptr> arg_list;
21876 std::vector<bool> side_effect_list;
21878 scoped_vec_delete<expression_node_t> sdd((*
this),arg_list);
21880 brkcnt_list_.push_front(
false);
21891 scope_handler sh(*
this);
21893 scoped_bool_or_restorer sbr(state_.side_effect_present);
21897 state_.side_effect_present =
false;
21902 return error_node();
21905 arg_list.push_back(arg);
21906 side_effect_list.push_back(state_.side_effect_present);
21915 const bool is_next_until = peek_token_is(token_t::e_symbol) &&
21916 peek_token_is(
"until");
21918 if (!token_is(seperator) && is_next_until)
21923 "ERR057 - Expected '" +
token_t::to_str(seperator) +
"' in body of repeat until loop",
21926 return error_node();
21936 branch = simplify(arg_list,side_effect_list);
21938 sdd.delete_ptr = (0 == branch);
21940 if (sdd.delete_ptr)
21942 brkcnt_list_.pop_front();
21947 "ERR058 - Failed to parse body of repeat until loop",
21950 return error_node();
21954 if (!token_is(token_t::e_lbracket))
21956 brkcnt_list_.pop_front();
21961 "ERR059 - Expected '(' before condition statement of repeat until loop",
21966 return error_node();
21968 else if (0 == (condition = parse_expression()))
21970 brkcnt_list_.pop_front();
21975 "ERR060 - Failed to parse condition for repeat until loop",
21980 return error_node();
21982 else if (!token_is(token_t::e_rbracket))
21987 "ERR061 - Expected ')' after condition of repeat until loop",
21993 brkcnt_list_.pop_front();
21995 return error_node();
22000 result = expression_generator_
22001 .repeat_until_loop(condition, branch, brkcnt_list_.front());
22008 "ERR062 - Failed to synthesize repeat until loop",
22013 brkcnt_list_.pop_front();
22015 return error_node();
22019 brkcnt_list_.pop_front();
22031 scope_element* se = 0;
22032 bool result =
true;
22036 scope_handler sh(*
this);
22038 if (!token_is(token_t::e_lbracket))
22043 "ERR063 - Expected '(' at start of for-loop",
22046 return error_node();
22049 if (!token_is(token_t::e_eof))
22052 !token_is(token_t::e_symbol,prsrhlpr_t::e_hold) &&
22058 if (!token_is(token_t::e_symbol,prsrhlpr_t::e_hold))
22063 "ERR064 - Expected a variable at the start of initialiser section of for-loop",
22066 return error_node();
22073 "ERR065 - Expected variable assignment of initialiser section of for-loop",
22076 return error_node();
22079 const std::string loop_counter_symbol = current_token().value;
22081 se = &sem_.get_element(loop_counter_symbol);
22083 if ((se->name == loop_counter_symbol) && se->active)
22088 "ERR066 - For-loop variable '" + loop_counter_symbol+
"' is being shadowed by a previous declaration",
22091 return error_node();
22093 else if (!symtab_store_.is_variable(loop_counter_symbol))
22097 (se->name == loop_counter_symbol) &&
22098 (se->type == scope_element::e_variable)
22107 nse.name = loop_counter_symbol;
22110 nse.type = scope_element::e_variable;
22111 nse.depth = state_.scope_depth;
22112 nse.data =
new T(T(0));
22113 nse.var_node = node_allocator_.allocate<
variable_node_t>(*(T*)(nse.data));
22115 if (!sem_.add_element(nse))
22120 "ERR067 - Failed to add new local variable '" + loop_counter_symbol +
"' to SEM",
22123 sem_.free_element(nse);
22129 exprtk_debug((
"parse_for_loop() - INFO - Added new local variable: %s\n",nse.name.c_str()));
22131 state_.activate_side_effect(
"parse_for_loop()");
22137 if (0 == (initialiser = parse_expression()))
22142 "ERR068 - Failed to parse initialiser of for-loop",
22147 else if (!token_is(token_t::e_eof))
22152 "ERR069 - Expected ';' after initialiser of for-loop",
22159 if (!token_is(token_t::e_eof))
22161 if (0 == (condition = parse_expression()))
22166 "ERR070 - Failed to parse condition of for-loop",
22171 else if (!token_is(token_t::e_eof))
22176 "ERR071 - Expected ';' after condition section of for-loop",
22183 if (!token_is(token_t::e_rbracket))
22185 if (0 == (incrementor = parse_expression()))
22190 "ERR072 - Failed to parse incrementor of for-loop",
22195 else if (!token_is(token_t::e_rbracket))
22200 "ERR073 - Expected ')' after incrementor section of for-loop",
22209 brkcnt_list_.push_front(
false);
22211 if (0 == (loop_body = parse_multi_sequence(
"for-loop")))
22216 "ERR074 - Failed to parse body of for-loop",
22230 free_node(node_allocator_, initialiser);
22232 free_node(node_allocator_, incrementor);
22235 if (!brkcnt_list_.empty())
22237 brkcnt_list_.pop_front();
22240 return error_node();
22245 expression_generator_.for_loop(initialiser,
22249 brkcnt_list_.front());
22250 brkcnt_list_.pop_front();
22252 return result_node;
22258 std::vector<expression_node_ptr> arg_list;
22266 "ERR075 - Expected keyword 'switch'",
22269 return error_node();
22272 scoped_vec_delete<expression_node_t> svd((*
this),arg_list);
22276 if (!token_is(token_t::e_lcrlbracket))
22281 "ERR076 - Expected '{' for call to switch statement",
22284 return error_node();
22294 "ERR077 - Expected either a 'case' or 'default' statement",
22297 return error_node();
22304 if (0 == condition)
22305 return error_node();
22306 else if (!token_is(token_t::e_colon))
22311 "ERR078 - Expected ':' for case of switch statement",
22314 return error_node();
22319 if (0 == consequent)
22320 return error_node();
22321 else if (!token_is(token_t::e_eof))
22326 "ERR079 - Expected ';' at end of case for switch statement",
22329 return error_node();
22336 free_node(node_allocator_, consequent);
22340 arg_list.push_back( condition);
22341 arg_list.push_back(consequent);
22347 if (!token_is(token_t::e_colon))
22352 "ERR080 - Expected ':' for default of switch statement",
22355 return error_node();
22360 if (token_is(token_t::e_lcrlbracket,prsrhlpr_t::e_hold))
22361 default_statement = parse_multi_sequence(
"switch-default");
22363 default_statement = parse_expression();
22365 if (0 == default_statement)
22366 return error_node();
22367 else if (!token_is(token_t::e_eof))
22369 free_node(node_allocator_,default_statement);
22374 "ERR081 - Expected ';' at end of default for switch statement",
22377 return error_node();
22380 arg_list.push_back(default_statement);
22385 if (!token_is(token_t::e_rcrlbracket))
22390 "ERR082 - Expected '}' at end of switch statement",
22393 return error_node();
22396 result = expression_generator_.switch_statement(arg_list);
22398 svd.delete_ptr = (0 == result);
22405 std::vector<expression_node_ptr> arg_list;
22412 "ERR083 - Expected token '[*]'",
22415 return error_node();
22418 scoped_vec_delete<expression_node_t> svd((*
this),arg_list);
22422 if (!token_is(token_t::e_lcrlbracket))
22427 "ERR084 - Expected '{' for call to [*] statement",
22430 return error_node();
22440 "ERR085 - Expected a 'case' statement for multi-switch",
22443 return error_node();
22450 if (0 == condition)
22451 return error_node();
22453 if (!token_is(token_t::e_colon))
22458 "ERR086 - Expected ':' for case of [*] statement",
22461 return error_node();
22466 if (0 == consequent)
22467 return error_node();
22469 if (!token_is(token_t::e_eof))
22474 "ERR087 - Expected ';' at end of case for [*] statement",
22477 return error_node();
22484 free_node(node_allocator_, consequent);
22488 arg_list.push_back( condition);
22489 arg_list.push_back(consequent);
22492 if (token_is(token_t::e_rcrlbracket,prsrhlpr_t::e_hold))
22498 if (!token_is(token_t::e_rcrlbracket))
22503 "ERR088 - Expected '}' at end of [*] statement",
22506 return error_node();
22509 const expression_node_ptr result = expression_generator_.multi_switch_statement(arg_list);
22511 svd.delete_ptr = (0 == result);
22518 std::vector<expression_node_ptr> arg_list;
22521 const std::string symbol = current_token().value;
22526 return parse_multi_sequence();
22530 return parse_multi_switch_statement();
22544 "ERR089 - Unsupported vararg function: " + symbol,
22547 return error_node();
22550 scoped_vec_delete<expression_node_t> sdd((*
this),arg_list);
22552 lodge_symbol(symbol, e_st_function);
22556 if (!token_is(token_t::e_lbracket))
22561 "ERR090 - Expected '(' for call to vararg function: " + symbol,
22564 return error_node();
22572 return error_node();
22574 arg_list.push_back(arg);
22576 if (token_is(token_t::e_rbracket))
22578 else if (!token_is(token_t::e_comma))
22583 "ERR091 - Expected ',' for call to vararg function: " + symbol,
22586 return error_node();
22590 const expression_node_ptr result = expression_generator_.vararg_function(opt_type,arg_list);
22592 sdd.delete_ptr = (0 == result);
22596 #ifndef exprtk_disable_string_capabilities 22599 if (!token_is(token_t::e_lsqrbracket))
22604 "ERR092 - Expected '[' as start of string range definition",
22609 return error_node();
22611 else if (token_is(token_t::e_rsqrbracket))
22618 if (!parse_range(rp,
true))
22622 return error_node();
22632 "ERR093 - Failed to generate string range node",
22643 inline expression_node_ptr parse_string_range_statement(expression_node_ptr&)
22645 return error_node();
22652 const std::size_t max_rangesize_parses = 100;
22659 (i++ < max_rangesize_parses) &&
22660 error_list_.empty() &&
22662 token_is(token_t::e_lsqrbracket,prsrhlpr_t::e_hold)
22669 template <
typename Allocator1,
22670 typename Allocator2,
22671 template <
typename,
typename>
class Sequence>
22673 Sequence<bool,Allocator2>& side_effect_list,
22674 const bool specialise_on_final_type =
false)
22676 if (expression_list.empty())
22677 return error_node();
22678 else if (1 == expression_list.size())
22679 return expression_list[0];
22681 Sequence<expression_node_ptr,Allocator1> tmp_expression_list;
22683 bool return_node_present =
false;
22685 for (std::size_t i = 0; i < (expression_list.size() - 1); ++i)
22695 tmp_expression_list.push_back(expression_list[i]);
22700 for (std::size_t j = i + 1; j < expression_list.size(); ++j)
22702 free_node(node_allocator_,expression_list[j]);
22705 return_node_present =
true;
22712 !side_effect_list[i]
22715 free_node(node_allocator_,expression_list[i]);
22719 tmp_expression_list.push_back(expression_list[i]);
22722 if (!return_node_present)
22724 tmp_expression_list.push_back(expression_list.back());
22727 expression_list.swap(tmp_expression_list);
22729 if (tmp_expression_list.size() > expression_list.size())
22731 exprtk_debug((
"simplify() - Reduced subexpressions from %d to %d\n",
22732 static_cast<int>(tmp_expression_list.size()),
22733 static_cast<int>(expression_list .size())));
22737 return_node_present ||
22738 side_effect_list.back() ||
22739 (expression_list.size() > 1)
22741 state_.activate_side_effect(
"simplify()");
22743 if (1 == expression_list.size())
22744 return expression_list[0];
22746 return expression_generator_.vararg_function(
details::e_smulti,expression_list);
22748 return expression_generator_.vararg_function(
details::e_multi,expression_list);
22756 if (!token_is(token_t::e_lcrlbracket))
22758 if (token_is(token_t::e_lbracket))
22760 close_bracket = token_t::e_rbracket;
22761 seperator = token_t::e_comma;
22768 "ERR094 - Expected '" +
token_t::to_str(close_bracket) +
"' for call to multi-sequence" +
22769 ((!source.empty()) ?
std::string(
" section of " + source):
""),
22772 return error_node();
22775 else if (token_is(token_t::e_rcrlbracket))
22780 std::vector<expression_node_ptr> arg_list;
22781 std::vector<bool> side_effect_list;
22785 scoped_vec_delete<expression_node_t> sdd((*
this),arg_list);
22787 scope_handler sh(*
this);
22789 scoped_bool_or_restorer sbr(state_.side_effect_present);
22793 state_.side_effect_present =
false;
22798 return error_node();
22801 arg_list.push_back(arg);
22802 side_effect_list.push_back(state_.side_effect_present);
22805 if (token_is(close_bracket))
22808 const bool is_next_close = peek_token_is(close_bracket);
22810 if (!token_is(seperator) && is_next_close)
22815 "ERR095 - Expected '" +
details::to_str(seperator) +
"' for call to multi-sequence section of " + source,
22818 return error_node();
22821 if (token_is(close_bracket))
22825 result = simplify(arg_list,side_effect_list,source.empty());
22827 sdd.delete_ptr = (0 == result);
22844 if (!skip_lsqr && !token_is(token_t::e_lsqrbracket))
22849 "ERR096 - Expected '[' for start of range",
22855 if (token_is(token_t::e_colon))
22857 rp.
n0_c.first =
true;
22858 rp.
n0_c.second = 0;
22859 rp.
cache.first = 0;
22870 "ERR097 - Failed parse begin section of range",
22877 const T r0_value = r0->
value();
22879 if (r0_value >= T(0))
22881 rp.
n0_c.first =
true;
22888 if (r0_value < T(0))
22893 "ERR098 - Range lower bound less than zero! Constraint: r0 >= 0",
22901 rp.
n0_e.first =
true;
22902 rp.
n0_e.second = r0;
22905 if (!token_is(token_t::e_colon))
22910 "ERR099 - Expected ':' for break in range",
22919 if (token_is(token_t::e_rsqrbracket))
22921 rp.
n1_c.first =
true;
22933 "ERR100 - Failed parse end section of range",
22942 const T r1_value = r1->
value();
22944 if (r1_value >= T(0))
22946 rp.
n1_c.first =
true;
22953 if (r1_value < T(0))
22958 "ERR101 - Range upper bound less than zero! Constraint: r1 >= 0",
22966 rp.
n1_e.first =
true;
22967 rp.
n1_e.second = r1;
22970 if (!token_is(token_t::e_rsqrbracket))
22975 "ERR102 - Expected ']' for start of range",
22986 std::size_t r0 = 0;
22987 std::size_t r1 = 0;
22989 const bool rp_result = rp(r0,r1);
22991 if (!rp_result || (r0 > r1))
22996 "ERR103 - Invalid range, Constraint: r0 <= r1",
23009 dec_.add_symbol(symbol,st);
23012 #ifndef exprtk_disable_string_capabilities 23015 const std::string symbol = current_token().value;
23020 strvar_node_t const_str_node =
static_cast<strvar_node_t
>(0);
23022 scope_element& se = sem_.get_active_element(symbol);
23024 if (scope_element::e_string == se.type)
23027 result = se.str_node;
23028 lodge_symbol(symbol, e_st_local_string);
23032 if (!symtab_store_.is_conststr_stringvar(symbol))
23037 "ERR104 - Unknown string symbol",
23040 return error_node();
23043 result = symtab_store_.get_stringvar(symbol);
23045 if (symtab_store_.is_constant_string(symbol))
23047 const_str_node =
static_cast<strvar_node_t
>(result);
23048 result = expression_generator_(const_str_node->str());
23051 lodge_symbol(symbol, e_st_string);
23054 if (peek_token_is(token_t::e_lsqrbracket))
23058 if (peek_token_is(token_t::e_rsqrbracket))
23063 if (const_str_node)
23067 return expression_generator_(T(const_str_node->size()));
23076 if (!parse_range(rp))
23080 return error_node();
23082 else if (const_str_node)
23085 result = expression_generator_(const_str_node->ref(),rp);
23089 (result)->ref(), rp);
23100 inline expression_node_ptr parse_string()
23102 return error_node();
23106 #ifndef exprtk_disable_string_capabilities 23109 const std::string const_str = current_token().value;
23112 if (peek_token_is(token_t::e_lsqrbracket))
23116 if (peek_token_is(token_t::e_rsqrbracket))
23123 return expression_generator_(T(const_str.size()));
23128 if (!parse_range(rp))
23132 return error_node();
23139 rp.
n1_c.second = const_str.size() - 1;
23144 (rp.
n0_c.first && (rp.
n0_c.second >= const_str.size())) ||
23145 (rp.
n1_c.first && (rp.
n1_c.second >= const_str.size()))
23151 "ERR105 - Overflow in range for string: '" + const_str +
"'[" +
23156 return error_node();
23159 result = expression_generator_(const_str,rp);
23170 inline expression_node_ptr parse_const_string()
23172 return error_node();
23178 const std::string symbol = current_token().value;
23182 const scope_element& se = sem_.get_active_element(symbol);
23186 (se.depth > state_.scope_depth) ||
23187 (scope_element::e_vector != se.type)
23190 if (0 == (vec = symtab_store_.get_vector(symbol)))
23195 "ERR106 - Symbol '" + symbol+
" not a vector",
23198 return error_node();
23208 if (!token_is(token_t::e_lsqrbracket))
23212 else if (token_is(token_t::e_rsqrbracket))
23214 return expression_generator_(T(vec->
size()));
23216 else if (0 == (index_expr = parse_expression()))
23221 "ERR107 - Failed to parse index for vector: '" + symbol +
"'",
23224 return error_node();
23226 else if (!token_is(token_t::e_rsqrbracket))
23231 "ERR108 - Expected ']' for index of vector: '" + symbol +
"'",
23236 return error_node();
23243 const std::size_t vec_size = vec->
size();
23245 if (index >= vec_size)
23256 return error_node();
23260 return expression_generator_.vector_element(symbol,vec,index_expr);
23265 std::vector<expression_node_ptr> arg_list;
23269 scoped_vec_delete<expression_node_t> sdd((*
this),arg_list);
23273 if (token_is(token_t::e_lbracket))
23275 if (token_is(token_t::e_rbracket))
23282 "ERR110 - Zero parameter call to vararg function: " 23283 + vararg_function_name +
" not allowed",
23286 return error_node();
23296 return error_node();
23298 arg_list.push_back(arg);
23300 if (token_is(token_t::e_rbracket))
23302 else if (!token_is(token_t::e_comma))
23307 "ERR111 - Expected ',' for call to vararg function: " 23308 + vararg_function_name,
23311 return error_node();
23321 "ERR112 - Zero parameter call to vararg function: " 23322 + vararg_function_name +
" not allowed",
23325 return error_node();
23328 if (arg_list.size() < vararg_function->
min_num_args())
23333 "ERR113 - Invalid number of parameters to call to vararg function: " 23334 + vararg_function_name +
", require at least " 23338 return error_node();
23340 else if (arg_list.size() > vararg_function->
max_num_args())
23345 "ERR114 - Invalid number of parameters to call to vararg function: " 23346 + vararg_function_name +
", require no more than " 23350 return error_node();
23353 result = expression_generator_.vararg_function_call(vararg_function,arg_list);
23355 sdd.delete_ptr = (0 == result);
23384 : invalid_state_(true),
23386 function_name_(func_name),
23387 default_return_type_(default_return_type)
23389 parse_function_prototypes(func_prototypes);
23399 if (function_definition_list_.empty())
23402 std::vector<std::pair<std::size_t,char> > error_list;
23404 for (std::size_t i = 0; i < function_definition_list_.size(); ++i)
23407 std::size_t diff_index = 0;
23411 diff_index, diff_value);
23419 error_list.push_back(std::make_pair(diff_index, diff_value));
23422 if (1 == error_list.size())
23427 parser_.current_token(),
23428 "ERR115 - Failed parameter type check for function '" + function_name_ +
"', " 23429 "Expected '" + function_definition_list_[0].param_seq +
23430 "' call set: '" + param_seq +
"'",
23436 std::size_t max_diff_index = 0;
23438 for (std::size_t i = 1; i < error_list.size(); ++i)
23440 if (error_list[i].first > error_list[max_diff_index].first)
23442 max_diff_index = i;
23449 parser_.current_token(),
23450 "ERR116 - Failed parameter type check for function '" + function_name_ +
"', " 23451 "Best match: '" + function_definition_list_[max_diff_index].param_seq +
23452 "' call set: '" + param_seq +
"'",
23461 return function_definition_list_.size();
23466 return function_definition_list_[index].param_seq;
23471 return function_definition_list_[index].return_type;
23476 return !invalid_state_;
23482 for (std::size_t i = 0; i < function_definition_list_.size(); ++i)
23484 if (std::string::npos != function_definition_list_[i].param_seq.find(
"Z"))
23497 std::string::const_iterator current_begin = param_seq.begin();
23498 std::string::const_iterator iter = param_seq.begin();
23500 std::vector<std::string> result;
23502 while (iter != param_seq.end())
23504 if (*iter == delimiter)
23506 result.push_back(
std::string(current_begin, iter));
23508 current_begin = iter;
23514 if (current_begin != iter)
23516 result.push_back(
std::string(current_begin, iter));
23528 if (param_seq.size() > 2)
23530 if (
':' == param_seq[1])
23534 if (type_checker::e_overload != default_return_type_)
23537 switch (param_seq[0])
23542 case 'S' : funcproto.
return_type = type_checker::e_string;
23545 default :
return false;
23548 param_seq.erase(0,2);
23553 (std::string::npos != param_seq.find(
"?*")) ||
23554 (std::string::npos != param_seq.find(
"**"))
23560 (std::string::npos == param_seq.find_first_not_of(
"STV*?|")) ||
23573 if (func_prototypes.empty())
23576 std::vector<std::string> param_seq_list = split_param_seq(func_prototypes);
23578 typedef std::map<std::string,std::size_t> param_seq_map_t;
23579 param_seq_map_t param_seq_map;
23581 for (std::size_t i = 0; i < param_seq_list.size(); ++i)
23585 if (!is_valid_token(param_seq_list[i], func_proto))
23587 invalid_state_ =
false;
23592 parser_.current_token(),
23593 "ERR117 - Invalid parameter sequence of '" + param_seq_list[i] +
23594 "' for function: " + function_name_,
23599 param_seq_map_t::const_iterator seq_itr = param_seq_map.find(param_seq_list[i]);
23601 if (param_seq_map.end() != seq_itr)
23603 invalid_state_ =
false;
23608 parser_.current_token(),
23609 "ERR118 - Function '" + function_name_ +
"' has a parameter sequence conflict between " +
23612 "param seq: " + param_seq_list[i],
23617 function_definition_list_.push_back(func_proto);
23633 std::vector<expression_node_ptr> arg_list;
23635 scoped_vec_delete<expression_node_t> sdd((*
this),arg_list);
23641 type_checker tc((*
this), function_name, function->parameter_sequence, type_checker::e_string);
23648 "ERR119 - Type checker instantiation failure for generic function: " + function_name,
23651 return error_node();
23654 if (token_is(token_t::e_lbracket))
23656 if (token_is(token_t::e_rbracket))
23659 !function->allow_zero_parameters() &&
23660 !tc .allow_zero_parameters()
23666 "ERR120 - Zero parameter call to generic function: " 23667 + function_name +
" not allowed",
23670 return error_node();
23680 return error_node();
23683 param_type_list +=
'V';
23685 param_type_list +=
'S';
23687 param_type_list +=
'T';
23689 arg_list.push_back(arg);
23691 if (token_is(token_t::e_rbracket))
23693 else if (!token_is(token_t::e_comma))
23698 "ERR121 - Expected ',' for call to generic function: " + function_name,
23701 return error_node();
23707 !function->parameter_sequence.empty() &&
23708 function->allow_zero_parameters () &&
23709 !tc .allow_zero_parameters ()
23715 "ERR122 - Zero parameter call to generic function: " 23716 + function_name +
" not allowed",
23719 return error_node();
23722 std::size_t param_seq_index = 0;
23725 state_.type_check_enabled &&
23726 !tc.verify(param_type_list, param_seq_index)
23732 "ERR123 - Invalid input parameter sequence for call to generic function: " + function_name,
23735 return error_node();
23740 if (tc.paramseq_count() <= 1)
23741 result = expression_generator_
23742 .generic_function_call(
function, arg_list);
23744 result = expression_generator_
23745 .generic_function_call(
function, arg_list, param_seq_index);
23747 sdd.delete_ptr = (0 == result);
23753 std::vector<expression_node_ptr>& arg_list,
23756 const type_checker& tc)
23758 if (token_is(token_t::e_lbracket))
23760 if (token_is(token_t::e_rbracket))
23763 !function->allow_zero_parameters() &&
23764 !tc .allow_zero_parameters()
23770 "ERR124 - Zero parameter call to generic function: " 23771 + function_name +
" not allowed",
23787 param_type_list +=
'V';
23789 param_type_list +=
'S';
23791 param_type_list +=
'T';
23793 arg_list.push_back(arg);
23795 if (token_is(token_t::e_rbracket))
23797 else if (!token_is(token_t::e_comma))
23802 "ERR125 - Expected ',' for call to string function: " + function_name,
23816 #ifndef exprtk_disable_string_capabilities 23824 type_checker tc((*
this), function_name, function->parameter_sequence, type_checker::e_string);
23827 (!function->parameter_sequence.empty()) &&
23828 (0 == tc.paramseq_count())
23831 return error_node();
23834 std::vector<expression_node_ptr> arg_list;
23835 scoped_vec_delete<expression_node_t> sdd((*
this),arg_list);
23837 if (!parse_igeneric_function_params(param_type_list, arg_list, function_name,
function, tc))
23839 return error_node();
23842 std::size_t param_seq_index = 0;
23844 if (!tc.verify(param_type_list, param_seq_index))
23849 "ERR126 - Invalid input parameter sequence for call to string function: " + function_name,
23852 return error_node();
23857 if (tc.paramseq_count() <= 1)
23858 result = expression_generator_
23859 .string_function_call(
function, arg_list);
23861 result = expression_generator_
23862 .string_function_call(
function, arg_list, param_seq_index);
23864 sdd.delete_ptr = (0 == result);
23876 type_checker tc((*
this), function_name, function->parameter_sequence, type_checker::e_overload);
23879 (!function->parameter_sequence.empty()) &&
23880 (0 == tc.paramseq_count())
23883 return error_node();
23886 std::vector<expression_node_ptr> arg_list;
23887 scoped_vec_delete<expression_node_t> sdd((*
this),arg_list);
23889 if (!parse_igeneric_function_params(param_type_list, arg_list, function_name,
function, tc))
23891 return error_node();
23894 std::size_t param_seq_index = 0;
23896 if (!tc.verify(param_type_list, param_seq_index))
23901 "ERR127 - Invalid input parameter sequence for call to overloaded function: " + function_name,
23904 return error_node();
23911 if (tc.paramseq_count() <= 1)
23912 result = expression_generator_
23913 .generic_function_call(
function, arg_list);
23915 result = expression_generator_
23916 .generic_function_call(
function, arg_list, param_seq_index);
23918 else if (type_checker::e_string == tc.return_type(param_seq_index))
23920 if (tc.paramseq_count() <= 1)
23921 result = expression_generator_
23922 .string_function_call(
function, arg_list);
23924 result = expression_generator_
23925 .string_function_call(
function, arg_list, param_seq_index);
23932 "ERR128 - Invalid return type for call to overloaded function: " + function_name,
23936 sdd.delete_ptr = (0 == result);
23941 template <
typename Type, std::
size_t NumberOfParameters>
23949 std::fill_n(branch,NumberOfParameters,reinterpret_cast<expression_node_ptr>(0));
23955 if (!p.token_is(token_t::e_lbracket))
23960 "ERR129 - Expected '(' for special function '" + sf_name +
"'",
23963 return error_node();
23966 for (std::size_t i = 0; i < NumberOfParameters; ++i)
23968 branch[i] = p.parse_expression();
23970 if (0 == branch[i])
23972 return p.error_node();
23974 else if (i < (NumberOfParameters - 1))
23976 if (!p.token_is(token_t::e_comma))
23981 "ERR130 - Expected ',' before next parameter of special function '" + sf_name +
"'",
23984 return p.error_node();
23989 if (!p.token_is(token_t::e_rbracket))
23994 "ERR131 - Invalid number of parameters for special function '" + sf_name +
"'",
23997 return p.error_node();
24000 result = p.expression_generator_.special_function(opt_type,branch);
24010 const std::string sf_name = current_token().value;
24021 "ERR132 - Invalid special function[1]: " + sf_name,
24024 return error_node();
24027 const int id = (sf_name[2] -
'0') * 10 +
24028 (sf_name[3] -
'0');
24035 "ERR133 - Invalid special function[2]: " + sf_name,
24038 return error_node();
24043 const std::size_t NumberOfParameters = (
id < (sf_3_to_4 - 1000)) ? 3U : 4U;
24045 switch (NumberOfParameters)
24049 default :
return error_node();
24059 #ifndef exprtk_disable_break_continue 24062 if (state_.parsing_break_stmt)
24067 "ERR134 - Break call within a break call is not allowed",
24070 return error_node();
24073 scoped_bool_negator sbn(state_.parsing_break_stmt);
24075 if (!brkcnt_list_.empty())
24079 brkcnt_list_.front() =
true;
24083 if (token_is(token_t::e_lsqrbracket))
24085 if (0 == (return_expr = parse_expression()))
24090 "ERR135 - Failed to parse return expression for 'break' statement",
24093 return error_node();
24095 else if (!token_is(token_t::e_rsqrbracket))
24100 "ERR136 - Expected ']' at the completion of break's return expression",
24103 free_node(node_allocator_,return_expr);
24105 return error_node();
24109 state_.activate_side_effect(
"parse_break_statement()");
24118 "ERR137 - Invalid use of 'break', allowed only in the scope of a loop",
24122 return error_node();
24127 if (!brkcnt_list_.empty())
24131 brkcnt_list_.front() =
true;
24132 state_.activate_side_effect(
"parse_continue_statement()");
24141 "ERR138 - Invalid use of 'continue', allowed only in the scope of a loop",
24144 return error_node();
24153 if (!token_is(token_t::e_lsqrbracket))
24158 "ERR139 - Expected '[' as part of vector size definition",
24161 return error_node();
24163 else if (0 == (size_expr = parse_expression()))
24168 "ERR140 - Failed to determine size of vector '" + vec_name +
"'",
24171 return error_node();
24180 "ERR141 - Expected a literal number as size of vector '" + vec_name +
"'",
24183 return error_node();
24186 T vector_size = size_expr->
value();
24190 const T max_vector_size = T(2000000000.0);
24193 (vector_size <= T(0)) ||
24194 std::not_equal_to<T>()
24195 (T(0),vector_size - details::numeric::trunc(vector_size)) ||
24196 (vector_size > max_vector_size)
24202 "ERR142 - Invalid vector size. Must be an integer in the range [0,2e9], size: " +
24206 return error_node();
24209 std::vector<expression_node_ptr> vec_initilizer_list;
24211 scoped_vec_delete<expression_node_t> svd((*
this),vec_initilizer_list);
24213 bool single_value_initialiser =
false;
24214 bool vec_to_vec_initialiser =
false;
24215 bool null_initialisation =
false;
24217 if (!token_is(token_t::e_rsqrbracket))
24222 "ERR143 - Expected ']' as part of vector size definition",
24225 return error_node();
24227 else if (!token_is(token_t::e_eof))
24234 "ERR144 - Expected ':=' as part of vector definition",
24237 return error_node();
24239 else if (token_is(token_t::e_lsqrbracket))
24243 if (0 == initialiser)
24248 "ERR145 - Failed to parse single vector initialiser",
24251 return error_node();
24254 vec_initilizer_list.push_back(initialiser);
24256 if (!token_is(token_t::e_rsqrbracket))
24261 "ERR146 - Expected ']' to close single value vector initialiser",
24264 return error_node();
24267 single_value_initialiser =
true;
24269 else if (!token_is(token_t::e_lcrlbracket))
24274 if (token_t::e_symbol == current_token().
type)
24277 scope_element& se = sem_.get_active_element(current_token().
value);
24279 if (scope_element::e_vector == se.type)
24281 if (0 != (initialiser = parse_expression()))
24282 vec_initilizer_list.push_back(initialiser);
24284 return error_node();
24287 else if (symtab_store_.is_vector(current_token().
value))
24289 lodge_symbol(current_token().
value, e_st_vector);
24291 if (0 != (initialiser = parse_expression()))
24292 vec_initilizer_list.push_back(initialiser);
24294 return error_node();
24297 else if (token_is(token_t::e_symbol,
"null"))
24298 null_initialisation =
true;
24301 if (!null_initialisation)
24303 if (0 == initialiser)
24308 "ERR147 - Expected '{' as part of vector initialiser list",
24311 return error_node();
24314 vec_to_vec_initialiser =
true;
24317 else if (!token_is(token_t::e_rcrlbracket))
24323 if (0 == initialiser)
24328 "ERR148 - Expected '{' as part of vector initialiser list",
24331 return error_node();
24334 vec_initilizer_list.push_back(initialiser);
24336 if (token_is(token_t::e_rcrlbracket))
24339 const bool is_next_close = peek_token_is(token_t::e_rcrlbracket);
24341 if (!token_is(token_t::e_comma) && is_next_close)
24346 "ERR149 - Expected ',' between vector initialisers",
24349 return error_node();
24352 if (token_is(token_t::e_rcrlbracket))
24358 !token_is(token_t::e_rbracket , prsrhlpr_t::e_hold) &&
24359 !token_is(token_t::e_rcrlbracket, prsrhlpr_t::e_hold) &&
24360 !token_is(token_t::e_rsqrbracket, prsrhlpr_t::e_hold)
24363 if (!token_is(token_t::e_eof))
24368 "ERR150 - Expected ';' at end of vector definition",
24371 return error_node();
24375 if (vec_initilizer_list.size() > vector_size)
24380 "ERR151 - Initialiser list larger than the number of elements in the vector: '" + vec_name +
"'",
24383 return error_node();
24391 scope_element& se = sem_.get_element(vec_name);
24393 if (se.name == vec_name)
24400 "ERR152 - Illegal redefinition of local vector: '" + vec_name +
"'",
24403 return error_node();
24406 (se.size == vec_size) &&
24407 (scope_element::e_vector == se.type)
24410 vec_holder = se.vec_node;
24412 se.depth = state_.scope_depth;
24417 if (0 == vec_holder)
24420 nse.name = vec_name;
24423 nse.type = scope_element::e_vector;
24424 nse.depth = state_.scope_depth;
24425 nse.
size = vec_size;
24426 nse.data =
new T[vec_size];
24427 nse.vec_node =
new typename scope_element::vector_holder_t((T*)(nse.data),nse.size);
24429 if (!sem_.add_element(nse))
24434 "ERR153 - Failed to add new local vector '" + vec_name +
"' to SEM",
24437 sem_.free_element(nse);
24439 return error_node();
24442 vec_holder = nse.vec_node;
24444 exprtk_debug((
"parse_define_vector_statement() - INFO - Added new local vector: %s[%d]\n",
24446 static_cast<int>(nse.size)));
24449 state_.activate_side_effect(
"parse_define_vector_statement()");
24451 lodge_symbol(vec_name, e_st_local_vector);
24455 if (null_initialisation)
24456 result = expression_generator_(T(0.0));
24457 else if (vec_to_vec_initialiser)
24461 result = expression_generator_(
24464 vec_initilizer_list[0]);
24467 result = node_allocator_
24471 vec_initilizer_list,
24472 single_value_initialiser);
24474 svd.delete_ptr = (0 == result);
24479 #ifndef exprtk_disable_string_capabilities 24484 scope_element& se = sem_.get_element(str_name);
24486 if (se.name == str_name)
24493 "ERR154 - Illegal redefinition of local variable: '" + str_name +
"'",
24496 free_node(node_allocator_,initialisation_expression);
24498 return error_node();
24500 else if (scope_element::e_string == se.type)
24502 str_node = se.str_node;
24504 se.depth = state_.scope_depth;
24512 nse.name = str_name;
24515 nse.
type = scope_element::e_string;
24516 nse.depth = state_.scope_depth;
24520 if (!sem_.add_element(nse))
24525 "ERR155 - Failed to add new local string variable '" + str_name +
"' to SEM",
24528 free_node(node_allocator_,initialisation_expression);
24530 sem_.free_element(nse);
24532 return error_node();
24535 str_node = nse.str_node;
24537 exprtk_debug((
"parse_define_string_statement() - INFO - Added new local string variable: %s\n",nse.name.c_str()));
24540 lodge_symbol(str_name, e_st_local_string);
24542 state_.activate_side_effect(
"parse_define_string_statement()");
24546 branch[0] = str_node;
24547 branch[1] = initialisation_expression;
24552 inline expression_node_ptr parse_define_string_statement(
const std::string&, expression_node_ptr)
24554 return error_node();
24560 const scope_element& se = sem_.get_element(symbol);
24561 return (se.name == symbol) && se.active;
24566 if (settings_.vardef_disabled())
24571 "ERR156 - Illegal variable definition",
24574 return error_node();
24578 return error_node();
24583 const std::string var_name = current_token().value;
24587 if (!token_is(token_t::e_symbol))
24592 "ERR157 - Expected a symbol for variable definition",
24595 return error_node();
24602 "ERR158 - Illegal redefinition of reserved keyword: '" + var_name +
"'",
24605 return error_node();
24607 else if (symtab_store_.symbol_exists(var_name))
24612 "ERR159 - Illegal redefinition of variable '" + var_name +
"'",
24615 return error_node();
24617 else if (local_variable_is_shadowed(var_name))
24622 "ERR160 - Illegal redefinition of local variable: '" + var_name +
"'",
24625 return error_node();
24627 else if (token_is(token_t::e_lsqrbracket,prsrhlpr_t::e_hold))
24629 return parse_define_vector_statement(var_name);
24631 else if (token_is(token_t::e_lcrlbracket,prsrhlpr_t::e_hold))
24633 return parse_uninitialised_var_statement(var_name);
24637 if (0 == (initialisation_expression = parse_expression()))
24642 "ERR161 - Failed to parse initialisation expression",
24645 return error_node();
24650 !token_is(token_t::e_rbracket , prsrhlpr_t::e_hold) &&
24651 !token_is(token_t::e_rcrlbracket, prsrhlpr_t::e_hold) &&
24652 !token_is(token_t::e_rsqrbracket, prsrhlpr_t::e_hold)
24655 if (!token_is(token_t::e_eof,prsrhlpr_t::e_hold))
24660 "ERR162 - Expected ';' after variable definition",
24663 free_node(node_allocator_,initialisation_expression);
24665 return error_node();
24670 (0 != initialisation_expression) &&
24674 return parse_define_string_statement(var_name,initialisation_expression);
24679 scope_element& se = sem_.get_element(var_name);
24681 if (se.name == var_name)
24688 "ERR163 - Illegal redefinition of local variable: '" + var_name +
"'",
24691 free_node(node_allocator_, initialisation_expression);
24693 return error_node();
24695 else if (scope_element::e_variable == se.type)
24697 var_node = se.var_node;
24699 se.depth = state_.scope_depth;
24707 nse.name = var_name;
24710 nse.
type = scope_element::e_variable;
24711 nse.depth = state_.scope_depth;
24712 nse.data =
new T(T(0));
24713 nse.var_node = node_allocator_.allocate<
variable_node_t>(*(T*)(nse.data));
24715 if (!sem_.add_element(nse))
24720 "ERR164 - Failed to add new local variable '" + var_name +
"' to SEM",
24723 free_node(node_allocator_, initialisation_expression);
24725 sem_.free_element(nse);
24727 return error_node();
24730 var_node = nse.var_node;
24732 exprtk_debug((
"parse_define_var_statement() - INFO - Added new local variable: %s\n",nse.name.c_str()));
24735 state_.activate_side_effect(
"parse_define_var_statement()");
24737 lodge_symbol(var_name, e_st_local_variable);
24741 branch[0] = var_node;
24742 branch[1] = initialisation_expression ? initialisation_expression : expression_generator_(T(0));
24750 !token_is(token_t::e_lcrlbracket) ||
24751 !token_is(token_t::e_rcrlbracket)
24757 "ERR165 - Expected a '{}' for uninitialised var definition",
24760 return error_node();
24762 else if (!token_is(token_t::e_eof,prsrhlpr_t::e_hold))
24767 "ERR166 - Expected ';' after uninitialised variable definition",
24770 return error_node();
24775 scope_element& se = sem_.get_element(var_name);
24777 if (se.name == var_name)
24784 "ERR167 - Illegal redefinition of local variable: '" + var_name +
"'",
24787 return error_node();
24789 else if (scope_element::e_variable == se.type)
24791 var_node = se.var_node;
24800 nse.name = var_name;
24803 nse.
type = scope_element::e_variable;
24804 nse.depth = state_.scope_depth;
24805 nse.ip_index = sem_.next_ip_index();
24806 nse.data =
new T(T(0));
24807 nse.var_node = node_allocator_.allocate<
variable_node_t>(*(T*)(nse.data));
24809 if (!sem_.add_element(nse))
24814 "ERR168 - Failed to add new local variable '" + var_name +
"' to SEM",
24817 sem_.free_element(nse);
24819 return error_node();
24822 exprtk_debug((
"parse_uninitialised_var_statement() - INFO - Added new local variable: %s\n",
24823 nse.name.c_str()));
24826 lodge_symbol(var_name, e_st_local_variable);
24828 state_.activate_side_effect(
"parse_uninitialised_var_statement()");
24830 return expression_generator_(T(0));
24837 return error_node();
24842 if (!token_is(token_t::e_lbracket))
24847 "ERR169 - Expected '(' at start of swap statement",
24850 return error_node();
24856 bool variable0_generated =
false;
24857 bool variable1_generated =
false;
24859 const std::string var0_name = current_token().value;
24861 if (!token_is(token_t::e_symbol,prsrhlpr_t::e_hold))
24866 "ERR170 - Expected a symbol for variable or vector element definition",
24869 return error_node();
24871 else if (peek_token_is(token_t::e_lsqrbracket))
24873 if (0 == (variable0 = parse_vector()))
24878 "ERR171 - First parameter to swap is an invalid vector element: '" + var0_name +
"'",
24881 return error_node();
24884 variable0_generated =
true;
24888 if (symtab_store_.is_variable(var0_name))
24890 variable0 = symtab_store_.get_variable(var0_name);
24893 scope_element& se = sem_.get_element(var0_name);
24897 (se.name == var0_name) &&
24898 (scope_element::e_variable == se.type)
24901 variable0 = se.var_node;
24904 lodge_symbol(var0_name, e_st_variable);
24906 if (0 == variable0)
24911 "ERR172 - First parameter to swap is an invalid variable: '" + var0_name +
"'",
24914 return error_node();
24920 if (!token_is(token_t::e_comma))
24925 "ERR173 - Expected ',' between parameters to swap",
24928 if (variable0_generated)
24933 return error_node();
24936 const std::string var1_name = current_token().value;
24938 if (!token_is(token_t::e_symbol,prsrhlpr_t::e_hold))
24943 "ERR174 - Expected a symbol for variable or vector element definition",
24946 if (variable0_generated)
24951 return error_node();
24953 else if (peek_token_is(token_t::e_lsqrbracket))
24955 if (0 == (variable1 = parse_vector()))
24960 "ERR175 - Second parameter to swap is an invalid vector element: '" + var1_name +
"'",
24963 if (variable0_generated)
24968 return error_node();
24971 variable1_generated =
true;
24975 if (symtab_store_.is_variable(var1_name))
24977 variable1 = symtab_store_.get_variable(var1_name);
24980 scope_element& se = sem_.get_element(var1_name);
24984 (se.name == var1_name) &&
24985 (scope_element::e_variable == se.type)
24988 variable1 = se.var_node;
24991 lodge_symbol(var1_name, e_st_variable);
24993 if (0 == variable1)
24998 "ERR176 - Second parameter to swap is an invalid variable: '" + var1_name +
"'",
25001 if (variable0_generated)
25006 return error_node();
25012 if (!token_is(token_t::e_rbracket))
25017 "ERR177 - Expected ')' at end of swap statement",
25020 if (variable0_generated)
25025 if (variable1_generated)
25030 return error_node();
25035 variable_node_ptr v0 = variable_node_ptr(0);
25036 variable_node_ptr v1 = variable_node_ptr(0);
25041 (0 != (v0 = dynamic_cast<variable_node_ptr>(variable0))) &&
25042 (0 != (v1 = dynamic_cast<variable_node_ptr>(variable1)))
25047 if (variable0_generated)
25052 if (variable1_generated)
25059 (variable0, variable1);
25061 state_.activate_side_effect(
"parse_swap_statement()");
25066 #ifndef exprtk_disable_return_statement 25069 if (state_.parsing_return_stmt)
25074 "ERR178 - Return call within a return call is not allowed",
25077 return error_node();
25080 scoped_bool_negator sbn(state_.parsing_return_stmt);
25082 std::vector<expression_node_ptr> arg_list;
25084 scoped_vec_delete<expression_node_t> sdd((*
this),arg_list);
25088 return error_node();
25093 if (!token_is(token_t::e_lsqrbracket))
25098 "ERR179 - Expected '[' at start of return statement",
25101 return error_node();
25103 else if (!token_is(token_t::e_rsqrbracket))
25110 return error_node();
25112 arg_list.push_back(arg);
25114 if (token_is(token_t::e_rsqrbracket))
25116 else if (!token_is(token_t::e_comma))
25121 "ERR180 - Expected ',' between values during call to return",
25124 return error_node();
25128 else if (settings_.zero_return_disabled())
25133 "ERR181 - Zero parameter return statement not allowed",
25136 return error_node();
25141 if (token_is(token_t::e_rsqrbracket))
25143 if (!arg_list.empty())
25148 "ERR182 - Invalid ']' found during return call",
25151 return error_node();
25157 for (std::size_t i = 0; i < arg_list.size(); ++i)
25159 if (0 == arg_list[i])
25160 return error_node();
25162 ret_param_type_list +=
'V';
25164 ret_param_type_list +=
'S';
25166 ret_param_type_list +=
'T';
25169 dec_.retparam_list_.push_back(ret_param_type_list);
25173 sdd.delete_ptr = (0 == result);
25175 state_.return_stmt_present =
true;
25177 state_.activate_side_effect(
"parse_return_statement()");
25182 inline expression_node_ptr parse_return_statement()
25184 return error_node();
25191 peek_token_is(token_t::e_lbracket ) ||
25192 peek_token_is(token_t::e_lcrlbracket) ||
25193 peek_token_is(token_t::e_lsqrbracket)
25196 if (!settings_.commutative_check_enabled())
25201 "ERR183 - Invalid sequence of variable '"+ symbol +
"' and bracket",
25215 bool implied_mul =
false;
25224 case token_t::e_lcrlbracket : implied_mul = token_is(token_t::e_lbracket ,hold) ||
25225 token_is(token_t::e_lcrlbracket,hold) ||
25226 token_is(token_t::e_lsqrbracket,hold) ;
25229 case token_t::e_lbracket : implied_mul = token_is(token_t::e_lbracket ,hold) ||
25230 token_is(token_t::e_lcrlbracket,hold) ||
25231 token_is(token_t::e_lsqrbracket,hold) ;
25234 case token_t::e_lsqrbracket : implied_mul = token_is(token_t::e_lbracket ,hold) ||
25235 token_is(token_t::e_lcrlbracket,hold) ||
25236 token_is(token_t::e_lsqrbracket,hold) ;
25239 default :
return true;
25244 if (!settings_.commutative_check_enabled())
25249 "ERR184 - Invalid sequence of brackets",
25254 else if (token_t::e_eof != current_token().
type)
25256 lexer().insert_front(current_token().
type);
25267 const std::string symbol = current_token().value;
25274 if (symtab_store_.is_constant_node(symbol))
25276 variable = expression_generator_(variable->
value());
25279 if (!post_variable_process(symbol))
25280 return error_node();
25282 lodge_symbol(symbol, e_st_variable);
25291 scope_element& se = sem_.get_active_element(symbol);
25295 if (scope_element::e_variable == se.type)
25298 lodge_symbol(symbol, e_st_local_variable);
25300 if (!post_variable_process(symbol))
25301 return error_node();
25305 return se.var_node;
25307 else if (scope_element::e_vector == se.type)
25309 return parse_vector();
25311 #ifndef exprtk_disable_string_capabilities 25312 else if (scope_element::e_string == se.type)
25314 return parse_string();
25320 #ifndef exprtk_disable_string_capabilities 25322 if (symtab_store_.is_stringvar(symbol))
25324 return parse_string();
25330 ifunction<T>*
function = symtab_store_.get_function(symbol);
25334 lodge_symbol(symbol, e_st_function);
25337 parse_function_invocation(
function,symbol);
25346 "ERR185 - Failed to generate node for function: '" + symbol +
"'",
25349 return error_node();
25358 if (vararg_function)
25360 lodge_symbol(symbol, e_st_function);
25363 parse_vararg_function_call(vararg_function, symbol);
25365 if (vararg_func_node)
25366 return vararg_func_node;
25372 "ERR186 - Failed to generate node for vararg function: '" + symbol +
"'",
25375 return error_node();
25384 if (generic_function)
25386 lodge_symbol(symbol, e_st_function);
25389 parse_generic_function_call(generic_function, symbol);
25391 if (genericfunc_node)
25392 return genericfunc_node;
25398 "ERR187 - Failed to generate node for generic function: '" + symbol +
"'",
25401 return error_node();
25406 #ifndef exprtk_disable_string_capabilities 25411 if (string_function)
25413 lodge_symbol(symbol, e_st_function);
25416 parse_string_function_call(string_function, symbol);
25418 if (stringfunc_node)
25419 return stringfunc_node;
25425 "ERR188 - Failed to generate node for string function: '" + symbol +
"'",
25428 return error_node();
25437 if (overload_function)
25439 lodge_symbol(symbol, e_st_function);
25442 parse_overload_function_call(overload_function, symbol);
25444 if (overloadfunc_node)
25445 return overloadfunc_node;
25451 "ERR189 - Failed to generate node for overload function: '" + symbol +
"'",
25454 return error_node();
25461 if (symtab_store_.is_vector(symbol))
25463 lodge_symbol(symbol, e_st_vector);
25464 return parse_vector();
25470 settings_.function_enabled(symbol) ||
25477 "ERR190 - Invalid use of reserved symbol '" + symbol +
"'",
25480 return error_node();
25485 if (resolve_unknown_symbol_ && unknown_symbol_resolver_)
25493 if (unknown_symbol_resolver::e_usrmode_default == unknown_symbol_resolver_->mode)
25495 T default_value = T(0);
25497 typename unknown_symbol_resolver::usr_symbol_type usr_symbol_type = unknown_symbol_resolver::e_usr_unknown_type;
25499 if (unknown_symbol_resolver_->process(symbol, usr_symbol_type, default_value, error_message))
25501 bool create_result =
false;
25503 switch (usr_symbol_type)
25505 case unknown_symbol_resolver::e_usr_variable_type : create_result = symtab.
create_variable(symbol, default_value);
25508 case unknown_symbol_resolver::e_usr_constant_type : create_result = symtab.
add_constant(symbol, default_value);
25511 default : create_result =
false;
25520 if (symtab_store_.is_constant_node(symbol))
25522 var = expression_generator_(var->
value());
25525 lodge_symbol(symbol, e_st_variable);
25527 if (!post_variable_process(symbol))
25528 return error_node();
25540 "ERR191 - Failed to create variable: '" + symbol +
"'" +
25541 (error_message.empty() ?
"" :
" - " + error_message),
25545 else if (unknown_symbol_resolver::e_usrmode_extended == unknown_symbol_resolver_->mode)
25547 if (unknown_symbol_resolver_->process(symbol, symtab, error_message))
25560 "ERR192 - Failed to resolve symbol: '" + symbol +
"'" +
25561 (error_message.empty() ?
"" :
" - " + error_message),
25565 return error_node();
25572 "ERR193 - Undefined symbol: '" + symbol +
"'",
25575 return error_node();
25581 static const std::string symbol_while =
"while" ;
25582 static const std::string symbol_repeat =
"repeat" ;
25584 static const std::string symbol_switch =
"switch" ;
25586 static const std::string symbol_break =
"break" ;
25587 static const std::string symbol_continue =
"continue";
25590 static const std::string symbol_return =
"return" ;
25592 if (valid_vararg_operation(current_token().
value))
25594 return parse_vararg_function();
25596 else if (valid_base_operation(current_token().
value))
25598 return parse_base_operation();
25602 settings_.control_struct_enabled(current_token().
value)
25605 return parse_conditional_statement();
25609 settings_.control_struct_enabled(current_token().
value)
25612 return parse_while_loop();
25616 settings_.control_struct_enabled(current_token().
value)
25619 return parse_repeat_until_loop();
25623 settings_.control_struct_enabled(current_token().
value)
25626 return parse_for_loop();
25630 settings_.control_struct_enabled(current_token().
value)
25633 return parse_switch_statement();
25637 return parse_special_function();
25641 return parse_null_statement();
25643 #ifndef exprtk_disable_break_continue 25646 return parse_break_statement();
25650 return parse_continue_statement();
25655 return parse_define_var_statement();
25659 return parse_swap_statement();
25661 #ifndef exprtk_disable_return_statement 25664 settings_.control_struct_enabled(current_token().
value)
25667 return parse_return_statement();
25670 else if (symtab_store_.valid() || !sem_.empty())
25672 return parse_symtab_symbol();
25679 "ERR194 - Variable or function detected, yet symbol-table is invalid, Symbol: " + current_token().
value,
25682 return error_node();
25690 if (token_t::e_number == current_token().
type)
25692 T numeric_value = T(0);
25698 if (0 == literal_exp)
25703 "ERR195 - Failed generate node for scalar: '" + current_token().
value +
"'",
25706 return error_node();
25710 branch = literal_exp;
25717 "ERR196 - Failed to convert '" + current_token().
value +
"' to a number",
25720 return error_node();
25723 else if (token_t::e_symbol == current_token().
type)
25725 branch = parse_symbol();
25727 #ifndef exprtk_disable_string_capabilities 25728 else if (token_t::e_string == current_token().
type)
25730 branch = parse_const_string();
25733 else if (token_t::e_lbracket == current_token().
type)
25737 if (0 == (branch = parse_expression()))
25738 return error_node();
25739 else if (!token_is(token_t::e_rbracket))
25744 "ERR197 - Expected ')' instead of: '" + current_token().
value +
"'",
25749 return error_node();
25751 else if (!post_bracket_process(token_t::e_lbracket,branch))
25755 return error_node();
25758 else if (token_t::e_lsqrbracket == current_token().
type)
25762 if (0 == (branch = parse_expression()))
25763 return error_node();
25764 else if (!token_is(token_t::e_rsqrbracket))
25769 "ERR198 - Expected ']' instead of: '" + current_token().
value +
"'",
25774 return error_node();
25776 else if (!post_bracket_process(token_t::e_lsqrbracket,branch))
25780 return error_node();
25783 else if (token_t::e_lcrlbracket == current_token().
type)
25787 if (0 == (branch = parse_expression()))
25788 return error_node();
25789 else if (!token_is(token_t::e_rcrlbracket))
25794 "ERR199 - Expected '}' instead of: '" + current_token().
value +
"'",
25799 return error_node();
25801 else if (!post_bracket_process(token_t::e_lcrlbracket,branch))
25805 return error_node();
25811 branch = parse_expression(e_level11);
25817 simplify_unary_negation_branch(branch)
25827 branch = parse_expression(e_level13);
25829 else if (token_t::e_eof == current_token().
type)
25834 "ERR200 - Premature end of expression[1]",
25837 return error_node();
25844 "ERR201 - Premature end of expression[2]",
25847 return error_node();
25852 (e_level00 == precedence) &&
25853 token_is(token_t::e_ternary,prsrhlpr_t::e_hold)
25856 branch = parse_ternary_conditional_statement(branch);
25859 parse_pending_string_rangesize(branch);
25864 template <
typename Type>
25878 #ifndef exprtk_disable_enhanced_features 25883 #define register_synthezier(S) \ 25884 synthesize_map_[S ::node_type::id()] = S ::process; \ 25956 unary_op_map_ = &unary_op_map;
25961 binary_op_map_ = &binary_op_map;
25966 inv_binary_op_map_ = &inv_binary_op_map;
25971 sf3_map_ = &sf3_map;
25976 sf4_map_ = &sf4_map;
25981 node_allocator_ = &na;
25986 strength_reduction_enabled_ = enabled;
25991 return strength_reduction_enabled_;
25996 typename binary_op_map_t::iterator bop_itr = binary_op_map_->find(operation);
25998 if ((*binary_op_map_).end() == bop_itr)
26001 bop = bop_itr->second;
26008 typename unary_op_map_t::iterator uop_itr = unary_op_map_->find(operation);
26010 if ((*unary_op_map_).end() == uop_itr)
26013 uop = uop_itr->second;
26020 return (*inv_binary_op_map_).find(bop)->second;
26028 #ifndef exprtk_disable_string_capabilities 26049 return error_node();
26079 typename sf3_map_t::const_iterator itr = sf3_map_->find(sf3id);
26081 if (sf3_map_->end() == itr)
26084 tfunc = itr->second.first;
26091 typename sf4_map_t::const_iterator itr = sf4_map_->find(sf4id);
26093 if (sf4_map_->end() == itr)
26096 qfunc = itr->second.first;
26103 typename sf3_map_t::const_iterator itr = sf3_map_->find(sf3id);
26105 if (sf3_map_->end() == itr)
26108 operation = itr->second.second;
26115 typename sf4_map_t::const_iterator itr = sf4_map_->find(sf4id);
26117 if (sf4_map_->end() == itr)
26120 operation = itr->second.second;
26127 if (0 == branch[0])
26129 return error_node();
26137 return error_node();
26141 return error_node();
26145 return synthesize_expression<unary_node_t,1>(operation,branch);
26149 return synthesize_uv_expression(operation,branch);
26153 return synthesize_uvec_expression(operation,branch);
26156 return synthesize_unary_expression(operation,branch);
26168 parser_->settings_.assignment_enabled(operation);
26171 #ifndef exprtk_disable_string_capabilities 26217 default :
return "UNKNOWN";
26275 return cstrrng_str;
26286 return branch_to_id(branch[0]) +
std::string(
"o") + branch_to_id(branch[1]);
26291 if (!operation_optimisable(operation))
26300 if (!operation_optimisable(operation))
26309 if (!operation_optimisable(operation))
26318 if (!operation_optimisable(operation))
26327 if (!operation_optimisable(operation))
26368 if (!operation_optimisable(operation))
26377 if (!operation_optimisable(operation))
26386 if (!operation_optimisable(operation))
26395 if (!operation_optimisable(operation))
26404 if (is_assignment_operation(operation))
26409 return !b1_is_genstring;
26418 || b1_is_genstring;
26437 return cardinal_pow_optimisable(operation, c);
26455 bool result =
false;
26457 if (b0_string != b1_string)
26459 else if (!valid_string_operation(operation) && b0_string && b1_string)
26464 parser_->set_synthesis_error(
"Invalid string operation");
26476 bool result =
false;
26478 if ((b0_string != b1_string) || (b1_string != b2_string))
26485 parser_->set_synthesis_error(
"Invalid string operation");
26496 return (b0_string && b1_string && valid_string_operation(operation));
26508 #ifndef exprtk_disable_sc_andor 26546 (details:: e_or == operation) ||
26569 if ((0 == branch[0]) || (0 == branch[1]))
26571 return error_node();
26573 else if (is_invalid_string_op(operation,branch))
26575 return error_node();
26577 else if (is_invalid_assignment_op(operation,branch))
26579 return error_node();
26581 else if (is_invalid_break_continue_op(branch))
26583 return error_node();
26587 return synthesize_assignment_expression(operation, branch);
26591 return synthesize_swap_expression(branch);
26593 else if (is_assignment_operation(operation))
26595 return synthesize_assignment_operation_expression(operation, branch);
26597 else if (is_vector_eqineq_logic_operation(operation, branch))
26599 return synthesize_veceqineqlogic_operation_expression(operation, branch);
26601 else if (is_vector_arithmetic_operation(operation, branch))
26603 return synthesize_vecarithmetic_operation_expression(operation, branch);
26605 else if (is_shortcircuit_expression(operation))
26607 return synthesize_shortcircuit_expression(operation, branch);
26609 else if (is_string_operation(operation, branch))
26611 return synthesize_string_expression(operation, branch);
26613 else if (is_null_present(branch))
26615 return synthesize_null_expression(operation, branch);
26617 #ifndef exprtk_disable_cardinal_pow_optimisation 26618 else if (is_constpow_operation(operation, branch))
26620 return cardinal_pow_optimisation(branch);
26626 #ifndef exprtk_disable_enhanced_features 26627 if (synthesize_expression(operation, branch, result))
26642 result = error_node();
26644 if (cocob_optimisable(operation, branch))
26648 else if (coboc_optimisable(operation, branch) && (0 == result))
26657 if (uvouv_optimisable(operation, branch))
26659 return synthesize_uvouv_expression(operation, branch);
26661 else if (vob_optimisable(operation, branch))
26665 else if (bov_optimisable(operation, branch))
26669 else if (cob_optimisable(operation, branch))
26673 else if (boc_optimisable(operation, branch))
26677 #ifndef exprtk_disable_enhanced_features 26678 else if (cov_optimisable(operation, branch))
26683 else if (binext_optimisable(operation, branch))
26688 return synthesize_expression<binary_node_t,2>(operation, branch);
26694 (0 == branch[0]) ||
26695 (0 == branch[1]) ||
26701 return error_node();
26703 else if (is_invalid_string_op(operation, branch))
26705 return error_node();
26707 else if (is_string_operation(operation, branch))
26709 return synthesize_string_expression(operation, branch);
26712 return synthesize_expression<trinary_node_t,3>(operation, branch);
26717 return synthesize_expression<quaternary_node_t,4>(operation,branch);
26723 return (*
this)(operation,branch);
26730 if ((0 != b0) && (0 != b1))
26745 if ((0 == condition) || (0 == consequent))
26747 free_node(*node_allocator_, condition);
26748 free_node(*node_allocator_, consequent);
26749 free_node(*node_allocator_, alternative);
26751 return error_node();
26759 free_node(*node_allocator_, condition);
26760 free_node(*node_allocator_, alternative);
26767 free_node(*node_allocator_, condition);
26768 free_node(*node_allocator_, consequent);
26771 return alternative;
26776 else if ((0 != consequent) && (0 != alternative))
26778 return node_allocator_->
26779 allocate<conditional_node_t>(condition, consequent, alternative);
26782 return node_allocator_->
26783 allocate<cons_conditional_node_t>(condition, consequent);
26786 #ifndef exprtk_disable_string_capabilities 26791 if ((0 == condition) || (0 == consequent))
26793 free_node(*node_allocator_, condition);
26794 free_node(*node_allocator_, consequent);
26795 free_node(*node_allocator_, alternative);
26797 return error_node();
26805 free_node(*node_allocator_, condition);
26806 free_node(*node_allocator_, alternative);
26813 free_node(*node_allocator_, condition);
26814 free_node(*node_allocator_, consequent);
26817 return alternative;
26819 return node_allocator_->
26820 allocate_c<details::string_literal_node<Type> >(
"");
26823 else if ((0 != consequent) && (0 != alternative))
26824 return node_allocator_->
26825 allocate<conditional_string_node_t>(condition, consequent, alternative);
26827 return error_node();
26834 return error_node();
26840 const bool brkcont =
false)
const 26847 result = error_node();
26851 free_node(*node_allocator_, condition);
26864 #ifndef exprtk_disable_break_continue 26868 return error_node();
26874 const bool brkcont =
false)
const 26888 free_node(*node_allocator_, condition);
26891 return error_node();
26901 #ifndef exprtk_disable_break_continue 26905 return error_node();
26913 bool brkcont =
false)
const 26921 result = error_node();
26925 free_node(*node_allocator_, initialiser);
26926 free_node(*node_allocator_, condition);
26927 free_node(*node_allocator_, incrementor);
26928 free_node(*node_allocator_, loop_body);
26934 free_node(*node_allocator_, initialiser);
26935 free_node(*node_allocator_, condition);
26936 free_node(*node_allocator_, incrementor);
26949 #ifndef exprtk_disable_break_continue 26959 return error_node();
26963 template <
typename Allocator,
26964 template <
typename,
typename>
class Sequence>
26969 for (std::size_t i = 0; i < (arg_list.size() / 2); ++i)
26976 result = consequent;
26983 result = arg_list.back();
26986 for (std::size_t i = 0; i < arg_list.size(); ++i)
26990 if (current_expr && (current_expr != result))
26992 free_node(*node_allocator_,current_expr);
26999 template <
typename Allocator,
27000 template <
typename,
typename>
class Sequence>
27005 for (std::size_t i = 0; i < (arg_list.size() / 2); ++i)
27012 result = consequent;
27022 for (std::size_t i = 0; i < arg_list.size(); ++i)
27026 if (current_expr && (current_expr != result))
27028 free_node(*node_allocator_,current_expr);
27039 #define case_stmt(N) \ 27040 if (is_true(arg[(2 * N)])) { return arg[(2 * N) + 1]->value(); } \ 27048 return arg.back()->value();
27058 return arg.back()->value();
27069 return arg.back()->value();
27080 return arg.back()->value();
27092 return arg.back()->value();
27104 return arg.back()->value();
27117 return arg.back()->value();
27124 template <
typename Allocator,
27125 template <
typename,
typename>
class Sequence>
27128 if (arg_list.empty())
27129 return error_node();
27132 (arg_list.size() < 3) ||
27133 ((arg_list.size() % 2) != 1)
27138 return error_node();
27140 else if (is_constant_foldable(arg_list))
27141 return const_optimise_switch(arg_list);
27143 switch ((arg_list.size() - 1) / 2)
27145 #define case_stmt(N) \ 27147 return node_allocator_-> \ 27148 allocate<details::switch_n_node \ 27149 <Type,typename switch_nodes::switch_##N> >(arg_list); \ 27164 template <
typename Allocator,
27165 template <
typename,
typename>
class Sequence>
27172 return error_node();
27174 else if (is_constant_foldable(arg_list))
27175 return const_optimise_mswitch(arg_list);
27180 #define unary_opr_switch_statements \ 27181 case_stmt(details:: e_abs, details:: abs_op) \ 27182 case_stmt(details:: e_acos, details:: acos_op) \ 27183 case_stmt(details::e_acosh, details::acosh_op) \ 27184 case_stmt(details:: e_asin, details:: asin_op) \ 27185 case_stmt(details::e_asinh, details::asinh_op) \ 27186 case_stmt(details:: e_atan, details:: atan_op) \ 27187 case_stmt(details::e_atanh, details::atanh_op) \ 27188 case_stmt(details:: e_ceil, details:: ceil_op) \ 27189 case_stmt(details:: e_cos, details:: cos_op) \ 27190 case_stmt(details:: e_cosh, details:: cosh_op) \ 27191 case_stmt(details:: e_exp, details:: exp_op) \ 27192 case_stmt(details::e_expm1, details::expm1_op) \ 27193 case_stmt(details::e_floor, details::floor_op) \ 27194 case_stmt(details:: e_log, details:: log_op) \ 27195 case_stmt(details::e_log10, details::log10_op) \ 27196 case_stmt(details:: e_log2, details:: log2_op) \ 27197 case_stmt(details::e_log1p, details::log1p_op) \ 27198 case_stmt(details:: e_neg, details:: neg_op) \ 27199 case_stmt(details:: e_pos, details:: pos_op) \ 27200 case_stmt(details::e_round, details::round_op) \ 27201 case_stmt(details:: e_sin, details:: sin_op) \ 27202 case_stmt(details:: e_sinc, details:: sinc_op) \ 27203 case_stmt(details:: e_sinh, details:: sinh_op) \ 27204 case_stmt(details:: e_sqrt, details:: sqrt_op) \ 27205 case_stmt(details:: e_tan, details:: tan_op) \ 27206 case_stmt(details:: e_tanh, details:: tanh_op) \ 27207 case_stmt(details:: e_cot, details:: cot_op) \ 27208 case_stmt(details:: e_sec, details:: sec_op) \ 27209 case_stmt(details:: e_csc, details:: csc_op) \ 27210 case_stmt(details:: e_r2d, details:: r2d_op) \ 27211 case_stmt(details:: e_d2r, details:: d2r_op) \ 27212 case_stmt(details:: e_d2g, details:: d2g_op) \ 27213 case_stmt(details:: e_g2d, details:: g2d_op) \ 27214 case_stmt(details:: e_notl, details:: notl_op) \ 27215 case_stmt(details:: e_sgn, details:: sgn_op) \ 27216 case_stmt(details:: e_erf, details:: erf_op) \ 27217 case_stmt(details:: e_erfc, details:: erfc_op) \ 27218 case_stmt(details:: e_ncdf, details:: ncdf_op) \ 27219 case_stmt(details:: e_frac, details:: frac_op) \ 27220 case_stmt(details::e_trunc, details::trunc_op) \ 27229 #define case_stmt(op0,op1) \ 27230 case op0 : return node_allocator_-> \ 27231 allocate<typename details::unary_variable_node<Type,op1<Type> > >(v); \ 27235 default :
return error_node();
27244 #define case_stmt(op0,op1) \ 27245 case op0 : return node_allocator_-> \ 27246 allocate<typename details::unary_vector_node<Type,op1<Type> > > \ 27247 (operation, branch[0]); \ 27251 default :
return error_node();
27260 #define case_stmt(op0,op1) \ 27261 case op0 : return node_allocator_-> \ 27262 allocate<typename details::unary_branch_node<Type,op1<Type> > >(branch[0]); \ 27266 default :
return error_node();
27277 #define case_stmt(op) \ 27278 case details::e_sf##op : temp_node = node_allocator_-> \ 27279 allocate<details::sf3_node<Type,details::sf##op##_op<Type> > > \ 27280 (operation, branch); \ 27296 default :
return error_node();
27299 const T v = temp_node->
value();
27310 const Type& v0 =
static_cast<variable_ptr
>(branch[0])->ref();
27311 const Type& v1 =
static_cast<variable_ptr
>(branch[1])->ref();
27312 const Type& v2 =
static_cast<variable_ptr
>(branch[2])->ref();
27316 #define case_stmt(op) \ 27317 case details::e_sf##op : return node_allocator_-> \ 27318 allocate_rrr<details::sf3_var_node<Type,details::sf##op##_op<Type> > > \ 27334 default :
return error_node();
27341 return error_node();
27342 else if (is_constant_foldable(branch))
27343 return const_optimise_sf3(operation,branch);
27345 return varnode_optimise_sf3(operation,branch);
27350 #define case_stmt(op) \ 27351 case details::e_sf##op : return node_allocator_-> \ 27352 allocate<details::sf3_node<Type,details::sf##op##_op<Type> > > \ 27353 (operation, branch); \ 27368 default :
return error_node();
27379 #define case_stmt(op) \ 27380 case details::e_sf##op : temp_node = node_allocator_-> \ 27381 allocate<details::sf4_node<Type,details::sf##op##_op<Type> > > \ 27382 (operation, branch); \ 27399 default :
return error_node();
27402 const T v = temp_node->
value();
27413 const Type& v0 =
static_cast<variable_ptr
>(branch[0])->ref();
27414 const Type& v1 =
static_cast<variable_ptr
>(branch[1])->ref();
27415 const Type& v2 =
static_cast<variable_ptr
>(branch[2])->ref();
27416 const Type& v3 =
static_cast<variable_ptr
>(branch[3])->ref();
27420 #define case_stmt(op) \ 27421 case details::e_sf##op : return node_allocator_-> \ 27422 allocate_rrrr<details::sf4_var_node<Type,details::sf##op##_op<Type> > > \ 27423 (v0, v1, v2, v3); \ 27439 default :
return error_node();
27446 return error_node();
27447 else if (is_constant_foldable(branch))
27448 return const_optimise_sf4(operation,branch);
27450 return varnode_optimise_sf4(operation,branch);
27453 #define case_stmt(op) \ 27454 case details::e_sf##op : return node_allocator_-> \ 27455 allocate<details::sf4_node<Type,details::sf##op##_op<Type> > > \ 27456 (operation, branch); \ 27472 default :
return error_node();
27476 template <
typename Allocator,
27477 template <
typename,
typename>
class Sequence>
27484 #define case_stmt(op0,op1) \ 27485 case op0 : temp_node = node_allocator_-> \ 27486 allocate<details::vararg_node<Type,op1<Type> > > \ 27499 default :
return error_node();
27502 const T v = temp_node->
value();
27520 template <
typename Allocator,
27521 template <
typename,
typename>
class Sequence>
27526 #define case_stmt(op0,op1) \ 27527 case op0 : return node_allocator_-> \ 27528 allocate<details::vararg_varnode<Type,op1<Type> > >(arg_list); \ 27539 default :
return error_node();
27543 template <
typename Allocator,
27544 template <
typename,
typename>
class Sequence>
27547 if (1 == arg_list.size())
27551 #define case_stmt(op0,op1) \ 27552 case op0 : return node_allocator_-> \ 27553 allocate<details::vectorize_node<Type,op1<Type> > >(arg_list[0]); \ 27561 default :
return error_node();
27565 return error_node();
27568 template <
typename Allocator,
27569 template <
typename,
typename>
class Sequence>
27576 return error_node();
27578 else if (is_constant_foldable(arg_list))
27579 return const_optimise_varargfunc(operation,arg_list);
27581 return vectorize_func(operation,arg_list);
27582 else if ((arg_list.size() == 1) && special_one_parameter_vararg(operation))
27583 return arg_list[0];
27585 return varnode_optimise_varargfunc(operation,arg_list);
27587 #ifndef exprtk_disable_string_capabilities 27590 return node_allocator_->
27591 allocate<details::str_vararg_node<Type,details::vararg_multi_op<Type> > >(arg_list);
27598 #define case_stmt(op0,op1) \ 27599 case op0 : return node_allocator_-> \ 27600 allocate<details::vararg_node<Type,op1<Type> > >(arg_list); \ 27611 default :
return error_node();
27616 template <std::
size_t N>
27623 return error_node();
27630 return error_node();
27631 else if (N !=
f->param_count)
27635 return error_node();
27638 function_N_node_t* func_node_ptr =
static_cast<function_N_node_t*
>(result);
27640 if (func_node_ptr->init_branches(b))
27646 return error_node();
27654 return node_allocator_->allocate<function_N_node_t>(
f);
27658 std::vector<expression_node_ptr>& arg_list)
27664 return error_node();
27672 !arg_list.empty() &&
27673 !vaf->has_side_effects() &&
27674 is_constant_foldable(arg_list)
27677 const Type v = result->
value();
27682 parser_->state_.activate_side_effect(
"vararg_function_call()");
27688 std::vector<expression_node_ptr>& arg_list,
27694 return error_node();
27704 if (no_psi == param_seq_index)
27705 result = node_allocator_->allocate<alloc_type1>(arg_list,gf);
27707 result = node_allocator_->allocate<alloc_type2>(gf, param_seq_index, arg_list);
27709 alloc_type1* genfunc_node_ptr =
static_cast<alloc_type1*
>(result);
27712 !arg_list.empty() &&
27713 !gf->has_side_effects() &&
27714 parser_->state_.type_check_enabled &&
27715 is_constant_foldable(arg_list)
27718 genfunc_node_ptr->init_branches();
27720 const Type v = result->
value();
27726 else if (genfunc_node_ptr->init_branches())
27728 parser_->state_.activate_side_effect(
"generic_function_call()");
27737 return error_node();
27741 #ifndef exprtk_disable_string_capabilities 27743 std::vector<expression_node_ptr>& arg_list,
27749 return error_node();
27759 if (no_psi == param_seq_index)
27760 result = node_allocator_->allocate<alloc_type1>(gf,arg_list);
27762 result = node_allocator_->allocate<alloc_type2>(gf, param_seq_index, arg_list);
27764 alloc_type1* strfunc_node_ptr =
static_cast<alloc_type1*
>(result);
27767 !arg_list.empty() &&
27768 !gf->has_side_effects() &&
27769 is_constant_foldable(arg_list)
27772 strfunc_node_ptr->init_branches();
27774 const Type v = result->
value();
27780 else if (strfunc_node_ptr->init_branches())
27782 parser_->state_.activate_side_effect(
"string_function_call()");
27791 return error_node();
27796 #ifndef exprtk_disable_return_statement 27802 return error_node();
27808 allocate_rr<alloc_type>(arg_list,parser_->results_ctx());
27810 alloc_type* return_node_ptr =
static_cast<alloc_type*
>(result);
27812 if (return_node_ptr->init_branches())
27814 parser_->state_.activate_side_effect(
"return_call()");
27823 return error_node();
27829 bool*& return_invoked)
27834 allocate_cr<alloc_type>(body,(*rc));
27836 return_invoked =
static_cast<alloc_type*
>(result)->retinvk_ptr();
27843 return error_node();
27846 inline expression_node_ptr return_envelope(expression_node_ptr,
27847 results_context_t*,
27850 return error_node();
27883 nse.
type = scope_element::e_vecelem;
27885 nse.
depth = parser_->state_.scope_depth;
27889 if (!parser_->sem_.add_element(nse))
27891 parser_->set_synthesis_error(
"Failed to add new local vector element to SEM [1]");
27893 parser_->sem_.free_element(nse);
27895 result = error_node();
27898 exprtk_debug((
"vector_element() - INFO - Added new local vector element: %s\n",nse.
name.c_str()));
27900 parser_->state_.activate_side_effect(
"vector_element()");
27915 template <std::
size_t N,
typename NodePtr>
27918 for (std::size_t i = 0; i < N; ++i)
27929 template <
typename NodePtr,
27930 typename Allocator,
27931 template <
typename,
typename>
class Sequence>
27934 for (std::size_t i = 0; i < b.size(); ++i)
27947 parser_->state_.activate_side_effect(
"lodge_assignment()");
27949 if (!parser_->dec_.collect_assignments())
27956 case e_st_variable : symbol_name = parser_->symtab_store_
27957 .get_variable_name(node);
27960 #ifndef exprtk_disable_string_capabilities 27961 case e_st_string : symbol_name = parser_->symtab_store_
27962 .get_stringvar_name(node);
27966 case e_st_vector : {
27969 vector_holder_t& vh =
static_cast<vector_node_t*
>(node)->vec_holder();
27971 symbol_name = parser_->symtab_store_.get_vector_name(&vh);
27975 case e_st_vecelem : {
27980 symbol_name = parser_->symtab_store_.get_vector_name(&vh);
27989 if (!symbol_name.empty())
27991 parser_->dec_.add_assignment(symbol_name,cst);
27999 lodge_assignment(e_st_variable,branch[0]);
28001 return synthesize_expression<assignment_node_t,2>(operation,branch);
28005 lodge_assignment(e_st_vecelem,branch[0]);
28007 return synthesize_expression<assignment_vec_elem_node_t, 2>(operation, branch);
28011 lodge_assignment(e_st_vecelem,branch[0]);
28013 return synthesize_expression<assignment_rebasevec_elem_node_t, 2>(operation, branch);
28017 lodge_assignment(e_st_vecelem,branch[0]);
28019 return synthesize_expression<assignment_rebasevec_celem_node_t, 2>(operation, branch);
28021 #ifndef exprtk_disable_string_capabilities 28024 lodge_assignment(e_st_string,branch[0]);
28026 return synthesize_expression<assignment_string_node_t,2>(operation, branch);
28030 lodge_assignment(e_st_string,branch[0]);
28032 return synthesize_expression<assignment_string_range_node_t,2>(operation, branch);
28037 lodge_assignment(e_st_vector,branch[0]);
28040 return synthesize_expression<assignment_vecvec_node_t,2>(operation, branch);
28042 return synthesize_expression<assignment_vec_node_t,2>(operation, branch);
28046 parser_->set_synthesis_error(
"Invalid assignment operation.[1]");
28048 return error_node();
28057 lodge_assignment(e_st_variable,branch[0]);
28061 #define case_stmt(op0,op1) \ 28062 case op0 : return node_allocator_-> \ 28063 template allocate_rrr<typename details::assignment_op_node<Type,op1<Type> > > \ 28064 (operation, branch[0], branch[1]); \ 28072 default :
return error_node();
28077 lodge_assignment(e_st_vecelem,branch[0]);
28081 #define case_stmt(op0,op1) \ 28082 case op0 : return node_allocator_-> \ 28083 template allocate_rrr<typename details::assignment_vec_elem_op_node<Type,op1<Type> > > \ 28084 (operation, branch[0], branch[1]); \ 28092 default :
return error_node();
28097 lodge_assignment(e_st_vecelem,branch[0]);
28101 #define case_stmt(op0,op1) \ 28102 case op0 : return node_allocator_-> \ 28103 template allocate_rrr<typename details::assignment_rebasevec_elem_op_node<Type,op1<Type> > > \ 28104 (operation, branch[0], branch[1]); \ 28112 default :
return error_node();
28117 lodge_assignment(e_st_vecelem,branch[0]);
28121 #define case_stmt(op0,op1) \ 28122 case op0 : return node_allocator_-> \ 28123 template allocate_rrr<typename details::assignment_rebasevec_celem_op_node<Type,op1<Type> > > \ 28124 (operation, branch[0], branch[1]); \ 28132 default :
return error_node();
28137 lodge_assignment(e_st_vector,branch[0]);
28143 #define case_stmt(op0,op1) \ 28144 case op0 : return node_allocator_-> \ 28145 template allocate_rrr<typename details::assignment_vecvec_op_node<Type,op1<Type> > > \ 28146 (operation, branch[0], branch[1]); \ 28154 default :
return error_node();
28161 #define case_stmt(op0,op1) \ 28162 case op0 : return node_allocator_-> \ 28163 template allocate_rrr<typename details::assignment_vec_op_node<Type,op1<Type> > > \ 28164 (operation, branch[0], branch[1]); \ 28172 default :
return error_node();
28176 #ifndef exprtk_disable_string_capabilities 28184 lodge_assignment(e_st_string,branch[0]);
28186 return synthesize_expression<addass_t,2>(operation,branch);
28191 parser_->set_synthesis_error(
"Invalid assignment operation[2]");
28193 return error_node();
28203 #define batch_eqineq_logic_case \ 28204 case_stmt(details:: e_lt, details:: lt_op) \ 28205 case_stmt(details:: e_lte, details:: lte_op) \ 28206 case_stmt(details:: e_gt, details:: gt_op) \ 28207 case_stmt(details:: e_gte, details:: gte_op) \ 28208 case_stmt(details:: e_eq, details:: eq_op) \ 28209 case_stmt(details:: e_ne, details:: ne_op) \ 28210 case_stmt(details::e_equal, details::equal_op) \ 28211 case_stmt(details:: e_and, details:: and_op) \ 28212 case_stmt(details:: e_nand, details:: nand_op) \ 28213 case_stmt(details:: e_or, details:: or_op) \ 28214 case_stmt(details:: e_nor, details:: nor_op) \ 28215 case_stmt(details:: e_xor, details:: xor_op) \ 28216 case_stmt(details:: e_xnor, details:: xnor_op) \ 28218 if (is_b0_ivec && is_b1_ivec)
28222 #define case_stmt(op0,op1) \ 28223 case op0 : return node_allocator_-> \ 28224 template allocate_rrr<typename details::vec_binop_vecvec_node<Type,op1<Type> > > \ 28225 (operation, branch[0], branch[1]); \ 28229 default :
return error_node();
28232 else if (is_b0_ivec && !is_b1_ivec)
28236 #define case_stmt(op0,op1) \ 28237 case op0 : return node_allocator_-> \ 28238 template allocate_rrr<typename details::vec_binop_vecval_node<Type,op1<Type> > > \ 28239 (operation, branch[0], branch[1]); \ 28243 default :
return error_node();
28246 else if (!is_b0_ivec && is_b1_ivec)
28250 #define case_stmt(op0,op1) \ 28251 case op0 : return node_allocator_-> \ 28252 template allocate_rrr<typename details::vec_binop_valvec_node<Type,op1<Type> > > \ 28253 (operation, branch[0], branch[1]); \ 28257 default :
return error_node();
28261 return error_node();
28263 #undef batch_eqineq_logic_case 28272 #define vector_ops \ 28273 case_stmt(details::e_add,details::add_op) \ 28274 case_stmt(details::e_sub,details::sub_op) \ 28275 case_stmt(details::e_mul,details::mul_op) \ 28276 case_stmt(details::e_div,details::div_op) \ 28277 case_stmt(details::e_mod,details::mod_op) \ 28279 if (is_b0_ivec && is_b1_ivec)
28283 #define case_stmt(op0,op1) \ 28284 case op0 : return node_allocator_-> \ 28285 template allocate_rrr<typename details::vec_binop_vecvec_node<Type,op1<Type> > > \ 28286 (operation, branch[0], branch[1]); \ 28291 default :
return error_node();
28294 else if (is_b0_ivec && !is_b1_ivec)
28298 #define case_stmt(op0,op1) \ 28299 case op0 : return node_allocator_-> \ 28300 template allocate_rrr<typename details::vec_binop_vecval_node<Type,op1<Type> > > \ 28301 (operation, branch[0], branch[1]); \ 28306 default :
return error_node();
28309 else if (!is_b0_ivec && is_b1_ivec)
28313 #define case_stmt(op0,op1) \ 28314 case op0 : return node_allocator_-> \ 28315 template allocate_rrr<typename details::vec_binop_valvec_node<Type,op1<Type> > > \ 28316 (operation, branch[0], branch[1]); \ 28320 default :
return error_node();
28324 return error_node();
28337 #ifndef exprtk_disable_string_capabilities 28344 if (v0_is_ivar && v1_is_ivar)
28348 variable_node_ptr v0 = variable_node_ptr(0);
28349 variable_node_ptr v1 = variable_node_ptr(0);
28352 (0 != (v0 = dynamic_cast<variable_node_ptr>(branch[0]))) &&
28353 (0 != (v1 = dynamic_cast<variable_node_ptr>(branch[1])))
28361 else if (v0_is_ivec && v1_is_ivec)
28365 #ifndef exprtk_disable_string_capabilities 28366 else if (v0_is_str && v1_is_str)
28370 (branch[0], branch[1]);
28373 (branch[0], branch[1]);
28378 parser_->set_synthesis_error(
"Only variables, strings, vectors or vector elements can be swapped");
28380 return error_node();
28383 parser_->state_.activate_side_effect(
"synthesize_swap_expression()");
28388 #ifndef exprtk_disable_sc_andor 28397 std::equal_to<T>()(T(0),branch[0]->
value())
28402 std::not_equal_to<T>()(T(0),branch[0]->value())
28411 std::equal_to<T>()(T(0),branch[1]->value())
28416 std::not_equal_to<T>()(T(0),branch[1]->value())
28423 free_node(*node_allocator_, branch[0]);
28424 free_node(*node_allocator_, branch[1]);
28430 return synthesize_expression<scand_node_t,2>(operation, branch);
28434 return synthesize_expression<scor_node_t,2>(operation, branch);
28437 return error_node();
28442 return error_node();
28446 #define basic_opr_switch_statements \ 28447 case_stmt(details::e_add, details::add_op) \ 28448 case_stmt(details::e_sub, details::sub_op) \ 28449 case_stmt(details::e_mul, details::mul_op) \ 28450 case_stmt(details::e_div, details::div_op) \ 28451 case_stmt(details::e_mod, details::mod_op) \ 28452 case_stmt(details::e_pow, details::pow_op) \ 28454 #define extended_opr_switch_statements \ 28455 case_stmt(details:: e_lt, details:: lt_op) \ 28456 case_stmt(details:: e_lte, details:: lte_op) \ 28457 case_stmt(details:: e_gt, details:: gt_op) \ 28458 case_stmt(details:: e_gte, details:: gte_op) \ 28459 case_stmt(details:: e_eq, details:: eq_op) \ 28460 case_stmt(details:: e_ne, details:: ne_op) \ 28461 case_stmt(details:: e_and, details:: and_op) \ 28462 case_stmt(details::e_nand, details::nand_op) \ 28463 case_stmt(details:: e_or, details:: or_op) \ 28464 case_stmt(details:: e_nor, details:: nor_op) \ 28465 case_stmt(details:: e_xor, details:: xor_op) \ 28466 case_stmt(details::e_xnor, details::xnor_op) \ 28468 #ifndef exprtk_disable_cardinal_pow_optimisation 28469 template <
typename TType,
template <
typename,
typename>
class IPowNode>
28474 #define case_stmt(cp) \ 28475 case cp : return node_allocator_-> \ 28476 allocate<IPowNode<T,details::numeric::fast_exp<T,cp> > >(v); \ 28494 default :
return error_node();
28500 const bool not_recipricol = (c >= T(0));
28505 else if (std::equal_to<T>()(T(2),c))
28507 return node_allocator_->
28508 template allocate_rr<typename details::vov_node<Type,details::mul_op<Type> > >(v,v);
28512 if (not_recipricol)
28513 return cardinal_pow_optimisation_impl<T,details::ipow_node>(v,p);
28515 return cardinal_pow_optimisation_impl<T,details::ipowinv_node>(v,p);
28527 const bool not_recipricol = (c >= T(0));
28530 node_allocator_->free(branch[1]);
28538 else if (not_recipricol)
28539 return cardinal_pow_optimisation_impl<expression_node_ptr,details::bipow_node>(branch[0],p);
28541 return cardinal_pow_optimisation_impl<expression_node_ptr,details::bipowninv_node>(branch[0],p);
28546 return error_node();
28554 inline expression_node_ptr cardinal_pow_optimisation(expression_node_ptr(&)[2])
28556 return error_node();
28569 if (left_neg && right_neg)
28585 return error_node();
28595 (branch[0],branch[1]));
28599 template allocate<typename details::binary_ext_node<Type,details::sub_op<Type> > >
28600 (branch[1],branch[0]);
28605 else if (left_neg && !right_neg)
28618 return error_node();
28625 template allocate<typename details::binary_ext_node<Type,details::sub_op<Type> > >
28626 (branch[1], branch[0]);
28632 (branch[0], branch[1]));
28638 (branch[0], branch[1]));
28644 (branch[0], branch[1]));
28646 default :
return error_node();
28650 else if (!left_neg && right_neg)
28663 return error_node();
28670 template allocate<typename details::binary_ext_node<Type,details::sub_op<Type> > >
28671 (branch[0], branch[1]);
28675 template allocate<typename details::binary_ext_node<Type,details::add_op<Type> > >
28676 (branch[0], branch[1]);
28682 (branch[0], branch[1]));
28688 (branch[0], branch[1]));
28690 default :
return error_node();
28697 #define case_stmt(op0,op1) \ 28698 case op0 : return expr_gen.node_allocator_-> \ 28699 template allocate<typename details::binary_ext_node<Type,op1<Type> > > \ 28700 (branch[0], branch[1]); \ 28705 default :
return error_node();
28718 #ifndef exprtk_disable_enhanced_features 28723 const bool synthesis_result = synthesize_sf4ext_expression::template compile_right<vtype>
28724 (expr_gen, v, operation, branch[1], result);
28726 if (synthesis_result)
28728 free_node(*expr_gen.node_allocator_,branch[1]);
28747 const Type& v1 =
static_cast<uvbn_ptr_t
>(branch[1])->v();
28755 template allocate_rr<
typename details::
28760 template allocate_rr<
typename details::
28771 #define case_stmt(op0,op1) \ 28772 case op0 : return expr_gen.node_allocator_-> \ 28773 template allocate_rc<typename details::vob_node<Type,op1<Type> > > \ 28779 default :
return error_node();
28792 #ifndef exprtk_disable_enhanced_features 28797 const bool synthesis_result = synthesize_sf4ext_expression::template compile_left<vtype>
28798 (expr_gen, v, operation, branch[0], result);
28800 if (synthesis_result)
28802 free_node(*expr_gen.node_allocator_, branch[0]);
28824 const Type& v0 =
static_cast<uvbn_ptr_t
>(branch[0])->v();
28831 template allocate_rr<
typename details::
28832 vov_node<Type,details::sub_op<Type> > >(v,v0);
28836 template allocate_rr<
typename details::
28841 template allocate_rr<
typename details::
28846 template allocate_rr<
typename details::
28856 #define case_stmt(op0,op1) \ 28857 case op0 : return expr_gen.node_allocator_-> \ 28858 template allocate_cr<typename details::bov_node<Type,op1<Type> > > \ 28864 default :
return error_node();
28879 if (std::equal_to<T>()(T(0),c) && (
details::e_mul == operation))
28883 return expr_gen(T(0));
28885 else if (std::equal_to<T>()(T(0),c) && (
details::e_div == operation))
28889 return expr_gen(T(0));
28891 else if (std::equal_to<T>()(T(0),c) && (
details::e_add == operation))
28893 else if (std::equal_to<T>()(T(1),c) && (
details::e_mul == operation))
28914 default :
return error_node();
28935 default :
return error_node();
28956 template allocate_tt<typename details::cob_node<Type,details::mul_op<Type> > >
28961 template allocate_tt<typename details::cob_node<Type,details::div_op<Type> > >
28965 default :
return error_node();
28970 return new_cobnode;
28974 #ifndef exprtk_disable_enhanced_features 28979 if (synthesize_sf4ext_expression::template compile_right<ctype>(expr_gen,c,operation,branch[1],result))
28990 #define case_stmt(op0,op1) \ 28991 case op0 : return expr_gen.node_allocator_-> \ 28992 template allocate_tt<typename details::cob_node<Type,op1<Type> > > \ 28998 default :
return error_node();
29013 if (std::equal_to<T>()(T(0),c) && (
details::e_mul == operation))
29017 return expr_gen(T(0));
29019 else if (std::equal_to<T>()(T(0),c) && (
details::e_div == operation))
29023 return expr_gen(std::numeric_limits<T>::quiet_NaN());
29025 else if (std::equal_to<T>()(T(0),c) && (
details::e_add == operation))
29027 else if (std::equal_to<T>()(T(1),c) && (
details::e_mul == operation))
29048 default :
return error_node();
29068 default :
return error_node();
29082 bocnode->
set_c(bocnode->
c() * c);
29089 #ifndef exprtk_disable_enhanced_features 29094 const bool synthesis_result = synthesize_sf4ext_expression::template compile_left<ctype>
29095 (expr_gen, c, operation, branch[0], result);
29097 if (synthesis_result)
29099 free_node(*expr_gen.node_allocator_, branch[0]);
29108 #define case_stmt(op0,op1) \ 29109 case op0 : return expr_gen.node_allocator_-> \ 29110 template allocate_cr<typename details::boc_node<Type,op1<Type> > > \ 29116 default :
return error_node();
29136 if (std::equal_to<T>()(T(0),c) && (
details::e_mul == operation))
29141 return expr_gen(T(0));
29143 else if (std::equal_to<T>()(T(0),c) && (
details::e_div == operation))
29148 return expr_gen(T(std::numeric_limits<T>::quiet_NaN()));
29150 else if (std::equal_to<T>()(T(0),c) && (
details::e_add == operation))
29156 else if (std::equal_to<T>()(T(1),c) && (
details::e_mul == operation))
29162 else if (std::equal_to<T>()(T(1),c) && (
details::e_div == operation))
29178 default :
return error_node();
29189 default :
return error_node();
29198 cobnode->
set_c(cobnode->
c() * c);
29204 template allocate_tt<typename details::cob_node<Type,details::div_op<Type> > >
29224 if (std::equal_to<T>()(T(0),c) && (
details::e_mul == operation))
29229 return expr_gen(T(0));
29231 else if (std::equal_to<T>()(T(0),c) && (
details::e_div == operation))
29236 return expr_gen(T(0));
29238 else if (std::equal_to<T>()(T(0),c) && (
details::e_add == operation))
29244 else if (std::equal_to<T>()(T(1),c) && (
details::e_mul == operation))
29255 cobnode->
set_c(c + cobnode->
c());
29261 template allocate_tt<typename details::cob_node<Type,details::sub_op<Type> > >
29271 cobnode->
set_c(c + cobnode->
c());
29277 template allocate_tt<typename details::cob_node<Type,details::add_op<Type> > >
29287 cobnode->
set_c(c * cobnode->
c());
29293 template allocate_tt<typename details::cob_node<Type,details::div_op<Type> > >
29303 cobnode->
set_c(c * cobnode->
c());
29309 template allocate_tt<typename details::cob_node<Type,details::mul_op<Type> > >
29347 default :
return error_node();
29358 default :
return error_node();
29368 template allocate_tt<typename details::boc_node<Type,details::add_op<Type> > >
29375 bocnode->
set_c(bocnode->
c() + c);
29385 default :
return error_node();
29408 bocnode->
set_c(c + bocnode->
c());
29414 template allocate_tt<typename details::cob_node<Type,details::sub_op<Type> > >
29425 template allocate_tt<typename details::boc_node<Type,details::add_op<Type> > >
29433 template allocate_tt<typename details::cob_node<Type,details::sub_op<Type> > >
29443 bocnode->
set_c(c * bocnode->
c());
29449 template allocate_tt<typename details::cob_node<Type,details::div_op<Type> > >
29459 bocnode->
set_c(bocnode->
c() / c);
29465 template allocate_tt<typename details::cob_node<Type,details::div_op<Type> > >
29482 #ifndef exprtk_disable_enhanced_features 29487 result = error_node();
29489 if (!operation_optimisable(operation))
29492 const std::string node_id = branch_to_id(branch);
29494 const typename synthesize_map_t::iterator itr = synthesize_map_.find(node_id);
29496 if (synthesize_map_.end() != itr)
29498 result = itr->second((*
this), operation, branch);
29517 #define case_stmt(op0,op1) \ 29518 case op0 : return expr_gen.node_allocator_-> \ 29519 template allocate_rr<typename details::vov_node<Type,op1<Type> > > \ 29525 default :
return error_node();
29541 if (std::equal_to<T>()(T(0),c) && (
details::e_mul == operation))
29542 return expr_gen(T(0));
29543 else if (std::equal_to<T>()(T(0),c) && (
details::e_div == operation))
29544 return expr_gen(T(0));
29545 else if (std::equal_to<T>()(T(0),c) && (
details::e_add == operation))
29547 else if (std::equal_to<T>()(T(1),c) && (
details::e_mul == operation))
29552 #define case_stmt(op0,op1) \ 29553 case op0 : return expr_gen.node_allocator_-> \ 29554 template allocate_cr<typename details::cov_node<Type,op1<Type> > > \ 29560 default :
return error_node();
29578 if (std::equal_to<T>()(T(1),c))
29583 else if (std::equal_to<T>()(T(0),c) && (
details::e_mul == operation))
29584 return expr_gen(T(0));
29585 else if (std::equal_to<T>()(T(0),c) && (
details::e_div == operation))
29586 return expr_gen(std::numeric_limits<T>::quiet_NaN());
29587 else if (std::equal_to<T>()(T(0),c) && (
details::e_add == operation))
29589 else if (std::equal_to<T>()(T(1),c) && (
details::e_mul == operation))
29591 else if (std::equal_to<T>()(T(1),c) && (
details::e_div == operation))
29596 #define case_stmt(op0,op1) \ 29597 case op0 : return expr_gen.node_allocator_-> \ 29598 template allocate_rc<typename details::voc_node<Type,op1<Type> > > \ 29604 default :
return error_node();
29611 template <
typename T0,
typename T1,
typename T2>
29618 #define case_stmt(op) \ 29619 case details::e_sf##op : return details::T0oT1oT2_sf3ext<T,T0,T1,T2,details::sf##op##_op<Type> >:: \ 29620 allocate(*(expr_gen.node_allocator_), t0, t1, t2); \ 29631 default :
return error_node();
29635 template <
typename T0,
typename T1,
typename T2>
29645 result = synthesize_sf3ext_expression::template process<T0, T1, T2>
29646 (expr_gen, sf3opr, t0, t1, t2);
29654 template <
typename T0,
typename T1,
typename T2,
typename T3>
29661 #define case_stmt0(op) \ 29662 case details::e_sf##op : return details::T0oT1oT2oT3_sf4ext<Type,T0,T1,T2,T3,details::sf##op##_op<Type> >:: \ 29663 allocate(*(expr_gen.node_allocator_), t0, t1, t2, t3); \ 29666 #define case_stmt1(op) \ 29667 case details::e_sf4ext##op : return details::T0oT1oT2oT3_sf4ext<Type,T0,T1,T2,T3,details::sfext##op##_op<Type> >:: \ 29668 allocate(*(expr_gen.node_allocator_), t0, t1, t2, t3); \ 29699 default :
return error_node();
29703 template <
typename T0,
typename T1,
typename T2,
typename T3>
29713 result = synthesize_sf4ext_expression::template process<T0, T1, T2, T3>
29714 (expr_gen, sf4opr, t0, t1, t2, t3);
29720 template <
typename ExternalType>
29732 sf3ext_base_ptr n =
static_cast<sf3ext_base_ptr
>(sf3node);
29733 const std::string id =
"t" + expr_gen.
to_str(operation) +
"(" + n->type_id() +
")";
29739 (expr_gen,
id,
t, sf3node, result);
29743 (expr_gen,
id,
t, sf3node, result);
29747 (expr_gen,
id,
t, sf3node, result);
29751 (expr_gen,
id,
t, sf3node, result);
29755 (expr_gen,
id,
t, sf3node, result);
29757 default :
return false;
29762 template <
typename ExternalType>
29774 sf3ext_base_ptr n =
static_cast<sf3ext_base_ptr
>(sf3node);
29776 const std::string id =
"(" + n->type_id() +
")" + expr_gen.
to_str(operation) +
"t";
29782 (expr_gen,
id,
t, sf3node, result);
29786 (expr_gen,
id,
t, sf3node, result);
29790 (expr_gen,
id,
t, sf3node, result);
29794 (expr_gen,
id,
t, sf3node, result);
29798 (expr_gen,
id,
t, sf3node, result);
29800 default :
return false;
29804 template <
typename SF3TypeNode,
typename ExternalType,
typename T0,
typename T1,
typename T2>
29811 SF3TypeNode* n =
dynamic_cast<SF3TypeNode*
>(node);
29819 return synthesize_sf4ext_expression::template compile<ExternalType, T0, T1, T2>
29820 (expr_gen,
id,
t, t0, t1, t2, result);
29826 template <
typename SF3TypeNode,
typename ExternalType,
typename T0,
typename T1,
typename T2>
29833 SF3TypeNode* n =
dynamic_cast<SF3TypeNode*
>(node);
29841 return synthesize_sf4ext_expression::template compile<T0, T1, T2, ExternalType>
29842 (expr_gen,
id, t0, t1, t2,
t, result);
29860 const Type& v0 = vov->
v0();
29861 const Type& v1 = vov->
v1();
29878 const bool synthesis_result =
29879 synthesize_sf3ext_expression::
29880 template compile<vtype,vtype,vtype>(expr_gen,
"t/(t*t)", v0, v1, v2, result);
29882 exprtk_debug((
"(v0 / v1) / v2 --> (vovov) v0 / (v1 * v2)\n"));
29884 return (synthesis_result) ? result : error_node();
29888 const bool synthesis_result =
29889 synthesize_sf3ext_expression::template compile<vtype, vtype, vtype>
29890 (expr_gen,
id(expr_gen, o0, o1), v0, v1, v2, result);
29892 if (synthesis_result)
29894 else if (!expr_gen.valid_operator(o0,f0))
29895 return error_node();
29896 else if (!expr_gen.valid_operator(o1,
f1))
29897 return error_node();
29899 return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, v2, f0,
f1);
29906 <<
"(t" << expr_gen.
to_str(o0)
29907 <<
"t)" << expr_gen.
to_str(o1)
29924 const Type& v1 = vov->
v0();
29925 const Type& v2 = vov->
v1();
29941 const bool synthesis_result =
29942 synthesize_sf3ext_expression::
29943 template compile<vtype,vtype,vtype>(expr_gen,
"(t*t)/t", v0, v2, v1, result);
29945 exprtk_debug((
"v0 / (v1 / v2) --> (vovov) (v0 * v2) / v1\n"));
29947 return (synthesis_result) ? result : error_node();
29951 const bool synthesis_result =
29952 synthesize_sf3ext_expression::template compile<vtype, vtype, vtype>
29953 (expr_gen,
id(expr_gen, o0, o1), v0, v1, v2, result);
29955 if (synthesis_result)
29957 else if (!expr_gen.valid_operator(o0,f0))
29958 return error_node();
29959 else if (!expr_gen.valid_operator(o1,
f1))
29960 return error_node();
29962 return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, v2, f0,
f1);
29969 <<
"t" << expr_gen.
to_str(o0)
29970 <<
"(t" << expr_gen.
to_str(o1)
29986 const Type& v0 = vov->
v0();
29987 const Type& v1 = vov->
v1();
30005 const bool synthesis_result =
30006 synthesize_sf3ext_expression::
30007 template compile<vtype,vtype,ctype>(expr_gen,
"t/(t*t)", v0, v1, c, result);
30009 exprtk_debug((
"(v0 / v1) / c --> (vovoc) v0 / (v1 * c)\n"));
30011 return (synthesis_result) ? result : error_node();
30015 const bool synthesis_result =
30016 synthesize_sf3ext_expression::template compile<vtype, vtype, ctype>
30017 (expr_gen,
id(expr_gen, o0, o1), v0, v1, c, result);
30019 if (synthesis_result)
30021 else if (!expr_gen.valid_operator(o0,f0))
30022 return error_node();
30023 else if (!expr_gen.valid_operator(o1,
f1))
30024 return error_node();
30026 return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, c, f0,
f1);
30033 <<
"(t" << expr_gen.
to_str(o0)
30034 <<
"t)" << expr_gen.
to_str(o1)
30051 const Type& v1 = voc->
v();
30052 const Type c = voc->
c();
30068 const bool synthesis_result =
30069 synthesize_sf3ext_expression::
30070 template compile<vtype,ctype,vtype>(expr_gen,
"(t*t)/t", v0, c, v1, result);
30072 exprtk_debug((
"v0 / (v1 / c) --> (vocov) (v0 * c) / v1\n"));
30074 return (synthesis_result) ? result : error_node();
30078 const bool synthesis_result =
30079 synthesize_sf3ext_expression::template compile<vtype, vtype, ctype>
30080 (expr_gen,
id(expr_gen, o0, o1), v0, v1, c, result);
30082 if (synthesis_result)
30084 else if (!expr_gen.valid_operator(o0,f0))
30085 return error_node();
30086 else if (!expr_gen.valid_operator(o1,
f1))
30087 return error_node();
30089 return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, c, f0,
f1);
30096 <<
"t" << expr_gen.
to_str(o0)
30097 <<
"(t" << expr_gen.
to_str(o1)
30113 const Type& v0 = voc->
v();
30114 const Type c = voc->
c();
30131 const bool synthesis_result =
30132 synthesize_sf3ext_expression::
30133 template compile<vtype,vtype,ctype>(expr_gen,
"t/(t*t)", v0, v1, c, result);
30135 exprtk_debug((
"(v0 / c) / v1 --> (vovoc) v0 / (v1 * c)\n"));
30137 return (synthesis_result) ? result : error_node();
30141 const bool synthesis_result =
30142 synthesize_sf3ext_expression::template compile<vtype, ctype, vtype>
30143 (expr_gen,
id(expr_gen, o0, o1), v0, c, v1, result);
30145 if (synthesis_result)
30147 else if (!expr_gen.valid_operator(o0,f0))
30148 return error_node();
30149 else if (!expr_gen.valid_operator(o1,
f1))
30150 return error_node();
30152 return node_type::allocate(*(expr_gen.node_allocator_), v0, c, v1, f0,
f1);
30159 <<
"(t" << expr_gen.
to_str(o0)
30160 <<
"t)" << expr_gen.
to_str(o1)
30177 const Type c = cov->
c();
30178 const Type& v1 = cov->
v();
30194 const bool synthesis_result =
30195 synthesize_sf3ext_expression::
30196 template compile<vtype, vtype, ctype>(expr_gen,
"(t*t)/t", v0, v1, c, result);
30198 exprtk_debug((
"v0 / (c / v1) --> (vovoc) (v0 * v1) / c\n"));
30200 return (synthesis_result) ? result : error_node();
30204 const bool synthesis_result =
30205 synthesize_sf3ext_expression::template compile<vtype, ctype, vtype>
30206 (expr_gen,
id(expr_gen, o0, o1), v0, c, v1, result);
30208 if (synthesis_result)
30210 else if (!expr_gen.valid_operator(o0,f0))
30211 return error_node();
30212 else if (!expr_gen.valid_operator(o1,
f1))
30213 return error_node();
30215 return node_type::allocate(*(expr_gen.node_allocator_), v0, c, v1, f0,
f1);
30222 <<
"t" << expr_gen.
to_str(o0)
30223 <<
"(t" << expr_gen.
to_str(o1)
30239 const Type c = cov->
c();
30240 const Type& v0 = cov->
v();
30257 const bool synthesis_result =
30258 synthesize_sf3ext_expression::
30259 template compile<ctype, vtype, vtype>(expr_gen,
"t/(t*t)", c, v0, v1, result);
30261 exprtk_debug((
"(c / v0) / v1 --> (covov) c / (v0 * v1)\n"));
30263 return (synthesis_result) ? result : error_node();
30267 const bool synthesis_result =
30268 synthesize_sf3ext_expression::template compile<ctype, vtype, vtype>
30269 (expr_gen,
id(expr_gen, o0, o1), c, v0, v1, result);
30271 if (synthesis_result)
30273 else if (!expr_gen.valid_operator(o0,f0))
30274 return error_node();
30275 else if (!expr_gen.valid_operator(o1,
f1))
30276 return error_node();
30278 return node_type::allocate(*(expr_gen.node_allocator_), c, v0, v1, f0,
f1);
30285 <<
"(t" << expr_gen.
to_str(o0)
30286 <<
"t)" << expr_gen.
to_str(o1)
30303 const Type& v0 = vov->
v0();
30304 const Type& v1 = vov->
v1();
30321 const bool synthesis_result =
30322 synthesize_sf3ext_expression::
30323 template compile<ctype, vtype, vtype>(expr_gen,
"(t*t)/t", c, v1, v0, result);
30325 exprtk_debug((
"c / (v0 / v1) --> (covov) (c * v1) / v0\n"));
30327 return (synthesis_result) ? result : error_node();
30331 const bool synthesis_result =
30332 synthesize_sf3ext_expression::template compile<ctype, vtype, vtype>
30333 (expr_gen,
id(expr_gen, o0, o1), c, v0, v1, result);
30335 if (synthesis_result)
30337 else if (!expr_gen.valid_operator(o0,f0))
30338 return error_node();
30339 else if (!expr_gen.valid_operator(o1,
f1))
30340 return error_node();
30342 return node_type::allocate(*(expr_gen.node_allocator_), c, v0, v1, f0,
f1);
30348 <<
"t" << expr_gen.
to_str(o0)
30349 <<
"(t" << expr_gen.
to_str(o1)
30365 const Type c0 = cov->
c();
30366 const Type& v = cov->
v();
30384 exprtk_debug((
"(c0 + v) + c1 --> (cov) (c0 + c1) + v\n"));
30387 template allocate_cr<typename details::cov_node<Type,details::add_op<Type> > >(c0 + c1, v);
30392 exprtk_debug((
"(c0 + v) - c1 --> (cov) (c0 - c1) + v\n"));
30395 template allocate_cr<typename details::cov_node<Type,details::add_op<Type> > >(c0 - c1, v);
30400 exprtk_debug((
"(c0 - v) + c1 --> (cov) (c0 + c1) - v\n"));
30403 template allocate_cr<typename details::cov_node<Type,details::sub_op<Type> > >(c0 + c1, v);
30408 exprtk_debug((
"(c0 - v) - c1 --> (cov) (c0 - c1) - v\n"));
30411 template allocate_cr<typename details::cov_node<Type,details::sub_op<Type> > >(c0 - c1, v);
30416 exprtk_debug((
"(c0 * v) * c1 --> (cov) (c0 * c1) * v\n"));
30419 template allocate_cr<typename details::cov_node<Type,details::mul_op<Type> > >(c0 * c1, v);
30424 exprtk_debug((
"(c0 * v) / c1 --> (cov) (c0 / c1) * v\n"));
30427 template allocate_cr<typename details::cov_node<Type,details::mul_op<Type> > >(c0 / c1, v);
30432 exprtk_debug((
"(c0 / v) * c1 --> (cov) (c0 * c1) / v\n"));
30435 template allocate_cr<typename details::cov_node<Type,details::div_op<Type> > >(c0 * c1, v);
30440 exprtk_debug((
"(c0 / v) / c1 --> (cov) (c0 / c1) / v\n"));
30443 template allocate_cr<typename details::cov_node<Type,details::div_op<Type> > >(c0 / c1, v);
30447 const bool synthesis_result =
30448 synthesize_sf3ext_expression::template compile<ctype, vtype, ctype>
30449 (expr_gen,
id(expr_gen, o0, o1), c0, v, c1, result);
30451 if (synthesis_result)
30453 else if (!expr_gen.valid_operator(o0,f0))
30454 return error_node();
30455 else if (!expr_gen.valid_operator(o1,
f1))
30456 return error_node();
30458 return node_type::allocate(*(expr_gen.node_allocator_), c0, v, c1, f0,
f1);
30465 <<
"(t" << expr_gen.
to_str(o0)
30466 <<
"t)" << expr_gen.
to_str(o1)
30483 const Type& v = voc->
v();
30484 const Type c1 = voc->
c();
30501 exprtk_debug((
"(c0) + (v + c1) --> (cov) (c0 + c1) + v\n"));
30504 template allocate_cr<typename details::cov_node<Type,details::add_op<Type> > >(c0 + c1, v);
30509 exprtk_debug((
"(c0) + (v - c1) --> (cov) (c0 - c1) + v\n"));
30512 template allocate_cr<typename details::cov_node<Type,details::add_op<Type> > >(c0 - c1, v);
30517 exprtk_debug((
"(c0) - (v + c1) --> (cov) (c0 - c1) - v\n"));
30520 template allocate_cr<typename details::cov_node<Type,details::sub_op<Type> > >(c0 - c1, v);
30525 exprtk_debug((
"(c0) - (v - c1) --> (cov) (c0 + c1) - v\n"));
30528 template allocate_cr<typename details::cov_node<Type,details::sub_op<Type> > >(c0 + c1, v);
30533 exprtk_debug((
"(c0) * (v * c1) --> (voc) v * (c0 * c1)\n"));
30536 template allocate_cr<typename details::cov_node<Type,details::mul_op<Type> > >(c0 * c1, v);
30541 exprtk_debug((
"(c0) * (v / c1) --> (cov) (c0 / c1) * v\n"));
30544 template allocate_cr<typename details::cov_node<Type,details::mul_op<Type> > >(c0 / c1, v);
30549 exprtk_debug((
"(c0) / (v * c1) --> (cov) (c0 / c1) / v\n"));
30552 template allocate_cr<typename details::cov_node<Type,details::div_op<Type> > >(c0 / c1, v);
30557 exprtk_debug((
"(c0) / (v / c1) --> (cov) (c0 * c1) / v\n"));
30560 template allocate_cr<typename details::cov_node<Type,details::div_op<Type> > >(c0 * c1, v);
30564 const bool synthesis_result =
30565 synthesize_sf3ext_expression::template compile<ctype, vtype, ctype>
30566 (expr_gen,
id(expr_gen, o0, o1), c0, v, c1, result);
30568 if (synthesis_result)
30570 else if (!expr_gen.valid_operator(o0,f0))
30571 return error_node();
30572 else if (!expr_gen.valid_operator(o1,
f1))
30573 return error_node();
30575 return node_type::allocate(*(expr_gen.node_allocator_), c0, v, c1, f0,
f1);
30582 <<
"t" << expr_gen.
to_str(o0)
30583 <<
"(t" << expr_gen.
to_str(o1)
30594 return error_node();
30610 const Type c1 = cov->
c();
30611 const Type& v = cov->
v();
30628 exprtk_debug((
"(c0) + (c1 + v) --> (cov) (c0 + c1) + v\n"));
30631 template allocate_cr<typename details::cov_node<Type,details::add_op<Type> > >(c0 + c1, v);
30636 exprtk_debug((
"(c0) + (c1 - v) --> (cov) (c0 + c1) - v\n"));
30639 template allocate_cr<typename details::cov_node<Type,details::sub_op<Type> > >(c0 + c1, v);
30644 exprtk_debug((
"(c0) - (c1 + v) --> (cov) (c0 - c1) - v\n"));
30647 template allocate_cr<typename details::cov_node<Type,details::sub_op<Type> > >(c0 - c1, v);
30652 exprtk_debug((
"(c0) - (c1 - v) --> (cov) (c0 - c1) + v\n"));
30655 template allocate_cr<typename details::cov_node<Type,details::add_op<Type> > >(c0 - c1, v);
30660 exprtk_debug((
"(c0) * (c1 * v) --> (cov) (c0 * c1) * v\n"));
30663 template allocate_cr<typename details::cov_node<Type,details::mul_op<Type> > >(c0 * c1, v);
30668 exprtk_debug((
"(c0) * (c1 / v) --> (cov) (c0 * c1) / v\n"));
30671 template allocate_cr<typename details::cov_node<Type,details::div_op<Type> > >(c0 * c1, v);
30676 exprtk_debug((
"(c0) / (c1 * v) --> (cov) (c0 / c1) / v\n"));
30679 template allocate_cr<typename details::cov_node<Type,details::div_op<Type> > >(c0 / c1, v);
30684 exprtk_debug((
"(c0) / (c1 / v) --> (cov) (c0 / c1) * v\n"));
30687 template allocate_cr<typename details::cov_node<Type,details::mul_op<Type> > >(c0 / c1, v);
30691 const bool synthesis_result =
30692 synthesize_sf3ext_expression::template compile<ctype, ctype, vtype>
30693 (expr_gen,
id(expr_gen, o0, o1), c0, c1, v, result);
30695 if (synthesis_result)
30697 else if (!expr_gen.valid_operator(o0,f0))
30698 return error_node();
30699 else if (!expr_gen.valid_operator(o1,
f1))
30700 return error_node();
30702 return node_type::allocate(*(expr_gen.node_allocator_), c0, c1, v, f0,
f1);
30708 <<
"t" << expr_gen.
to_str(o0)
30709 <<
"(t" << expr_gen.
to_str(o1)
30725 const Type& v = voc->
v();
30726 const Type& c0 = voc->
c();
30744 exprtk_debug((
"(v + c0) + c1 --> (voc) v + (c0 + c1)\n"));
30747 template allocate_rc<typename details::voc_node<Type,details::add_op<Type> > >(v, c0 + c1);
30752 exprtk_debug((
"(v + c0) - c1 --> (voc) v + (c0 - c1)\n"));
30755 template allocate_rc<typename details::voc_node<Type,details::add_op<Type> > >(v, c0 - c1);
30760 exprtk_debug((
"(v - c0) + c1 --> (voc) v - (c0 + c1)\n"));
30763 template allocate_rc<typename details::voc_node<Type,details::add_op<Type> > >(v, c1 - c0);
30768 exprtk_debug((
"(v - c0) - c1 --> (voc) v - (c0 + c1)\n"));
30771 template allocate_rc<typename details::voc_node<Type,details::sub_op<Type> > >(v, c0 + c1);
30776 exprtk_debug((
"(v * c0) * c1 --> (voc) v * (c0 * c1)\n"));
30779 template allocate_rc<typename details::voc_node<Type,details::mul_op<Type> > >(v, c0 * c1);
30784 exprtk_debug((
"(v * c0) / c1 --> (voc) v * (c0 / c1)\n"));
30787 template allocate_rc<typename details::voc_node<Type,details::mul_op<Type> > >(v, c0 / c1);
30792 exprtk_debug((
"(v / c0) * c1 --> (voc) v * (c1 / c0)\n"));
30795 template allocate_rc<typename details::voc_node<Type,details::mul_op<Type> > >(v, c1 / c0);
30800 exprtk_debug((
"(v / c0) / c1 --> (voc) v / (c0 * c1)\n"));
30803 template allocate_rc<typename details::voc_node<Type,details::div_op<Type> > >(v, c0 * c1);
30808 exprtk_debug((
"(v ^ c0) ^ c1 --> (voc) v ^ (c0 * c1)\n"));
30811 template allocate_rc<typename details::voc_node<Type,details::pow_op<Type> > >(v, c0 * c1);
30815 const bool synthesis_result =
30816 synthesize_sf3ext_expression::template compile<vtype, ctype, ctype>
30817 (expr_gen,
id(expr_gen, o0, o1), v, c0, c1, result);
30819 if (synthesis_result)
30821 else if (!expr_gen.valid_operator(o0,f0))
30822 return error_node();
30823 else if (!expr_gen.valid_operator(o1,
f1))
30824 return error_node();
30826 return node_type::allocate(*(expr_gen.node_allocator_), v, c0, c1, f0,
f1);
30833 <<
"(t" << expr_gen.
to_str(o0)
30834 <<
"t)" << expr_gen.
to_str(o1)
30846 exprtk_debug((
"(v) o0 (c0 o1 c1) - Not possible.\n"));
30847 return error_node();
30867 const Type& v0 = vov0->
v0();
30868 const Type& v1 = vov0->
v1();
30869 const Type& v2 = vov1->
v0();
30870 const Type& v3 = vov1->
v1();
30889 const bool synthesis_result =
30890 synthesize_sf4ext_expression::
30891 template compile<vtype,vtype,vtype,vtype>(expr_gen,
"(t*t)/(t*t)", v0, v2, v1, v3, result);
30893 exprtk_debug((
"(v0 / v1) * (v2 / v3) --> (vovovov) (v0 * v2) / (v1 * v3)\n"));
30895 return (synthesis_result) ? result : error_node();
30900 const bool synthesis_result =
30901 synthesize_sf4ext_expression::
30902 template compile<vtype,vtype,vtype,vtype>(expr_gen,
"(t*t)/(t*t)", v0, v3, v1, v2, result);
30904 exprtk_debug((
"(v0 / v1) / (v2 / v3) --> (vovovov) (v0 * v3) / (v1 * v2)\n"));
30906 return (synthesis_result) ? result : error_node();
30911 const bool synthesis_result =
30912 synthesize_sf4ext_expression::
30913 template compile<vtype,vtype,vtype,vtype>(expr_gen,
"(t+t)*(t/t)", v0, v1, v3, v2, result);
30915 exprtk_debug((
"(v0 + v1) / (v2 / v3) --> (vovovov) (v0 + v1) * (v3 / v2)\n"));
30917 return (synthesis_result) ? result : error_node();
30922 const bool synthesis_result =
30923 synthesize_sf4ext_expression::
30924 template compile<vtype,vtype,vtype,vtype>(expr_gen,
"(t-t)*(t/t)", v0, v1, v3, v2, result);
30926 exprtk_debug((
"(v0 - v1) / (v2 / v3) --> (vovovov) (v0 - v1) * (v3 / v2)\n"));
30928 return (synthesis_result) ? result : error_node();
30933 const bool synthesis_result =
30934 synthesize_sf4ext_expression::
30935 template compile<vtype,vtype,vtype,vtype>(expr_gen,
"((t*t)*t)/t", v0, v1, v3, v2, result);
30937 exprtk_debug((
"(v0 * v1) / (v2 / v3) --> (vovovov) ((v0 * v1) * v3) / v2\n"));
30939 return (synthesis_result) ? result : error_node();
30943 const bool synthesis_result =
30944 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
30945 (expr_gen,
id(expr_gen, o0, o1, o2), v0, v1, v2, v3, result);
30947 if (synthesis_result)
30949 else if (!expr_gen.valid_operator(o0,f0))
30950 return error_node();
30951 else if (!expr_gen.valid_operator(o1,
f1))
30952 return error_node();
30953 else if (!expr_gen.valid_operator(o2,f2))
30954 return error_node();
30956 return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, v2, v3, f0,
f1, f2);
30965 <<
"(t" << expr_gen.
to_str(o0)
30966 <<
"t)" << expr_gen.
to_str(o1)
30967 <<
"(t" << expr_gen.
to_str(o2)
30988 const Type& v0 = vov->
v0();
30989 const Type& v1 = vov->
v1();
30990 const Type& v2 = voc->v ();
30991 const Type c = voc->c ();
31010 const bool synthesis_result =
31011 synthesize_sf4ext_expression::
31012 template compile<vtype,vtype,vtype,ctype>(expr_gen,
"(t*t)/(t*t)", v0, v2, v1, c, result);
31014 exprtk_debug((
"(v0 / v1) * (v2 / c) --> (vovovoc) (v0 * v2) / (v1 * c)\n"));
31016 return (synthesis_result) ? result : error_node();
31021 const bool synthesis_result =
31022 synthesize_sf4ext_expression::
31023 template compile<vtype,ctype,vtype,vtype>(expr_gen,
"(t*t)/(t*t)", v0, c, v1, v2, result);
31025 exprtk_debug((
"(v0 / v1) / (v2 / c) --> (vocovov) (v0 * c) / (v1 * v2)\n"));
31027 return (synthesis_result) ? result : error_node();
31031 const bool synthesis_result =
31032 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
31033 (expr_gen,
id(expr_gen, o0, o1, o2), v0, v1, v2, c, result);
31035 if (synthesis_result)
31037 else if (!expr_gen.valid_operator(o0,f0))
31038 return error_node();
31039 else if (!expr_gen.valid_operator(o1,
f1))
31040 return error_node();
31041 else if (!expr_gen.valid_operator(o2,f2))
31042 return error_node();
31044 return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, v2, c, f0,
f1, f2);
31053 <<
"(t" << expr_gen.
to_str(o0)
31054 <<
"t)" << expr_gen.
to_str(o1)
31055 <<
"(t" << expr_gen.
to_str(o2)
31076 const Type& v0 = vov->
v0();
31077 const Type& v1 = vov->
v1();
31078 const Type& v2 = cov->v ();
31079 const Type c = cov->c ();
31098 const bool synthesis_result =
31099 synthesize_sf4ext_expression::
31100 template compile<vtype,ctype,vtype,vtype>(expr_gen,
"(t*t)/(t*t)", v0, c, v1, v2, result);
31102 exprtk_debug((
"(v0 / v1) * (c / v2) --> (vocovov) (v0 * c) / (v1 * v2)\n"));
31104 return (synthesis_result) ? result : error_node();
31109 const bool synthesis_result =
31110 synthesize_sf4ext_expression::
31111 template compile<vtype,vtype,vtype,ctype>(expr_gen,
"(t*t)/(t*t)", v0, v2, v1, c, result);
31113 exprtk_debug((
"(v0 / v1) / (c / v2) --> (vovovoc) (v0 * v2) / (v1 * c)\n"));
31115 return (synthesis_result) ? result : error_node();
31119 const bool synthesis_result =
31120 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
31121 (expr_gen,
id(expr_gen, o0, o1, o2), v0, v1, c, v2, result);
31123 if (synthesis_result)
31125 else if (!expr_gen.valid_operator(o0,f0))
31126 return error_node();
31127 else if (!expr_gen.valid_operator(o1,
f1))
31128 return error_node();
31129 else if (!expr_gen.valid_operator(o2,f2))
31130 return error_node();
31132 return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, c, v2, f0,
f1, f2);
31141 <<
"(t" << expr_gen.
to_str(o0)
31142 <<
"t)" << expr_gen.
to_str(o1)
31143 <<
"(t" << expr_gen.
to_str(o2)
31164 const Type c = voc->
c ();
31165 const Type& v0 = voc->
v ();
31166 const Type& v1 = vov->v0();
31167 const Type& v2 = vov->v1();
31186 const bool synthesis_result =
31187 synthesize_sf4ext_expression::
31188 template compile<vtype,vtype,ctype,vtype>(expr_gen,
"(t*t)/(t*t)", v0, v1, c, v2, result);
31190 exprtk_debug((
"(v0 / c) * (v1 / v2) --> (vovocov) (v0 * v1) / (c * v2)\n"));
31192 return (synthesis_result) ? result : error_node();
31197 const bool synthesis_result =
31198 synthesize_sf4ext_expression::
31199 template compile<vtype,vtype,ctype,vtype>(expr_gen,
"(t*t)/(t*t)", v0, v2, c, v1, result);
31201 exprtk_debug((
"(v0 / c) / (v1 / v2) --> (vovocov) (v0 * v2) / (c * v1)\n"));
31203 return (synthesis_result) ? result : error_node();
31207 const bool synthesis_result =
31208 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
31209 (expr_gen,
id(expr_gen, o0, o1, o2), v0, c, v1, v2, result);
31211 if (synthesis_result)
31213 else if (!expr_gen.valid_operator(o0,f0))
31214 return error_node();
31215 else if (!expr_gen.valid_operator(o1,
f1))
31216 return error_node();
31217 else if (!expr_gen.valid_operator(o2,f2))
31218 return error_node();
31220 return node_type::allocate(*(expr_gen.node_allocator_), v0, c, v1, v2, f0,
f1, f2);
31229 <<
"(t" << expr_gen.
to_str(o0)
31230 <<
"t)" << expr_gen.
to_str(o1)
31231 <<
"(t" << expr_gen.
to_str(o2)
31252 const Type c = cov->
c ();
31253 const Type& v0 = cov->
v ();
31254 const Type& v1 = vov->v0();
31255 const Type& v2 = vov->v1();
31274 const bool synthesis_result =
31275 synthesize_sf4ext_expression::
31276 template compile<ctype,vtype,vtype,vtype>(expr_gen,
"(t*t)/(t*t)", c, v1, v0, v2, result);
31278 exprtk_debug((
"(c / v0) * (v1 / v2) --> (covovov) (c * v1) / (v0 * v2)\n"));
31280 return (synthesis_result) ? result : error_node();
31285 const bool synthesis_result =
31286 synthesize_sf4ext_expression::
31287 template compile<ctype,vtype,vtype,vtype>(expr_gen,
"(t*t)/(t*t)", c, v2, v0, v1, result);
31289 exprtk_debug((
"(c / v0) / (v1 / v2) --> (covovov) (c * v2) / (v0 * v1)\n"));
31291 return (synthesis_result) ? result : error_node();
31295 const bool synthesis_result =
31296 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
31297 (expr_gen,
id(expr_gen, o0, o1, o2), c, v0, v1, v2, result);
31299 if (synthesis_result)
31301 else if (!expr_gen.valid_operator(o0,f0))
31302 return error_node();
31303 else if (!expr_gen.valid_operator(o1,
f1))
31304 return error_node();
31305 else if (!expr_gen.valid_operator(o2,f2))
31306 return error_node();
31308 return node_type::allocate(*(expr_gen.node_allocator_), c, v0, v1, v2, f0,
f1, f2);
31317 <<
"(t" << expr_gen.
to_str(o0)
31318 <<
"t)" << expr_gen.
to_str(o1)
31319 <<
"(t" << expr_gen.
to_str(o2)
31340 const Type c0 = cov0->
c();
31341 const Type& v0 = cov0->
v();
31342 const Type c1 = cov1->
c();
31343 const Type& v1 = cov1->
v();
31362 const bool synthesis_result =
31363 synthesize_sf3ext_expression::
31364 template compile<ctype,vtype,vtype>(expr_gen,
"(t+t)+t", (c0 + c1), v0, v1, result);
31366 exprtk_debug((
"(c0 + v0) + (c1 + v1) --> (covov) (c0 + c1) + v0 + v1\n"));
31368 return (synthesis_result) ? result : error_node();
31373 const bool synthesis_result =
31374 synthesize_sf3ext_expression::
31375 template compile<ctype,vtype,vtype>(expr_gen,
"(t+t)-t", (c0 - c1), v0, v1, result);
31377 exprtk_debug((
"(c0 + v0) - (c1 + v1) --> (covov) (c0 - c1) + v0 - v1\n"));
31379 return (synthesis_result) ? result : error_node();
31384 const bool synthesis_result =
31385 synthesize_sf3ext_expression::
31386 template compile<ctype,vtype,vtype>(expr_gen,
"(t-t)+t", (c0 - c1), v0, v1, result);
31388 exprtk_debug((
"(c0 - v0) - (c1 - v1) --> (covov) (c0 - c1) - v0 + v1\n"));
31390 return (synthesis_result) ? result : error_node();
31395 const bool synthesis_result =
31396 synthesize_sf3ext_expression::
31397 template compile<ctype,vtype,vtype>(expr_gen,
"(t*t)*t", (c0 * c1), v0, v1, result);
31399 exprtk_debug((
"(c0 * v0) * (c1 * v1) --> (covov) (c0 * c1) * v0 * v1\n"));
31401 return (synthesis_result) ? result : error_node();
31406 const bool synthesis_result =
31407 synthesize_sf3ext_expression::
31408 template compile<ctype,vtype,vtype>(expr_gen,
"(t*t)/t", (c0 / c1), v0, v1, result);
31410 exprtk_debug((
"(c0 * v0) / (c1 * v1) --> (covov) (c0 / c1) * (v0 / v1)\n"));
31412 return (synthesis_result) ? result : error_node();
31417 const bool synthesis_result =
31418 synthesize_sf3ext_expression::
31419 template compile<ctype,vtype,vtype>(expr_gen,
"t/(t*t)", (c0 * c1), v0, v1, result);
31421 exprtk_debug((
"(c0 / v0) * (c1 / v1) --> (covov) (c0 * c1) / (v0 * v1)\n"));
31423 return (synthesis_result) ? result : error_node();
31428 const bool synthesis_result =
31429 synthesize_sf3ext_expression::
31430 template compile<ctype,vtype,vtype>(expr_gen,
"(t*t)/t", (c0 / c1), v1, v0, result);
31432 exprtk_debug((
"(c0 / v0) / (c1 / v1) --> (covov) ((c0 / c1) * v1) / v0\n"));
31434 return (synthesis_result) ? result : error_node();
31439 const bool synthesis_result =
31440 synthesize_sf3ext_expression::
31441 template compile<ctype,vtype,vtype>(expr_gen,
"t*(t*t)", (c0 / c1), v0, v1, result);
31443 exprtk_debug((
"(c0 * v0) / (c1 / v1) --> (covov) (c0 / c1) * (v0 * v1)\n"));
31445 return (synthesis_result) ? result : error_node();
31450 const bool synthesis_result =
31451 synthesize_sf3ext_expression::
31452 template compile<ctype,vtype,vtype>(expr_gen,
"t/(t*t)", (c0 / c1), v0, v1, result);
31454 exprtk_debug((
"(c0 / v0) / (c1 * v1) --> (covov) (c0 / c1) / (v0 * v1)\n"));
31456 return (synthesis_result) ? result : error_node();
31460 (std::equal_to<T>()(c0,c1)) &&
31475 default :
return error_node();
31478 const bool synthesis_result =
31479 synthesize_sf3ext_expression::
31480 template compile<ctype, vtype, vtype>(expr_gen, specfunc, c0, v0, v1, result);
31482 exprtk_debug((
"(c * v0) +/- (c * v1) --> (covov) c * (v0 +/- v1)\n"));
31484 return (synthesis_result) ? result : error_node();
31488 const bool synthesis_result =
31489 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
31490 (expr_gen,
id(expr_gen, o0, o1, o2), c0, v0, c1, v1, result);
31492 if (synthesis_result)
31494 else if (!expr_gen.valid_operator(o0,f0))
31495 return error_node();
31496 else if (!expr_gen.valid_operator(o1,
f1))
31497 return error_node();
31498 else if (!expr_gen.valid_operator(o2,f2))
31499 return error_node();
31501 return node_type::allocate(*(expr_gen.node_allocator_), c0, v0, c1, v1, f0,
f1, f2);
31510 <<
"(t" << expr_gen.
to_str(o0)
31511 <<
"t)" << expr_gen.
to_str(o1)
31512 <<
"(t" << expr_gen.
to_str(o2)
31533 const Type c0 = voc0->
c();
31534 const Type& v0 = voc0->
v();
31535 const Type c1 = voc1->
c();
31536 const Type& v1 = voc1->
v();
31555 const bool synthesis_result =
31556 synthesize_sf3ext_expression::
31557 template compile<ctype,vtype,vtype>(expr_gen,
"(t+t)+t", (c0 + c1), v0, v1, result);
31559 exprtk_debug((
"(v0 + c0) + (v1 + c1) --> (covov) (c0 + c1) + v0 + v1\n"));
31561 return (synthesis_result) ? result : error_node();
31566 const bool synthesis_result =
31567 synthesize_sf3ext_expression::
31568 template compile<ctype,vtype,vtype>(expr_gen,
"(t+t)-t", (c0 - c1), v0, v1, result);
31570 exprtk_debug((
"(v0 + c0) - (v1 + c1) --> (covov) (c0 - c1) + v0 - v1\n"));
31572 return (synthesis_result) ? result : error_node();
31577 const bool synthesis_result =
31578 synthesize_sf3ext_expression::
31579 template compile<ctype,vtype,vtype>(expr_gen,
"(t+t)-t", (c1 - c0), v0, v1, result);
31581 exprtk_debug((
"(v0 - c0) - (v1 - c1) --> (covov) (c1 - c0) + v0 - v1\n"));
31583 return (synthesis_result) ? result : error_node();
31588 const bool synthesis_result =
31589 synthesize_sf3ext_expression::
31590 template compile<ctype,vtype,vtype>(expr_gen,
"(t*t)*t", (c0 * c1), v0, v1, result);
31592 exprtk_debug((
"(v0 * c0) * (v1 * c1) --> (covov) (c0 * c1) * v0 * v1\n"));
31594 return (synthesis_result) ? result : error_node();
31599 const bool synthesis_result =
31600 synthesize_sf3ext_expression::
31601 template compile<ctype,vtype,vtype>(expr_gen,
"(t*t)/t", (c0 / c1), v0, v1, result);
31603 exprtk_debug((
"(v0 * c0) / (v1 * c1) --> (covov) (c0 / c1) * (v0 / v1)\n"));
31605 return (synthesis_result) ? result : error_node();
31610 const bool synthesis_result =
31611 synthesize_sf3ext_expression::
31612 template compile<ctype,vtype,vtype>(expr_gen,
"(t*t)*t", Type(1) / (c0 * c1), v0, v1, result);
31614 exprtk_debug((
"(v0 / c0) * (v1 / c1) --> (covov) (1 / (c0 * c1)) * v0 * v1\n"));
31616 return (synthesis_result) ? result : error_node();
31621 const bool synthesis_result =
31622 synthesize_sf3ext_expression::
31623 template compile<ctype,vtype,vtype>(expr_gen,
"(t*t)/t", (c1 / c0), v0, v1, result);
31625 exprtk_debug((
"(v0 / c0) / (v1 / c1) --> (covov) ((c1 / c0) * v0) / v1\n"));
31627 return (synthesis_result) ? result : error_node();
31632 const bool synthesis_result =
31633 synthesize_sf3ext_expression::
31634 template compile<ctype,vtype,vtype>(expr_gen,
"t*(t/t)", (c0 * c1), v0, v1, result);
31636 exprtk_debug((
"(v0 * c0) / (v1 / c1) --> (covov) (c0 * c1) * (v0 / v1)\n"));
31638 return (synthesis_result) ? result : error_node();
31643 const bool synthesis_result =
31644 synthesize_sf3ext_expression::
31645 template compile<ctype,vtype,vtype>(expr_gen,
"t*(t/t)", Type(1) / (c0 * c1), v0, v1, result);
31647 exprtk_debug((
"(v0 / c0) / (v1 * c1) --> (covov) (1 / (c0 * c1)) * v0 / v1\n"));
31649 return (synthesis_result) ? result : error_node();
31654 const bool synthesis_result =
31655 synthesize_sf4ext_expression::
31656 template compile<vtype,ctype,vtype,ctype>(expr_gen,
"(t*t)*(t+t)", v0, T(1) / c0, v1, c1, result);
31658 exprtk_debug((
"(v0 / c0) * (v1 + c1) --> (vocovoc) (v0 * (1 / c0)) * (v1 + c1)\n"));
31660 return (synthesis_result) ? result : error_node();
31665 const bool synthesis_result =
31666 synthesize_sf4ext_expression::
31667 template compile<vtype,ctype,vtype,ctype>(expr_gen,
"(t*t)*(t-t)", v0, T(1) / c0, v1, c1, result);
31669 exprtk_debug((
"(v0 / c0) * (v1 - c1) --> (vocovoc) (v0 * (1 / c0)) * (v1 - c1)\n"));
31671 return (synthesis_result) ? result : error_node();
31675 (std::equal_to<T>()(c0,c1)) &&
31690 default :
return error_node();
31693 const bool synthesis_result =
31694 synthesize_sf3ext_expression::
31695 template compile<ctype,vtype,vtype>(expr_gen, specfunc, c0, v0, v1, result);
31697 exprtk_debug((
"(v0 * c) +/- (v1 * c) --> (covov) c * (v0 +/- v1)\n"));
31699 return (synthesis_result) ? result : error_node();
31703 (std::equal_to<T>()(c0,c1)) &&
31718 default :
return error_node();
31721 const bool synthesis_result =
31722 synthesize_sf3ext_expression::
31723 template compile<vtype,vtype,ctype>(expr_gen, specfunc, v0, v1, c0, result);
31725 exprtk_debug((
"(v0 / c) +/- (v1 / c) --> (vovoc) (v0 +/- v1) / c\n"));
31727 return (synthesis_result) ? result : error_node();
31731 const bool synthesis_result =
31732 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
31733 (expr_gen,
id(expr_gen, o0, o1, o2), v0, c0, v1, c1, result);
31735 if (synthesis_result)
31737 else if (!expr_gen.valid_operator(o0,f0))
31738 return error_node();
31739 else if (!expr_gen.valid_operator(o1,
f1))
31740 return error_node();
31741 else if (!expr_gen.valid_operator(o2,f2))
31742 return error_node();
31744 return node_type::allocate(*(expr_gen.node_allocator_), v0, c0, v1, c1, f0,
f1, f2);
31753 <<
"(t" << expr_gen.
to_str(o0)
31754 <<
"t)" << expr_gen.
to_str(o1)
31755 <<
"(t" << expr_gen.
to_str(o2)
31776 const Type c0 = cov->
c();
31777 const Type& v0 = cov->
v();
31778 const Type c1 = voc->
c();
31779 const Type& v1 = voc->
v();
31798 const bool synthesis_result =
31799 synthesize_sf3ext_expression::
31800 template compile<ctype,vtype,vtype>(expr_gen,
"(t+t)+t", (c0 + c1), v0, v1, result);
31802 exprtk_debug((
"(c0 + v0) + (v1 + c1) --> (covov) (c0 + c1) + v0 + v1\n"));
31804 return (synthesis_result) ? result : error_node();
31809 const bool synthesis_result =
31810 synthesize_sf3ext_expression::
31811 template compile<ctype,vtype,vtype>(expr_gen,
"(t+t)-t", (c0 - c1), v0, v1, result);
31813 exprtk_debug((
"(c0 + v0) - (v1 + c1) --> (covov) (c0 - c1) + v0 - v1\n"));
31815 return (synthesis_result) ? result : error_node();
31820 const bool synthesis_result =
31821 synthesize_sf3ext_expression::
31822 template compile<ctype,vtype,vtype>(expr_gen,
"t-(t+t)", (c0 + c1), v0, v1, result);
31824 exprtk_debug((
"(c0 - v0) - (v1 - c1) --> (covov) (c0 + c1) - v0 - v1\n"));
31826 return (synthesis_result) ? result : error_node();
31831 const bool synthesis_result =
31832 synthesize_sf3ext_expression::
31833 template compile<ctype,vtype,vtype>(expr_gen,
"(t*t)*t", (c0 * c1), v0, v1, result);
31835 exprtk_debug((
"(c0 * v0) * (v1 * c1) --> (covov) (c0 * c1) * v0 * v1\n"));
31837 return (synthesis_result) ? result : error_node();
31842 const bool synthesis_result =
31843 synthesize_sf3ext_expression::
31844 template compile<ctype,vtype,vtype>(expr_gen,
"(t*t)/t", (c0 / c1), v0, v1, result);
31846 exprtk_debug((
"(c0 * v0) / (v1 * c1) --> (covov) (c0 / c1) * (v0 / v1)\n"));
31848 return (synthesis_result) ? result : error_node();
31853 const bool synthesis_result =
31854 synthesize_sf3ext_expression::
31855 template compile<ctype,vtype,vtype>(expr_gen,
"t*(t/t)", (c0 / c1), v1, v0, result);
31857 exprtk_debug((
"(c0 / v0) * (v1 / c1) --> (covov) (c0 / c1) * (v1 / v0)\n"));
31859 return (synthesis_result) ? result : error_node();
31864 const bool synthesis_result =
31865 synthesize_sf3ext_expression::
31866 template compile<ctype,vtype,vtype>(expr_gen,
"t/(t*t)", (c0 * c1), v0, v1, result);
31868 exprtk_debug((
"(c0 / v0) / (v1 / c1) --> (covov) (c0 * c1) / (v0 * v1)\n"));
31870 return (synthesis_result) ? result : error_node();
31875 const bool synthesis_result =
31876 synthesize_sf3ext_expression::
31877 template compile<ctype,vtype,vtype>(expr_gen,
"(t*t)/t", (c0 * c1), v0, v1, result);
31879 exprtk_debug((
"(c0 * v0) / (v1 / c1) --> (covov) (c0 * c1) * (v0 / v1)\n"));
31881 return (synthesis_result) ? result : error_node();
31886 const bool synthesis_result =
31887 synthesize_sf3ext_expression::
31888 template compile<ctype,vtype,vtype>(expr_gen,
"t/(t*t)", (c0 / c1), v0, v1, result);
31890 exprtk_debug((
"(c0 / v0) / (v1 * c1) --> (covov) (c0 / c1) / (v0 * v1)\n"));
31892 return (synthesis_result) ? result : error_node();
31896 (std::equal_to<T>()(c0,c1)) &&
31911 default :
return error_node();
31914 const bool synthesis_result =
31915 synthesize_sf3ext_expression::
31916 template compile<ctype,vtype,vtype>(expr_gen,specfunc, c0, v0, v1, result);
31918 exprtk_debug((
"(c * v0) +/- (v1 * c) --> (covov) c * (v0 +/- v1)\n"));
31920 return (synthesis_result) ? result : error_node();
31924 const bool synthesis_result =
31925 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
31926 (expr_gen,
id(expr_gen, o0, o1, o2), c0, v0, v1, c1, result);
31928 if (synthesis_result)
31930 else if (!expr_gen.valid_operator(o0,f0))
31931 return error_node();
31932 else if (!expr_gen.valid_operator(o1,
f1))
31933 return error_node();
31934 else if (!expr_gen.valid_operator(o2,f2))
31935 return error_node();
31937 return node_type::allocate(*(expr_gen.node_allocator_), c0, v0, v1, c1, f0,
f1, f2);
31946 <<
"(t" << expr_gen.
to_str(o0)
31947 <<
"t)" << expr_gen.
to_str(o1)
31948 <<
"(t" << expr_gen.
to_str(o2)
31969 const Type c0 = voc->
c();
31970 const Type& v0 = voc->
v();
31971 const Type c1 = cov->
c();
31972 const Type& v1 = cov->
v();
31991 const bool synthesis_result =
31992 synthesize_sf3ext_expression::
31993 template compile<ctype,vtype,vtype>(expr_gen,
"(t+t)+t", (c0 + c1), v0, v1, result);
31995 exprtk_debug((
"(v0 + c0) + (c1 + v1) --> (covov) (c0 + c1) + v0 + v1\n"));
31997 return (synthesis_result) ? result : error_node();
32002 const bool synthesis_result =
32003 synthesize_sf3ext_expression::
32004 template compile<ctype,vtype,vtype>(expr_gen,
"(t+t)-t", (c0 - c1), v0, v1, result);
32006 exprtk_debug((
"(v0 + c0) - (c1 + v1) --> (covov) (c0 - c1) + v0 - v1\n"));
32008 return (synthesis_result) ? result : error_node();
32013 const bool synthesis_result =
32014 synthesize_sf3ext_expression::
32015 template compile<vtype,vtype,ctype>(expr_gen,
"(t+t)-t", v0, v1, (c1 + c0), result);
32017 exprtk_debug((
"(v0 - c0) - (c1 - v1) --> (vovoc) v0 + v1 - (c1 + c0)\n"));
32019 return (synthesis_result) ? result : error_node();
32024 const bool synthesis_result =
32025 synthesize_sf3ext_expression::
32026 template compile<ctype,vtype,vtype>(expr_gen,
"(t*t)*t", (c0 * c1), v0, v1, result);
32028 exprtk_debug((
"(v0 * c0) * (c1 * v1) --> (covov) (c0 * c1) * v0 * v1\n"));
32030 return (synthesis_result) ? result : error_node();
32035 const bool synthesis_result =
32036 synthesize_sf3ext_expression::
32037 template compile<ctype,vtype,vtype>(expr_gen,
"(t*t)/t", (c0 / c1), v0, v1, result);
32039 exprtk_debug((
"(v0 * c0) / (c1 * v1) --> (covov) (c0 / c1) * (v0 * v1)\n"));
32041 return (synthesis_result) ? result : error_node();
32046 const bool synthesis_result =
32047 synthesize_sf3ext_expression::
32048 template compile<ctype,vtype,vtype>(expr_gen,
"(t*t)/t", (c1 / c0), v0, v1, result);
32050 exprtk_debug((
"(v0 / c0) * (c1 / v1) --> (covov) (c1 / c0) * (v0 / v1)\n"));
32052 return (synthesis_result) ? result : error_node();
32057 const bool synthesis_result =
32058 synthesize_sf3ext_expression::
32059 template compile<ctype,vtype,vtype>(expr_gen,
"(t*t)*t", (c0 / c1), v0, v1, result);
32061 exprtk_debug((
"(v0 * c0) / (c1 / v1) --> (covov) (c0 / c1) * (v0 * v1)\n"));
32063 return (synthesis_result) ? result : error_node();
32068 const bool synthesis_result =
32069 synthesize_sf3ext_expression::
32070 template compile<ctype,vtype,vtype>(expr_gen,
"(t*t)/t", Type(1) / (c0 * c1), v0, v1, result);
32072 exprtk_debug((
"(v0 / c0) / (c1 * v1) --> (covov) (1 / (c0 * c1)) * (v0 / v1)\n"));
32074 return (synthesis_result) ? result : error_node();
32079 const bool synthesis_result =
32080 synthesize_sf3ext_expression::
32081 template compile<vtype,vtype,ctype>(expr_gen,
"(t*t)*t", v0, v1, Type(1) / (c0 * c1), result);
32083 exprtk_debug((
"(v0 / c0) / (c1 / v1) --> (vovoc) (v0 * v1) * (1 / (c0 * c1))\n"));
32085 return (synthesis_result) ? result : error_node();
32089 (std::equal_to<T>()(c0,c1)) &&
32103 default :
return error_node();
32106 const bool synthesis_result =
32107 synthesize_sf3ext_expression::
32108 template compile<ctype,vtype,vtype>(expr_gen, specfunc, c0, v0, v1, result);
32110 exprtk_debug((
"(v0 * c) +/- (c * v1) --> (covov) c * (v0 +/- v1)\n"));
32112 return (synthesis_result) ? result : error_node();
32116 const bool synthesis_result =
32117 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
32118 (expr_gen,
id(expr_gen, o0, o1, o2), v0, c0, c1, v1, result);
32120 if (synthesis_result)
32122 else if (!expr_gen.valid_operator(o0,f0))
32123 return error_node();
32124 else if (!expr_gen.valid_operator(o1,
f1))
32125 return error_node();
32126 else if (!expr_gen.valid_operator(o2,f2))
32127 return error_node();
32129 return node_type::allocate(*(expr_gen.node_allocator_), v0, c0, c1, v1, f0,
f1, f2);
32138 <<
"(t" << expr_gen.
to_str(o0)
32139 <<
"t)" << expr_gen.
to_str(o1)
32140 <<
"(t" << expr_gen.
to_str(o2)
32161 const lcl_vovov_t* vovov =
static_cast<const lcl_vovov_t*
>(branch[1]);
32163 const Type& v1 = vovov->t0();
32164 const Type& v2 = vovov->t1();
32165 const Type& v3 = vovov->t2();
32178 if (synthesize_sf4ext_expression::template compile<T0,T1,T2,T3>(expr_gen,
id(expr_gen,o0,o1,o2),v0,v1,v2,v3,result))
32181 return error_node();
32194 <<
"t" << expr_gen.
to_str(o0)
32195 <<
"(t" << expr_gen.
to_str(o1)
32196 <<
"(t" << expr_gen.
to_str(o2)
32217 const lcl_vovoc_t* vovoc =
static_cast<const lcl_vovoc_t*
>(branch[1]);
32219 const Type& v1 = vovoc->t0();
32220 const Type& v2 = vovoc->t1();
32221 const Type c = vovoc->t2();
32234 const bool synthesis_result =
32235 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
32236 (expr_gen,
id(expr_gen, o0, o1, o2), v0, v1, v2, c, result);
32238 if (synthesis_result)
32240 else if (!expr_gen.valid_operator(o0,f0))
32241 return error_node();
32245 return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, v2, c, f0,
f1, f2);
32254 <<
"t" << expr_gen.
to_str(o0)
32255 <<
"(t" << expr_gen.
to_str(o1)
32256 <<
"(t" << expr_gen.
to_str(o2)
32277 const lcl_vocov_t* vocov =
static_cast<const lcl_vocov_t*
>(branch[1]);
32279 const Type& v1 = vocov->t0();
32280 const Type c = vocov->t1();
32281 const Type& v2 = vocov->t2();
32294 const bool synthesis_result =
32295 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
32296 (expr_gen,
id(expr_gen, o0, o1, o2), v0, v1, c, v2, result);
32298 if (synthesis_result)
32300 if (!expr_gen.valid_operator(o0,f0))
32301 return error_node();
32305 return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, c, v2, f0,
f1, f2);
32314 <<
"t" << expr_gen.
to_str(o0)
32315 <<
"(t" << expr_gen.
to_str(o1)
32316 <<
"(t" << expr_gen.
to_str(o2)
32337 const lcl_covov_t* covov =
static_cast<const lcl_covov_t*
>(branch[1]);
32339 const Type c = covov->t0();
32340 const Type& v1 = covov->t1();
32341 const Type& v2 = covov->t2();
32354 const bool synthesis_result =
32355 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
32356 (expr_gen,
id(expr_gen, o0, o1, o2), v0, c, v1, v2, result);
32358 if (synthesis_result)
32360 else if (!expr_gen.valid_operator(o0,f0))
32361 return error_node();
32365 return node_type::allocate(*(expr_gen.node_allocator_), v0, c, v1, v2, f0,
f1, f2);
32374 <<
"t" << expr_gen.
to_str(o0)
32375 <<
"(t" << expr_gen.
to_str(o1)
32376 <<
"(t" << expr_gen.
to_str(o2)
32397 const lcl_vovov_t* vovov =
static_cast<const lcl_vovov_t*
>(branch[1]);
32399 const Type& v0 = vovov->t0();
32400 const Type& v1 = vovov->t1();
32401 const Type& v2 = vovov->t2();
32415 const bool synthesis_result =
32416 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
32417 (expr_gen,
id(expr_gen, o0, o1, o2), c, v0, v1, v2, result);
32419 if (synthesis_result)
32421 if (!expr_gen.valid_operator(o0,f0))
32422 return error_node();
32426 return node_type::allocate(*(expr_gen.node_allocator_), c, v0, v1, v2, f0,
f1, f2);
32435 <<
"t" << expr_gen.
to_str(o0)
32436 <<
"(t" << expr_gen.
to_str(o1)
32437 <<
"(t" << expr_gen.
to_str(o2)
32458 const lcl_vocov_t* vocov =
static_cast<const lcl_vocov_t*
>(branch[1]);
32460 const Type& v0 = vocov->t0();
32461 const Type c1 = vocov->t1();
32462 const Type& v1 = vocov->t2();
32476 const bool synthesis_result =
32477 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
32478 (expr_gen,
id(expr_gen, o0, o1, o2), c0, v0, c1, v1, result);
32480 if (synthesis_result)
32482 else if (!expr_gen.valid_operator(o0,f0))
32483 return error_node();
32487 return node_type::allocate(*(expr_gen.node_allocator_), c0, v0, c1, v1, f0,
f1, f2);
32496 <<
"t" << expr_gen.
to_str(o0)
32497 <<
"(t" << expr_gen.
to_str(o1)
32498 <<
"(t" << expr_gen.
to_str(o2)
32519 const lcl_covoc_t* covoc =
static_cast<const lcl_covoc_t*
>(branch[1]);
32521 const Type c0 = covoc->t0();
32522 const Type& v1 = covoc->t1();
32523 const Type c1 = covoc->t2();
32536 const bool synthesis_result =
32537 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
32538 (expr_gen,
id(expr_gen, o0, o1, o2), v0, c0, v1, c1, result);
32540 if (synthesis_result)
32542 else if (!expr_gen.valid_operator(o0,f0))
32543 return error_node();
32547 return node_type::allocate(*(expr_gen.node_allocator_), v0, c0, v1, c1, f0,
f1, f2);
32556 <<
"t" << expr_gen.
to_str(o0)
32557 <<
"(t" << expr_gen.
to_str(o1)
32558 <<
"(t" << expr_gen.
to_str(o2)
32578 const lcl_vovoc_t* vovoc =
static_cast<const lcl_vovoc_t*
>(branch[1]);
32580 const Type& v0 = vovoc->t0();
32581 const Type& v1 = vovoc->t1();
32582 const Type c1 = vovoc->t2();
32596 const bool synthesis_result =
32597 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
32598 (expr_gen,
id(expr_gen, o0, o1, o2), c0, v0, v1, c1, result);
32600 if (synthesis_result)
32602 else if (!expr_gen.valid_operator(o0,f0))
32603 return error_node();
32607 return node_type::allocate(*(expr_gen.node_allocator_), c0, v0, v1, c1, f0,
f1, f2);
32616 <<
"t" << expr_gen.
to_str(o0)
32617 <<
"(t" << expr_gen.
to_str(o1)
32618 <<
"(t" << expr_gen.
to_str(o2)
32639 const lcl_cocov_t* cocov =
static_cast<const lcl_cocov_t*
>(branch[1]);
32641 const Type c0 = cocov->t0();
32642 const Type c1 = cocov->t1();
32643 const Type& v1 = cocov->t2();
32656 const bool synthesis_result =
32657 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
32658 (expr_gen,
id(expr_gen, o0, o1, o2), v0, c0, c1, v1, result);
32660 if (synthesis_result)
32662 else if (!expr_gen.valid_operator(o0,f0))
32663 return error_node();
32667 return node_type::allocate(*(expr_gen.node_allocator_), v0, c0, c1, v1, f0,
f1, f2);
32676 <<
"t" << expr_gen.
to_str(o0)
32677 <<
"(t" << expr_gen.
to_str(o1)
32678 <<
"(t" << expr_gen.
to_str(o2)
32699 const lcl_vovov_t* vovov =
static_cast<const lcl_vovov_t*
>(branch[1]);
32701 const Type& v1 = vovov->t0();
32702 const Type& v2 = vovov->t1();
32703 const Type& v3 = vovov->t2();
32716 const bool synthesis_result =
32717 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
32718 (expr_gen,
id(expr_gen, o0, o1, o2), v0, v1, v2, v3, result);
32720 if (synthesis_result)
32722 else if (!expr_gen.valid_operator(o0,f0))
32723 return error_node();
32727 return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, v2, v3, f0,
f1, f2);
32736 <<
"t" << expr_gen.
to_str(o0)
32737 <<
"((t" << expr_gen.
to_str(o1)
32738 <<
"t)" << expr_gen.
to_str(o2)
32759 const lcl_vovoc_t* vovoc =
static_cast<const lcl_vovoc_t*
>(branch[1]);
32761 const Type& v1 = vovoc->t0();
32762 const Type& v2 = vovoc->t1();
32763 const Type c = vovoc->t2();
32776 const bool synthesis_result =
32777 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
32778 (expr_gen,
id(expr_gen, o0, o1, o2), v0, v1, v2, c, result);
32780 if (synthesis_result)
32782 else if (!expr_gen.valid_operator(o0,f0))
32783 return error_node();
32787 return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, v2, c, f0,
f1, f2);
32796 <<
"t" << expr_gen.
to_str(o0)
32797 <<
"((t" << expr_gen.
to_str(o1)
32798 <<
"t)" << expr_gen.
to_str(o2)
32819 const lcl_vocov_t* vocov =
static_cast<const lcl_vocov_t*
>(branch[1]);
32821 const Type& v1 = vocov->t0();
32822 const Type c = vocov->t1();
32823 const Type& v2 = vocov->t2();
32836 const bool synthesis_result =
32837 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
32838 (expr_gen,
id(expr_gen, o0, o1, o2), v0, v1, c, v2, result);
32840 if (synthesis_result)
32842 else if (!expr_gen.valid_operator(o0,f0))
32843 return error_node();
32847 return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, c, v2, f0,
f1, f2);
32856 <<
"t" << expr_gen.
to_str(o0)
32857 <<
"((t" << expr_gen.
to_str(o1)
32858 <<
"t)" << expr_gen.
to_str(o2)
32879 const lcl_covov_t* covov =
static_cast<const lcl_covov_t*
>(branch[1]);
32881 const Type c = covov->t0();
32882 const Type& v1 = covov->t1();
32883 const Type& v2 = covov->t2();
32896 const bool synthesis_result =
32897 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
32898 (expr_gen,
id(expr_gen, o0, o1, o2), v0, c, v1, v2, result);
32900 if (synthesis_result)
32902 else if (!expr_gen.valid_operator(o0,f0))
32903 return error_node();
32907 return node_type::allocate(*(expr_gen.node_allocator_), v0, c, v1, v2, f0,
f1, f2);
32916 <<
"t" << expr_gen.
to_str(o0)
32917 <<
"((t" << expr_gen.
to_str(o1)
32918 <<
"t)" << expr_gen.
to_str(o2)
32939 const lcl_vovov_t* vovov =
static_cast<const lcl_vovov_t*
>(branch[1]);
32941 const Type& v0 = vovov->t0();
32942 const Type& v1 = vovov->t1();
32943 const Type& v2 = vovov->t2();
32957 const bool synthesis_result =
32958 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
32959 (expr_gen,
id(expr_gen, o0, o1, o2), c, v0, v1, v2, result);
32961 if (synthesis_result)
32963 else if (!expr_gen.valid_operator(o0,f0))
32964 return error_node();
32968 return node_type::allocate(*(expr_gen.node_allocator_), c, v0, v1, v2, f0,
f1, f2);
32977 <<
"t" << expr_gen.
to_str(o0)
32978 <<
"((t" << expr_gen.
to_str(o1)
32979 <<
"t)" << expr_gen.
to_str(o2)
33000 const lcl_vocov_t* vocov =
static_cast<const lcl_vocov_t*
>(branch[1]);
33002 const Type& v0 = vocov->t0();
33003 const Type c1 = vocov->t1();
33004 const Type& v1 = vocov->t2();
33018 const bool synthesis_result =
33019 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
33020 (expr_gen,
id(expr_gen, o0, o1, o2), c0, v0, c1, v1, result);
33022 if (synthesis_result)
33024 else if (!expr_gen.valid_operator(o0,f0))
33025 return error_node();
33029 return node_type::allocate(*(expr_gen.node_allocator_), c0, v0, c1, v1, f0,
f1, f2);
33038 <<
"t" << expr_gen.
to_str(o0)
33039 <<
"((t" << expr_gen.
to_str(o1)
33040 <<
"t)" << expr_gen.
to_str(o2)
33061 const lcl_covoc_t* covoc =
static_cast<const lcl_covoc_t*
>(branch[1]);
33063 const Type c0 = covoc->t0();
33064 const Type& v1 = covoc->t1();
33065 const Type c1 = covoc->t2();
33078 const bool synthesis_result =
33079 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
33080 (expr_gen,
id(expr_gen, o0, o1, o2), v0, c0, v1, c1, result);
33082 if (synthesis_result)
33084 else if (!expr_gen.valid_operator(o0,f0))
33085 return error_node();
33089 return node_type::allocate(*(expr_gen.node_allocator_), v0, c0, v1, c1, f0,
f1, f2);
33098 <<
"t" << expr_gen.
to_str(o0)
33099 <<
"((t" << expr_gen.
to_str(o1)
33100 <<
"t)" << expr_gen.
to_str(o2)
33121 const lcl_vovoc_t* vovoc =
static_cast<const lcl_vovoc_t*
>(branch[1]);
33123 const Type& v0 = vovoc->t0();
33124 const Type& v1 = vovoc->t1();
33125 const Type c1 = vovoc->t2();
33139 const bool synthesis_result =
33140 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
33141 (expr_gen,
id(expr_gen, o0, o1, o2), c0, v0, v1, c1, result);
33143 if (synthesis_result)
33145 else if (!expr_gen.valid_operator(o0,f0))
33146 return error_node();
33150 return node_type::allocate(*(expr_gen.node_allocator_), c0, v0, v1, c1, f0,
f1, f2);
33159 <<
"t" << expr_gen.
to_str(o0)
33160 <<
"((t" << expr_gen.
to_str(o1)
33161 <<
"t)" << expr_gen.
to_str(o2)
33172 exprtk_debug((
"v0 o0 ((c0 o1 c1) o2 v1) - Not possible\n"));
33173 return error_node();
33199 const lcl_vovov_t* vovov =
static_cast<const lcl_vovov_t*
>(branch[0]);
33200 const Type& v0 = vovov->
t0();
33201 const Type& v1 = vovov->t1();
33202 const Type& v2 = vovov->t2();
33216 const bool synthesis_result =
33217 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
33218 (expr_gen,
id(expr_gen, o0, o1, o2), v0, v1, v2, v3, result);
33220 if (synthesis_result)
33222 else if (!expr_gen.valid_operator(o2,f2))
33223 return error_node();
33227 return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, v2, v3, f0,
f1, f2);
33236 <<
"((t" << expr_gen.
to_str(o0)
33237 <<
"t)" << expr_gen.
to_str(o1)
33238 <<
"t)" << expr_gen.
to_str(o2)
33259 const lcl_vovov_t* vovov =
static_cast<const lcl_vovov_t*
>(branch[0]);
33260 const Type& v0 = vovov->
t0();
33261 const Type& v1 = vovov->t1();
33262 const Type& v2 = vovov->t2();
33277 const bool synthesis_result =
33278 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
33279 (expr_gen,
id(expr_gen, o0, o1, o2), v0, v1, v2, c, result);
33281 if (synthesis_result)
33283 else if (!expr_gen.valid_operator(o2,f2))
33284 return error_node();
33288 return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, v2, c, f0,
f1, f2);
33297 <<
"((t" << expr_gen.
to_str(o0)
33298 <<
"t)" << expr_gen.
to_str(o1)
33299 <<
"t)" << expr_gen.
to_str(o2)
33320 const lcl_vovoc_t* vovoc =
static_cast<const lcl_vovoc_t*
>(branch[0]);
33321 const Type& v0 = vovoc->
t0();
33322 const Type& v1 = vovoc->t1();
33323 const Type c = vovoc->t2();
33337 const bool synthesis_result =
33338 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
33339 (expr_gen,
id(expr_gen, o0, o1, o2), v0, v1, c, v2, result);
33341 if (synthesis_result)
33343 else if (!expr_gen.valid_operator(o2,f2))
33344 return error_node();
33348 return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, c, v2, f0,
f1, f2);
33357 <<
"((t" << expr_gen.
to_str(o0)
33358 <<
"t)" << expr_gen.
to_str(o1)
33359 <<
"t)" << expr_gen.
to_str(o2)
33380 const lcl_vocov_t* vocov =
static_cast<const lcl_vocov_t*
>(branch[0]);
33381 const Type& v0 = vocov->
t0();
33382 const Type c = vocov->t1();
33383 const Type& v1 = vocov->t2();
33397 const bool synthesis_result =
33398 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
33399 (expr_gen,
id(expr_gen, o0, o1, o2), v0, c, v1, v2, result);
33401 if (synthesis_result)
33403 else if (!expr_gen.valid_operator(o2,f2))
33404 return error_node();
33408 return node_type::allocate(*(expr_gen.node_allocator_), v0, c, v1, v2, f0,
f1, f2);
33417 <<
"((t" << expr_gen.
to_str(o0)
33418 <<
"t)" << expr_gen.
to_str(o1)
33419 <<
"t)" << expr_gen.
to_str(o2)
33440 const lcl_covov_t* covov =
static_cast<const lcl_covov_t*
>(branch[0]);
33441 const Type c = covov->
t0();
33442 const Type& v0 = covov->t1();
33443 const Type& v1 = covov->t2();
33457 const bool synthesis_result =
33458 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
33459 (expr_gen,
id(expr_gen, o0, o1, o2), c, v0, v1, v2, result);
33461 if (synthesis_result)
33463 else if (!expr_gen.valid_operator(o2,f2))
33464 return error_node();
33468 return node_type::allocate(*(expr_gen.node_allocator_), c, v0, v1, v2, f0,
f1, f2);
33477 <<
"((t" << expr_gen.
to_str(o0)
33478 <<
"t)" << expr_gen.
to_str(o1)
33479 <<
"t)" << expr_gen.
to_str(o2)
33500 const lcl_covoc_t* covoc =
static_cast<const lcl_covoc_t*
>(branch[0]);
33501 const Type c0 = covoc->
t0();
33502 const Type& v0 = covoc->t1();
33503 const Type c1 = covoc->t2();
33517 const bool synthesis_result =
33518 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
33519 (expr_gen,
id(expr_gen, o0, o1, o2), c0, v0, c1, v1, result);
33521 if (synthesis_result)
33523 else if (!expr_gen.valid_operator(o2,f2))
33524 return error_node();
33528 return node_type::allocate(*(expr_gen.node_allocator_), c0, v0, c1, v1, f0,
f1, f2);
33537 <<
"((t" << expr_gen.
to_str(o0)
33538 <<
"t)" << expr_gen.
to_str(o1)
33539 <<
"t)" << expr_gen.
to_str(o2)
33560 const lcl_vocov_t* vocov =
static_cast<const lcl_vocov_t*
>(branch[0]);
33561 const Type& v0 = vocov->
t0();
33562 const Type c0 = vocov->t1();
33563 const Type& v1 = vocov->t2();
33578 const bool synthesis_result =
33579 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
33580 (expr_gen,
id(expr_gen, o0, o1, o2), v0, c0, v1, c1, result);
33582 if (synthesis_result)
33584 else if (!expr_gen.valid_operator(o2,f2))
33585 return error_node();
33589 return node_type::allocate(*(expr_gen.node_allocator_), v0, c0, v1, c1, f0,
f1, f2);
33598 <<
"((t" << expr_gen.
to_str(o0)
33599 <<
"t)" << expr_gen.
to_str(o1)
33600 <<
"t)" << expr_gen.
to_str(o2)
33621 const lcl_covov_t* covov =
static_cast<const lcl_covov_t*
>(branch[0]);
33622 const Type c0 = covov->
t0();
33623 const Type& v0 = covov->t1();
33624 const Type& v1 = covov->t2();
33639 const bool synthesis_result =
33640 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
33641 (expr_gen,
id(expr_gen, o0, o1, o2), c0, v0, v1, c1, result);
33643 if (synthesis_result)
33645 else if (!expr_gen.valid_operator(o2,f2))
33646 return error_node();
33650 return node_type::allocate(*(expr_gen.node_allocator_), c0, v0, v1, c1, f0,
f1, f2);
33659 <<
"((t" << expr_gen.
to_str(o0)
33660 <<
"t)" << expr_gen.
to_str(o1)
33661 <<
"t)" << expr_gen.
to_str(o2)
33682 const lcl_vococ_t* vococ =
static_cast<const lcl_vococ_t*
>(branch[0]);
33683 const Type& v0 = vococ->
t0();
33684 const Type c0 = vococ->t1();
33685 const Type c1 = vococ->t2();
33699 const bool synthesis_result =
33700 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
33701 (expr_gen,
id(expr_gen, o0, o1, o2), v0, c0, c1, v1, result);
33703 if (synthesis_result)
33705 else if (!expr_gen.valid_operator(o2,f2))
33706 return error_node();
33710 return node_type::allocate(*(expr_gen.node_allocator_), v0, c0, c1, v1, f0,
f1, f2);
33719 <<
"((t" << expr_gen.
to_str(o0)
33720 <<
"t)" << expr_gen.
to_str(o1)
33721 <<
"t)" << expr_gen.
to_str(o2)
33742 const lcl_vovov_t* vovov =
static_cast<const lcl_vovov_t*
>(branch[0]);
33743 const Type& v0 = vovov->
t0();
33744 const Type& v1 = vovov->t1();
33745 const Type& v2 = vovov->t2();
33759 const bool synthesis_result =
33760 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
33761 (expr_gen,
id(expr_gen, o0, o1, o2), v0, v1, v2, v3, result);
33763 if (synthesis_result)
33765 else if (!expr_gen.valid_operator(o2,f2))
33766 return error_node();
33770 return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, v2, v3, f0,
f1, f2);
33779 <<
"(t" << expr_gen.
to_str(o0)
33780 <<
"(t" << expr_gen.
to_str(o1)
33781 <<
"t)" << expr_gen.
to_str(o2)
33802 const lcl_vovov_t* vovov =
static_cast<const lcl_vovov_t*
>(branch[0]);
33803 const Type& v0 = vovov->
t0();
33804 const Type& v1 = vovov->t1();
33805 const Type& v2 = vovov->t2();
33820 const bool synthesis_result =
33821 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
33822 (expr_gen,
id(expr_gen, o0, o1, o2), v0, v1, v2, c, result);
33824 if (synthesis_result)
33826 else if (!expr_gen.valid_operator(o2,f2))
33827 return error_node();
33831 return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, v2, c, f0,
f1, f2);
33840 <<
"(t" << expr_gen.
to_str(o0)
33841 <<
"(t" << expr_gen.
to_str(o1)
33842 <<
"t)" << expr_gen.
to_str(o2)
33863 const lcl_vovoc_t* vovoc =
static_cast<const lcl_vovoc_t*
>(branch[0]);
33864 const Type& v0 = vovoc->
t0();
33865 const Type& v1 = vovoc->t1();
33866 const Type c = vovoc->t2();
33880 const bool synthesis_result =
33881 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
33882 (expr_gen,
id(expr_gen, o0, o1, o2), v0, v1, c, v2, result);
33884 if (synthesis_result)
33886 else if (!expr_gen.valid_operator(o2,f2))
33887 return error_node();
33891 return node_type::allocate(*(expr_gen.node_allocator_), v0, v1, c, v2, f0,
f1, f2);
33900 <<
"(t" << expr_gen.
to_str(o0)
33901 <<
"(t" << expr_gen.
to_str(o1)
33902 <<
"t)" << expr_gen.
to_str(o2)
33923 const lcl_vocov_t* vocov =
static_cast<const lcl_vocov_t*
>(branch[0]);
33924 const Type& v0 = vocov->
t0();
33925 const Type c = vocov->t1();
33926 const Type& v1 = vocov->t2();
33939 const bool synthesis_result =
33940 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
33941 (expr_gen,
id(expr_gen, o0, o1, o2), v0, c, v1, v2, result);
33943 if (synthesis_result)
33945 else if (!expr_gen.valid_operator(o2,f2))
33946 return error_node();
33950 return node_type::allocate(*(expr_gen.node_allocator_), v0, c, v1, v2, f0,
f1, f2);
33959 <<
"(t" << expr_gen.
to_str(o0)
33960 <<
"(t" << expr_gen.
to_str(o1)
33961 <<
"t)" << expr_gen.
to_str(o2)
33982 const lcl_covov_t* covov =
static_cast<const lcl_covov_t*
>(branch[0]);
33983 const Type c = covov->
t0();
33984 const Type& v0 = covov->t1();
33985 const Type& v1 = covov->t2();
33999 const bool synthesis_result =
34000 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
34001 (expr_gen,
id(expr_gen, o0, o1, o2), c, v0, v1, v2, result);
34003 if (synthesis_result)
34005 else if (!expr_gen.valid_operator(o2,f2))
34006 return error_node();
34010 return node_type::allocate(*(expr_gen.node_allocator_), c, v0, v1, v2, f0,
f1, f2);
34019 <<
"(t" << expr_gen.
to_str(o0)
34020 <<
"(t" << expr_gen.
to_str(o1)
34021 <<
"t)" << expr_gen.
to_str(o2)
34042 const lcl_covoc_t* covoc =
static_cast<const lcl_covoc_t*
>(branch[0]);
34043 const Type c0 = covoc->
t0();
34044 const Type& v0 = covoc->t1();
34045 const Type c1 = covoc->t2();
34059 const bool synthesis_result =
34060 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
34061 (expr_gen,
id(expr_gen, o0, o1, o2), c0, v0, c1, v1, result);
34063 if (synthesis_result)
34065 else if (!expr_gen.valid_operator(o2,f2))
34066 return error_node();
34070 return node_type::allocate(*(expr_gen.node_allocator_), c0, v0, c1, v1, f0,
f1, f2);
34079 <<
"(t" << expr_gen.
to_str(o0)
34080 <<
"(t" << expr_gen.
to_str(o1)
34081 <<
"t)" << expr_gen.
to_str(o2)
34102 const lcl_vocov_t* vocov =
static_cast<const lcl_vocov_t*
>(branch[0]);
34103 const Type& v0 = vocov->
t0();
34104 const Type c0 = vocov->t1();
34105 const Type& v1 = vocov->t2();
34120 const bool synthesis_result =
34121 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
34122 (expr_gen,
id(expr_gen, o0, o1, o2), v0, c0, v1, c1, result);
34124 if (synthesis_result)
34126 else if (!expr_gen.valid_operator(o2,f2))
34127 return error_node();
34131 return node_type::allocate(*(expr_gen.node_allocator_), v0, c0, v1, c1, f0,
f1, f2);
34140 <<
"(t" << expr_gen.
to_str(o0)
34141 <<
"(t" << expr_gen.
to_str(o1)
34142 <<
"t)" << expr_gen.
to_str(o2)
34163 const lcl_covov_t* covov =
static_cast<const lcl_covov_t*
>(branch[0]);
34164 const Type c0 = covov->
t0();
34165 const Type& v0 = covov->t1();
34166 const Type& v1 = covov->t2();
34181 const bool synthesis_result =
34182 synthesize_sf4ext_expression::template compile<T0, T1, T2, T3>
34183 (expr_gen,
id(expr_gen, o0, o1, o2), c0, v0, v1, c1, result);
34185 if (synthesis_result)
34187 else if (!expr_gen.valid_operator(o2,f2))
34188 return error_node();
34192 return node_type::allocate(*(expr_gen.node_allocator_), c0, v0, v1, c1, f0,
f1, f2);
34201 <<
"(t" << expr_gen.
to_str(o0)
34202 <<
"(t" << expr_gen.
to_str(o1)
34203 <<
"t)" << expr_gen.
to_str(o2)
34214 exprtk_debug((
"((v0 o0 (c0 o1 c1)) o2 v1) - Not possible\n"));
34215 return error_node();
34237 if (!valid_operator(o0,u0))
34238 return error_node();
34239 else if (!valid_operator(o1,u1))
34240 return error_node();
34241 else if (!valid_operator(operation,
f))
34242 return error_node();
34256 allocate_rr<
typename details::
34257 vov_node<Type,details::add_op<Type> > >(v0, v1));
34263 allocate_rr<
typename details::
34264 vov_node<Type,details::sub_op<Type> > >(v1, v0);
34270 allocate_rr<
typename details::
34271 vov_node<Type,details::mul_op<Type> > >(v0, v1);
34277 allocate_rr<
typename details::
34278 vov_node<Type,details::div_op<Type> > >(v0, v1);
34288 result = node_allocator_->
34289 allocate_rrrrr<typename details::uvouv_node<Type> >(v0, v1, u0, u1,
f);
34296 #undef basic_opr_switch_statements 34297 #undef extended_opr_switch_statements 34298 #undef unary_opr_switch_statements 34300 #ifndef exprtk_disable_string_capabilities 34302 #define string_opr_switch_statements \ 34303 case_stmt(details:: e_lt ,details:: lt_op) \ 34304 case_stmt(details:: e_lte ,details:: lte_op) \ 34305 case_stmt(details:: e_gt ,details:: gt_op) \ 34306 case_stmt(details:: e_gte ,details:: gte_op) \ 34307 case_stmt(details:: e_eq ,details:: eq_op) \ 34308 case_stmt(details:: e_ne ,details:: ne_op) \ 34309 case_stmt(details::e_in ,details:: in_op) \ 34310 case_stmt(details::e_like ,details:: like_op) \ 34311 case_stmt(details::e_ilike,details::ilike_op) \ 34313 template <
typename T0,
typename T1>
34320 #define case_stmt(op0,op1) \ 34321 case op0 : return node_allocator_-> \ 34322 allocate_ttt<typename details::str_xrox_node<Type,T0,T1,range_t,op1<Type> >,T0,T1> \ 34327 default :
return error_node();
34331 template <
typename T0,
typename T1>
34338 #define case_stmt(op0,op1) \ 34339 case op0 : return node_allocator_-> \ 34340 allocate_ttt<typename details::str_xoxr_node<Type,T0,T1,range_t,op1<Type> >,T0,T1> \ 34345 default :
return error_node();
34349 template <
typename T0,
typename T1>
34356 #define case_stmt(op0,op1) \ 34357 case op0 : return node_allocator_-> \ 34358 allocate_tttt<typename details::str_xroxr_node<Type,T0,T1,range_t,op1<Type> >,T0,T1> \ 34359 (s0, s1, rp0, rp1); \ 34363 default :
return error_node();
34367 template <
typename T0,
typename T1>
34372 #define case_stmt(op0,op1) \ 34373 case op0 : return node_allocator_-> \ 34374 allocate_tt<typename details::sos_node<Type,T0,T1,op1<Type> >,T0,T1>(s0, s1); \ 34378 default :
return error_node();
34387 return synthesize_sos_expression_impl<std::string&,std::string&>(opr, s0, s1);
34400 return synthesize_str_xrox_expression_impl<std::string&,std::string&>(opr, s0, s1, rp0);
34413 return synthesize_str_xoxr_expression_impl<std::string&,std::string&>(opr, s0, s1, rp1);
34426 return synthesize_str_xoxr_expression_impl<std::string&, const std::string>(opr, s0, s1, rp1);
34442 return synthesize_str_xroxr_expression_impl<std::string&,std::string&>(opr, s0, s1, rp0, rp1);
34452 return synthesize_sos_expression_impl<std::string&, const std::string>(opr, s0, s1);
34462 return synthesize_sos_expression_impl<const std::string,std::string&>(opr, s0, s1);
34476 return synthesize_str_xoxr_expression_impl<const std::string,std::string&>(opr, s0, s1, rp1);
34490 return synthesize_str_xrox_expression_impl<std::string&, const std::string>(opr, s0, s1, rp0);
34506 return synthesize_str_xroxr_expression_impl<std::string&, const std::string>(opr, s0, s1, rp0, rp1);
34526 expression_node_ptr temp = synthesize_sos_expression_impl<const std::string, const std::string>(opr, s0, s1);
34528 const Type v = temp->
value();
34551 return synthesize_str_xoxr_expression_impl<const std::string, const std::string>(opr, s0, s1, rp1);
34564 return synthesize_str_xrox_expression_impl<const std::string,std::string&>(opr, s0, s1, rp0);
34580 return synthesize_str_xroxr_expression_impl<const std::string,std::string&>(opr, s0, s1, rp0, rp1);
34593 return synthesize_str_xrox_expression_impl<const std::string,std::string>(opr, s0, s1, rp0);
34608 return synthesize_str_xroxr_expression_impl<const std::string, const std::string>(opr, s0, s1, rp0, rp1);
34615 #define case_stmt(op0,op1) \ 34616 case op0 : return node_allocator_-> \ 34617 allocate_ttt<typename details::str_sogens_node<Type,op1<Type> > > \ 34618 (opr, branch[0], branch[1]); \ 34622 default :
return error_node();
34627 #ifndef exprtk_disable_string_capabilities 34630 if ((0 == branch[0]) || (0 == branch[1]))
34634 return error_node();
34665 if (!b0_is_cs || !b1_is_cs)
34667 return synthesize_expression<string_concat_node_t,2>(opr,branch);
34671 if (b0_is_gen || b1_is_gen)
34673 return synthesize_strogen_expression(opr,branch);
34677 if (b1_is_s )
return synthesize_sos_expression (opr,branch);
34678 else if (b1_is_cs )
return synthesize_socs_expression (opr,branch);
34679 else if (b1_is_sr )
return synthesize_sosr_expression (opr,branch);
34680 else if (b1_is_csr)
return synthesize_socsr_expression (opr,branch);
34684 if (b1_is_s )
return synthesize_csos_expression (opr,branch);
34685 else if (b1_is_cs )
return synthesize_csocs_expression (opr,branch);
34686 else if (b1_is_sr )
return synthesize_csosr_expression (opr,branch);
34687 else if (b1_is_csr)
return synthesize_csocsr_expression(opr,branch);
34691 if (b1_is_s )
return synthesize_sros_expression (opr,branch);
34692 else if (b1_is_sr )
return synthesize_srosr_expression (opr,branch);
34693 else if (b1_is_cs )
return synthesize_srocs_expression (opr,branch);
34694 else if (b1_is_csr)
return synthesize_srocsr_expression(opr,branch);
34696 else if (b0_is_csr)
34698 if (b1_is_s )
return synthesize_csros_expression (opr,branch);
34699 else if (b1_is_sr )
return synthesize_csrosr_expression (opr,branch);
34700 else if (b1_is_cs )
return synthesize_csrocs_expression (opr,branch);
34701 else if (b1_is_csr)
return synthesize_csrocsr_expression(opr,branch);
34704 return error_node();
34710 return error_node();
34714 #ifndef exprtk_disable_string_capabilities 34718 return error_node();
34719 else if ((0 == branch[0]) || (0 == branch[1]) || (0 == branch[2]))
34723 return error_node();
34735 const Type v = (((s0 <= s1) && (s1 <= s2)) ? Type(1) : Type(0));
34821 return error_node();
34827 return error_node();
34849 if (b0_null && b1_null)
34873 allocate_rc<nulleq_node_t>(branch[b0_null ? 0 : 1],
true);
34882 allocate_rc<nulleq_node_t>(branch[b0_null ? 0 : 1],
false);
34891 branch[0] = branch[1];
34892 branch[1] = error_node();
34897 branch[1] = error_node();
34926 template <
typename NodeType, std::
size_t N>
34937 return error_node();
34939 else if (!details::all_nodes_valid<N>(branch))
34943 return error_node();
34948 expression_node_ptr expression_point = node_allocator_->allocate<NodeType>(operation,branch);
34950 if (is_constant_foldable<N>(branch))
34952 Type v = expression_point->
value();
34958 return expression_point;
34961 return error_node();
34964 template <
typename NodeType, std::
size_t N>
34967 if (!details::all_nodes_valid<N>(branch))
34971 return error_node();
34979 function_N_node_t* func_node_ptr =
dynamic_cast<function_N_node_t*
>(expression_point);
34981 if (0 == func_node_ptr)
34985 return error_node();
34988 func_node_ptr->init_branches(branch);
34990 if (is_constant_foldable<N>(branch) && !
f->has_side_effects())
34992 Type v = expression_point->
value();
34998 parser_->state_.activate_side_effect(
"synthesize_expression(function<NT,N>)");
35000 return expression_point;
35016 error_list_.push_back(error_type);
35021 if (!error_list_.empty())
35023 error_list_.pop_back();
35029 if (synthesis_error_.empty())
35031 synthesis_error_ = synthesis_error_message;
35037 for (std::size_t i = 0; i < sem_.size(); ++i)
35039 scope_element& se = sem_.get_element(i);
35042 (scope_element::e_variable == se.type) ||
35043 (scope_element::e_vecelem == se.type)
35048 e.register_local_var(se.var_node);
35053 e.register_local_data(se.data, 1, 0);
35056 else if (scope_element::e_vector == se.type)
35060 e.register_local_var(se.vec_node);
35065 e.register_local_data(se.data, se.size, 1);
35068 #ifndef exprtk_disable_string_capabilities 35069 else if (scope_element::e_string == se.type)
35073 e.register_local_var(se.str_node);
35078 e.register_local_data(se.data, se.size, 2);
35085 #ifndef exprtk_disable_string_capabilities 35096 e.register_return_results(results_context_);
35097 results_context_ = 0;
35102 #define register_unary_op(Op,UnaryFunctor) \ 35103 m.insert(std::make_pair(Op,UnaryFunctor<T>::process)); \ 35144 #undef register_unary_op 35151 #define register_binary_op(Op,BinaryFunctor) \ 35152 m.insert(value_type(Op,BinaryFunctor<T>::process)); \ 35172 #undef register_binary_op 35179 #define register_binary_op(Op,BinaryFunctor) \ 35180 m.insert(value_type(BinaryFunctor<T>::process,Op)); \ 35200 #undef register_binary_op 35205 typedef std::pair<trinary_functor_t,details::operator_type> pair_t;
35207 #define register_sf3(Op) \ 35208 sf3_map[details::sf##Op##_op<T>::id()] = pair_t(details::sf##Op##_op<T>::process,details::e_sf##Op); \ 35218 #undef register_sf3 35220 #define register_sf3_extid(Id, Op) \ 35221 sf3_map[Id] = pair_t(details::sf##Op##_op<T>::process,details::e_sf##Op); \ 35224 #undef register_sf3_extid 35229 typedef std::pair<quaternary_functor_t,details::operator_type> pair_t;
35231 #define register_sf4(Op) \ 35232 sf4_map[details::sf##Op##_op<T>::id()] = pair_t(details::sf##Op##_op<T>::process,details::e_sf##Op); \ 35243 #undef register_sf4 35245 #define register_sf4ext(Op) \ 35246 sf4_map[details::sfext##Op##_op<T>::id()] = pair_t(details::sfext##Op##_op<T>::process,details::e_sf4ext##Op); \ 35264 #undef register_sf4ext 35269 if (0 == results_context_)
35274 return (*results_context_);
35279 #ifndef exprtk_disable_return_statement 35280 if (results_context_)
35282 delete results_context_;
35283 results_context_ = 0;
35286 state_.return_stmt_present =
false;
35327 template <
typename ParserType>
35331 template <
typename Allocator,
35332 template <
typename,
typename>
class Sequence>
35334 Sequence<std::string, Allocator>& symbol_list)
35340 typedef parser_t::dependent_entity_collector::symbol_t symbol_t;
35354 std::deque<symbol_t> symb_list;
35358 for (std::size_t i = 0; i < symb_list.size(); ++i)
35360 symbol_list.push_back(symb_list[i].first);
35366 template <
typename T,
35367 typename Allocator,
35368 template <
typename,
typename>
class Sequence>
35371 Sequence<std::string, Allocator>& symbol_list)
35376 typedef typename parser_t::dependent_entity_collector::symbol_t symbol_t;
35393 std::deque<symbol_t> symb_list;
35397 for (std::size_t i = 0; i < symb_list.size(); ++i)
35399 symbol_list.push_back(symb_list[i].first);
35405 template <
typename Allocator,
35406 template <
typename,
typename>
class Sequence>
35408 Sequence<std::string, Allocator>& symbol_list)
35414 typedef parser_t::dependent_entity_collector::symbol_t symbol_t;
35428 std::deque<symbol_t> symb_list;
35432 for (std::size_t i = 0; i < symb_list.size(); ++i)
35434 symbol_list.push_back(symb_list[i].first);
35440 template <
typename T,
35441 typename Allocator,
35442 template <
typename,
typename>
class Sequence>
35445 Sequence<std::string, Allocator>& symbol_list)
35450 typedef typename parser_t::dependent_entity_collector::symbol_t symbol_t;
35467 std::deque<symbol_t> symb_list;
35471 for (std::size_t i = 0; i < symb_list.size(); ++i)
35473 symbol_list.push_back(symb_list[i].first);
35479 template <
typename T>
35482 const T& r0,
const T& r1,
35483 const std::size_t number_of_intervals = 1000000)
35488 const T h = (r1 - r0) / (T(2) * number_of_intervals);
35489 T total_area = T(0);
35491 for (std::size_t i = 0; i < number_of_intervals; ++i)
35493 x = r0 + T(2) * i * h;
35494 const T y0 =
e.value();
x += h;
35495 const T y1 =
e.value();
x += h;
35496 const T y2 =
e.value();
x += h;
35497 total_area += h * (y0 + T(4) * y1 + y2) / T(3);
35503 template <
typename T>
35506 const T& r0,
const T& r1,
35507 const std::size_t number_of_intervals = 1000000)
35511 if (!sym_table.
valid())
35512 return std::numeric_limits<T>::quiet_NaN();
35520 T result =
integrate(
e,
x, r0, r1, number_of_intervals);
35526 return std::numeric_limits<T>::quiet_NaN();
35529 template <
typename T>
35532 const T& h = T(0.00000001))
35534 const T x_init =
x;
35535 const T _2h = T(2) * h;
35538 const T y0 =
e.value();
35540 const T y1 =
e.value();
35542 const T y2 =
e.value();
35544 const T y3 =
e.value();
35547 return (-y0 + T(8) * (y1 - y2) + y3) / (T(12) * h);
35550 template <
typename T>
35553 const T& h = T(0.00001))
35555 const T x_init =
x;
35556 const T _2h = T(2) * h;
35558 const T y =
e.value();
35560 const T y0 =
e.value();
35562 const T y1 =
e.value();
35564 const T y2 =
e.value();
35566 const T y3 =
e.value();
35569 return (-y0 + T(16) * (y1 + y2) - T(30) * y - y3) / (T(12) * h * h);
35572 template <
typename T>
35575 const T& h = T(0.0001))
35577 const T x_init =
x;
35578 const T _2h = T(2) * h;
35581 const T y0 =
e.value();
35583 const T y1 =
e.value();
35585 const T y2 =
e.value();
35587 const T y3 =
e.value();
35590 return (y0 + T(2) * (y2 - y1) - y3) / (T(2) * h * h * h);
35593 template <
typename T>
35596 const T& h = T(0.00000001))
35600 if (!sym_table.
valid())
35602 return std::numeric_limits<T>::quiet_NaN();
35617 return std::numeric_limits<T>::quiet_NaN();
35620 template <
typename T>
35623 const T& h = T(0.00001))
35627 if (!sym_table.
valid())
35629 return std::numeric_limits<T>::quiet_NaN();
35637 const T x_original =
x;
35644 return std::numeric_limits<T>::quiet_NaN();
35647 template <
typename T>
35650 const T& h = T(0.0001))
35654 if (!sym_table.
valid())
35656 return std::numeric_limits<T>::quiet_NaN();
35664 const T x_original =
x;
35671 return std::numeric_limits<T>::quiet_NaN();
35684 template <
typename T>
35706 template <
typename T>
35733 template <
typename T>
35735 const T&
x,
const T& y,
35762 template <
typename T>
35764 const T&
x,
const T& y,
const T&
z,
35793 template <
typename T, std::
size_t N>
35798 template <
typename Type, std::
size_t NumberOfCoefficients>
35801 template <
typename Type>
35805 const Type c12,
const Type c11,
const Type c10,
const Type c9,
const Type c8,
35806 const Type c7,
const Type c6,
const Type c5,
const Type c4,
const Type c3,
35807 const Type c2,
const Type c1,
const Type c0)
35810 return ((((((((((((c12 *
x + c11) *
x + c10) *
x + c9) *
x + c8) *
x + c7) *
x + c6) *
x + c5) *
x + c4) *
x + c3) *
x + c2) *
x + c1) *
x + c0);
35814 template <
typename Type>
35818 const Type c11,
const Type c10,
const Type c9,
const Type c8,
const Type c7,
35819 const Type c6,
const Type c5,
const Type c4,
const Type c3,
const Type c2,
35820 const Type c1,
const Type c0)
35823 return (((((((((((c11 *
x + c10) *
x + c9) *
x + c8) *
x + c7) *
x + c6) *
x + c5) *
x + c4) *
x + c3) *
x + c2) *
x + c1) *
x + c0);
35827 template <
typename Type>
35831 const Type c10,
const Type c9,
const Type c8,
const Type c7,
const Type c6,
35832 const Type c5,
const Type c4,
const Type c3,
const Type c2,
const Type c1,
35836 return ((((((((((c10 *
x + c9) *
x + c8) *
x + c7) *
x + c6) *
x + c5) *
x + c4) *
x + c3) *
x + c2) *
x + c1) *
x + c0);
35840 template <
typename Type>
35844 const Type c9,
const Type c8,
const Type c7,
const Type c6,
const Type c5,
35845 const Type c4,
const Type c3,
const Type c2,
const Type c1,
const Type c0)
35848 return (((((((((c9 *
x + c8) *
x + c7) *
x + c6) *
x + c5) *
x + c4) *
x + c3) *
x + c2) *
x + c1) *
x + c0);
35852 template <
typename Type>
35856 const Type c8,
const Type c7,
const Type c6,
const Type c5,
const Type c4,
35857 const Type c3,
const Type c2,
const Type c1,
const Type c0)
35860 return ((((((((c8 *
x + c7) *
x + c6) *
x + c5) *
x + c4) *
x + c3) *
x + c2) *
x + c1) *
x + c0);
35864 template <
typename Type>
35868 const Type c7,
const Type c6,
const Type c5,
const Type c4,
const Type c3,
35869 const Type c2,
const Type c1,
const Type c0)
35872 return (((((((c7 *
x + c6) *
x + c5) *
x + c4) *
x + c3) *
x + c2) *
x + c1) *
x + c0);
35876 template <
typename Type>
35880 const Type c6,
const Type c5,
const Type c4,
const Type c3,
const Type c2,
35881 const Type c1,
const Type c0)
35884 return ((((((c6 *
x + c5) *
x + c4) *
x + c3) *
x + c2) *
x + c1) *
x + c0);
35888 template <
typename Type>
35892 const Type c5,
const Type c4,
const Type c3,
const Type c2,
35893 const Type c1,
const Type c0)
35896 return (((((c5 *
x + c4) *
x + c3) *
x + c2) *
x + c1) *
x + c0);
35900 template <
typename Type>
35903 static inline T
evaluate(
const Type
x,
const Type c4,
const Type c3,
const Type c2,
const Type c1,
const Type c0)
35906 return ((((c4 *
x + c3) *
x + c2) *
x + c1) *
x + c0);
35910 template <
typename Type>
35913 static inline T
evaluate(
const Type
x,
const Type c3,
const Type c2,
const Type c1,
const Type c0)
35916 return (((c3 *
x + c2) *
x + c1) *
x + c0);
35920 template <
typename Type>
35923 static inline T
evaluate(
const Type
x,
const Type c2,
const Type c1,
const Type c0)
35926 return ((c2 *
x + c1) *
x + c0);
35930 template <
typename Type>
35933 static inline T
evaluate(
const Type
x,
const Type c1,
const Type c0)
35936 return (c1 *
x + c0);
35953 #define poly_rtrn(NN) \ 35954 return (NN != N) ? std::numeric_limits<T>::quiet_NaN() : 35956 inline virtual T operator() (
const T&
x,
const T& c1,
const T& c0)
35961 inline virtual T operator() (
const T&
x,
const T& c2,
const T& c1,
const T& c0)
35966 inline virtual T operator() (
const T&
x,
const T& c3,
const T& c2,
const T& c1,
const T& c0)
35971 inline virtual T operator() (
const T&
x,
const T& c4,
const T& c3,
const T& c2,
const T& c1,
const T& c0)
35976 inline virtual T operator() (
const T&
x,
const T& c5,
const T& c4,
const T& c3,
const T& c2,
const T& c1,
const T& c0)
35981 inline virtual T operator() (
const T&
x,
const T& c6,
const T& c5,
const T& c4,
const T& c3,
const T& c2,
const T& c1,
const T& c0)
35986 inline virtual T operator() (
const T&
x,
const T& c7,
const T& c6,
const T& c5,
const T& c4,
const T& c3,
const T& c2,
const T& c1,
const T& c0)
35991 inline virtual T operator() (
const T&
x,
const T& c8,
const T& c7,
const T& c6,
const T& c5,
const T& c4,
const T& c3,
const T& c2,
const T& c1,
const T& c0)
35993 poly_rtrn(8)
poly_impl<T,8>::evaluate(
x,c8,c7,c6,c5,c4,c3,c2,c1,c0);
35996 inline virtual T operator() (
const T&
x,
const T& c9,
const T& c8,
const T& c7,
const T& c6,
const T& c5,
const T& c4,
const T& c3,
const T& c2,
const T& c1,
const T& c0)
35998 poly_rtrn(9)
poly_impl<T,9>::evaluate(
x,c9,c8,c7,c6,c5,c4,c3,c2,c1,c0);
36001 inline virtual T operator() (
const T&
x,
const T& c10,
const T& c9,
const T& c8,
const T& c7,
const T& c6,
const T& c5,
const T& c4,
const T& c3,
const T& c2,
const T& c1,
const T& c0)
36003 poly_rtrn(10)
poly_impl<T,10>::evaluate(
x,c10,c9,c8,c7,c6,c5,c4,c3,c2,c1,c0);
36006 inline virtual T operator() (
const T&
x,
const T& c11,
const T& c10,
const T& c9,
const T& c8,
const T& c7,
const T& c6,
const T& c5,
const T& c4,
const T& c3,
const T& c2,
const T& c1,
const T& c0)
36008 poly_rtrn(11)
poly_impl<T,11>::evaluate(
x,c11,c10,c9,c8,c7,c6,c5,c4,c3,c2,c1,c0);
36011 inline virtual T operator() (
const T&
x,
const T& c12,
const T& c11,
const T& c10,
const T& c9,
const T& c8,
const T& c7,
const T& c6,
const T& c5,
const T& c4,
const T& c3,
const T& c2,
const T& c1,
const T& c0)
36013 poly_rtrn(12)
poly_impl<T,12>::evaluate(
x,c12,c11,c10,c9,c8,c7,c6,c5,c4,c3,c2,c1,c0);
36018 inline virtual T operator() ()
36020 return std::numeric_limits<T>::quiet_NaN();
36023 inline virtual T operator() (
const T&)
36025 return std::numeric_limits<T>::quiet_NaN();
36028 inline virtual T operator() (
const T&,
const T&)
36030 return std::numeric_limits<T>::quiet_NaN();
36034 template <
typename T>
36035 class function_compositor
36074 v_.push_back(v0); v_.push_back(v1);
36084 v_.push_back(v0); v_.push_back(v1);
36095 v_.push_back(v0); v_.push_back(v1);
36096 v_.push_back(v2); v_.push_back(v3);
36107 v_.push_back(v0); v_.push_back(v1);
36108 v_.push_back(v2); v_.push_back(v3);
36150 local_var_stack_size(0),
36166 (*v[0]) = v0; (*v[1]) = v1;
36169 inline void update(
const T& v0,
const T& v1,
const T& v2)
36171 (*v[0]) = v0; (*v[1]) = v1;
36175 inline void update(
const T& v0,
const T& v1,
const T& v2,
const T& v3)
36177 (*v[0]) = v0; (*v[1]) = v1;
36178 (*v[2]) = v2; (*v[3]) = v3;
36181 inline void update(
const T& v0,
const T& v1,
const T& v2,
const T& v3,
const T& v4)
36183 (*v[0]) = v0; (*v[1]) = v1;
36184 (*v[2]) = v2; (*v[3]) = v3;
36188 inline void update(
const T& v0,
const T& v1,
const T& v2,
const T& v3,
const T& v4,
const T& v5)
36190 (*v[0]) = v0; (*v[1]) = v1;
36191 (*v[2]) = v2; (*v[3]) = v3;
36192 (*v[4]) = v4; (*v[5]) = v5;
36199 typedef typename expression_t::control_block::local_data_list_t ldl_t;
36203 std::vector<std::size_t> index_list;
36205 for (std::size_t i = 0; i < ldl.size(); ++i)
36209 index_list.push_back(i);
36213 std::size_t input_param_count = 0;
36215 for (std::size_t i = 0; i < index_list.size(); ++i)
36217 const std::size_t index = index_list[i];
36219 if (i < (index_list.size() - v.size()))
36223 reinterpret_cast<T*>(ldl[index].pointer),
36226 local_var_stack_size += ldl[index].size;
36229 v[input_param_count++] =
reinterpret_cast<T*
>(ldl[index].pointer);
36243 var_t var_stack(v.size(),T(0));
36245 param_stack.push_back(var_stack);
36250 var_t local_var_stack(local_var_stack_size,T(0));
36251 copy(lv,local_var_stack);
36252 local_stack.push_back(local_var_stack);
36263 copy(param_stack.back(),v);
36264 param_stack.pop_back();
36269 copy(local_stack.back(),lv);
36270 local_stack.pop_back();
36277 for (std::size_t i = 0; i < src_v.size(); ++i)
36279 dest_v[i] = (*src_v[i]);
36285 for (std::size_t i = 0; i < src_v.size(); ++i)
36287 (*dest_v[i]) = src_v[i];
36293 typename var_t::iterator itr = dest_v.begin();
36294 typedef typename std::iterator_traits<typename var_t::iterator>::difference_type diff_t;
36296 for (std::size_t i = 0; i < src_v.size(); ++i)
36300 if (1 == vr.second)
36301 *itr++ = (*vr.first);
36304 std::copy(vr.first, vr.first + vr.second, itr);
36305 itr +=
static_cast<diff_t
>(vr.second);
36312 typename var_t::const_iterator itr = src_v.begin();
36313 typedef typename std::iterator_traits<typename var_t::iterator>::difference_type diff_t;
36315 for (std::size_t i = 0; i < src_v.size(); ++i)
36319 if (1 == vr.second)
36320 (*vr.first) = *itr++;
36323 std::copy(itr, itr + static_cast<diff_t>(vr.second), vr.first);
36324 itr +=
static_cast<diff_t
>(vr.second);
36331 for (std::size_t i = 0; i < v.size(); ++i)
36359 inline T operator() ()
36361 return this->
value(base_func::expression);
36367 template <
typename BaseFuncType>
36390 base_func::update(v0);
36391 return this->
value(base_func::expression);
36404 base_func::update(v0, v1);
36405 return this->
value(base_func::expression);
36418 base_func::update(v0, v1, v2);
36419 return this->
value(base_func::expression);
36432 base_func::update(v0, v1, v2, v3);
36433 return this->
value(base_func::expression);
36446 base_func::update(v0, v1, v2, v3, v4);
36447 return this->
value(base_func::expression);
36460 base_func::update(v0, v1, v2, v3, v4, v5);
36461 return this->
value(base_func::expression);
36468 typedef typename results_context_t::type_store_t type_t;
36469 typedef typename type_t::scalar_view scalar_t;
36471 T result =
e.value();
36473 if (
e.return_invoked())
36478 return scalar_t(
e.results()[0])();
36484 #define def_fp_retval(N) \ 36485 struct func_##N##param_retval : public func_##N##param \ 36487 inline T value(expression_t& e) \ 36489 return return_value(e); \ 36501 template <typename Allocator,
36502 template <typename, typename> class Sequence>
36505 const Sequence<
std::
string,Allocator>& var_list,
36506 const
bool override = false)
36508 const typename std::map<std::string,expression_t>::iterator itr = expr_map_.find(
name);
36510 if (expr_map_.end() != itr)
36514 exprtk_debug((
"Compositor error(add): function '%s' already defined\n",
36520 remove(
name, var_list.size());
36525 const std::size_t n = var_list.size();
36527 fp_map_[n][
name]->setup(expr_map_[
name]);
36533 exprtk_debug((
"Compositor error(add): Failed to compile function '%s'\n",
36549 : symbol_table_(st),
36562 return symbol_table_;
36567 auxiliary_symtab_list_.push_back(&symtab);
36572 symbol_table_.clear();
36573 expr_map_ .clear();
36575 for (std::size_t i = 0; i < fp_map_.size(); ++i)
36577 typename funcparam_t::iterator itr = fp_map_[i].begin();
36578 typename funcparam_t::iterator end = fp_map_[i].end ();
36582 delete itr->second;
36586 fp_map_[i].clear();
36590 inline bool add(
const function&
f,
const bool override =
false)
36592 return add(
f.name_,
f.expression_,
f.v_,
override);
36597 template <
typename Allocator,
36598 template <
typename,
typename>
class Sequence>
36601 const Sequence<std::string,Allocator>& input_var_list,
36602 bool return_present =
false)
36607 local_symbol_table.
load_from(symbol_table_);
36610 if (!valid(
name,input_var_list.size()))
36614 input_var_list.size(),
36615 local_symbol_table,
36621 for (std::size_t i = 0; i < auxiliary_symtab_list_.size(); ++i)
36628 for (std::size_t i = 0; i < input_var_list.size(); ++i)
36630 mod_expression +=
" var " + input_var_list[i] +
"{};\n";
36641 if (!parser_.compile(mod_expression,compiled_expression))
36643 exprtk_debug((
"Compositor Error: %s\n",parser_.error().c_str()));
36644 exprtk_debug((
"Compositor modified expression: \n%s\n",mod_expression.c_str()));
36646 remove(
name,input_var_list.size());
36651 if (!return_present && parser_.dec().return_present())
36653 remove(
name,input_var_list.size());
36655 return compile_expression(
name,
expression, input_var_list,
true);
36659 if (parser_.dec().return_present())
36661 typedef std::vector<std::string> str_list_t;
36663 str_list_t ret_param_list = parser_.dec().return_param_type_list();
36665 for (std::size_t i = 0; i < ret_param_list.size(); ++i)
36669 if (params.empty() || (
'T' != params[0]))
36671 exprtk_debug((
"Compositor Error: Return statement in function '%s' is invalid\n",
36674 remove(
name,input_var_list.size());
36681 expr_map_[
name] = compiled_expression;
36685 if (symbol_table_.add_function(
name,ifunc))
36689 exprtk_debug((
"Compositor Error: Failed to add function '%s' to symbol table\n",
36698 symbol_table_.is_variable (symbol) ||
36699 symbol_table_.is_stringvar (symbol) ||
36700 symbol_table_.is_function (symbol) ||
36701 symbol_table_.is_vector (symbol) ||
36702 symbol_table_.is_vararg_function(symbol)
36707 const std::size_t& arg_count)
const 36711 else if (symbol_used(
name))
36713 else if (fp_map_[arg_count].end() != fp_map_[arg_count].find(
name))
36720 const std::size_t& arg_count,
36722 const bool ret_present =
false)
36726 #define case_stmt(N) \ 36727 case N : (fp_map_[arg_count])[name] = \ 36728 (!ret_present) ? static_cast<base_func*> \ 36729 (new func_##N##param) : \ 36730 static_cast<base_func*> \ 36731 (new func_##N##param_retval) ; \ 36750 const typename std::map<std::string,expression_t>::iterator em_itr = expr_map_.find(
name);
36752 if (expr_map_.end() != em_itr)
36754 expr_map_.erase(em_itr);
36757 const typename funcparam_t::iterator fp_itr = fp_map_[arg_count].find(
name);
36759 if (fp_map_[arg_count].end() != fp_itr)
36761 delete fp_itr->second;
36762 fp_map_[arg_count].erase(fp_itr);
36765 symbol_table_.remove_function(
name);
36777 template <
typename T>
36785 "(y + x / y) * (x - y / x)",
36786 "x / ((x + y) * (x - y)) / y",
36787 "1 - ((x * y) + (y / x)) - 3",
36788 "sin(2 * x) + cos(pi / y)",
36789 "1 - sin(2 * x) + cos(pi / y)",
36790 "sqrt(1 - sin(2 * x) + cos(pi / y) / 3)",
36791 "(x^2 / sin(2 * pi / y)) -x / 2",
36792 "x + (cos(y - sin(2 / x * pi)) - sin(x - cos(2 * y / pi))) - y",
36793 "clamp(-1.0, sin(2 * pi * x) + cos(y / 2 * pi), +1.0)",
36794 "iclamp(-1.0, sin(2 * pi * x) + cos(y / 2 * pi), +1.0)",
36795 "max(3.33, min(sqrt(1 - sin(2 * x) + cos(pi / y) / 3), 1.11))",
36796 "if(avg(x,y) <= x + y, x - y, x * y) + 2 * pi / x",
36797 "1.1x^1 + 2.2y^2 - 3.3x^3 + 4.4y^4 - 5.5x^5 + 6.6y^6 - 7.7x^27 + 8.8y^55",
36800 "(2 * yy + 2 * xx)",
36801 "(yy + xx / yy) * (xx - yy / xx)",
36802 "xx / ((xx + yy) * (xx - yy)) / yy",
36803 "1 - ((xx * yy) + (yy / xx)) - 3",
36804 "sin(2 * xx) + cos(pi / yy)",
36805 "1 - sin(2 * xx) + cos(pi / yy)",
36806 "sqrt(1 - sin(2 * xx) + cos(pi / yy) / 3)",
36807 "(xx^2 / sin(2 * pi / yy)) -xx / 2",
36808 "xx + (cos(yy - sin(2 / xx * pi)) - sin(xx - cos(2 * yy / pi))) - yy",
36809 "clamp(-1.0, sin(2 * pi * xx) + cos(yy / 2 * pi), +1.0)",
36810 "max(3.33, min(sqrt(1 - sin(2 * xx) + cos(pi / yy) / 3), 1.11))",
36811 "if(avg(xx,yy) <= xx + yy, xx - yy, xx * yy) + 2 * pi / xx",
36812 "1.1xx^1 + 2.2yy^2 - 3.3xx^3 + 4.4yy^4 - 5.5xx^5 + 6.6yy^6 - 7.7xx^27 + 8.8yy^55",
36813 "(1.1*(2.2*(3.3*(4.4*(5.5*(6.6*(7.7*(8.8*(9.9+x)))))))))",
36814 "(((((((((x+9.9)*8.8)*7.7)*6.6)*5.5)*4.4)*3.3)*2.2)*1.1)",
36815 "(x + y) * z",
"x + (y * z)",
"(x + y) * 7",
"x + (y * 7)",
36816 "(x + 7) * y",
"x + (7 * y)",
"(7 + x) * y",
"7 + (x * y)",
36817 "(2 + x) * 3",
"2 + (x * 3)",
"(2 + 3) * x",
"2 + (3 * x)",
36818 "(x + 2) * 3",
"x + (2 * 3)",
36819 "(x + y) * (z / w)",
"(x + y) * (z / 7)",
"(x + y) * (7 / z)",
"(x + 7) * (y / z)",
36820 "(7 + x) * (y / z)",
"(2 + x) * (y / z)",
"(x + 2) * (y / 3)",
"(2 + x) * (y / 3)",
36821 "(x + 2) * (3 / y)",
"x + (y * (z / w))",
"x + (y * (z / 7))",
"x + (y * (7 / z))",
36822 "x + (7 * (y / z))",
"7 + (x * (y / z))",
"2 + (x * (3 / y))",
"x + (2 * (y / 4))",
36823 "2 + (x * (y / 3))",
"x + (2 * (3 / y))",
36824 "x + ((y * z) / w)",
"x + ((y * z) / 7)",
"x + ((y * 7) / z)",
"x + ((7 * y) / z)",
36825 "7 + ((y * z) / w)",
"2 + ((x * 3) / y)",
"x + ((2 * y) / 3)",
"2 + ((x * y) / 3)",
36826 "x + ((2 * 3) / y)",
"(((x + y) * z) / w)",
36827 "(((x + y) * z) / 7)",
"(((x + y) * 7) / z)",
"(((x + 7) * y) / z)",
"(((7 + x) * y) / z)",
36828 "(((2 + x) * 3) / y)",
"(((x + 2) * y) / 3)",
"(((2 + x) * y) / 3)",
"(((x + 2) * 3) / y)",
36829 "((x + (y * z)) / w)",
"((x + (y * z)) / 7)",
"((x + (y * 7)) / y)",
"((x + (7 * y)) / z)",
36830 "((7 + (x * y)) / z)",
"((2 + (x * 3)) / y)",
"((x + (2 * y)) / 3)",
"((2 + (x * y)) / 3)",
36831 "((x + (2 * 3)) / y)",
36832 "(xx + yy) * zz",
"xx + (yy * zz)",
36833 "(xx + yy) * 7",
"xx + (yy * 7)",
36834 "(xx + 7) * yy",
"xx + (7 * yy)",
36835 "(7 + xx) * yy",
"7 + (xx * yy)",
36836 "(2 + x) * 3",
"2 + (x * 3)",
36837 "(2 + 3) * x",
"2 + (3 * x)",
36838 "(x + 2) * 3",
"x + (2 * 3)",
36839 "(xx + yy) * (zz / ww)",
"(xx + yy) * (zz / 7)",
36840 "(xx + yy) * (7 / zz)",
"(xx + 7) * (yy / zz)",
36841 "(7 + xx) * (yy / zz)",
"(2 + xx) * (yy / zz)",
36842 "(xx + 2) * (yy / 3)",
"(2 + xx) * (yy / 3)",
36843 "(xx + 2) * (3 / yy)",
"xx + (yy * (zz / ww))",
36844 "xx + (yy * (zz / 7))",
"xx + (yy * (7 / zz))",
36845 "xx + (7 * (yy / zz))",
"7 + (xx * (yy / zz))",
36846 "2 + (xx * (3 / yy))",
"xx + (2 * (yy / 4))",
36847 "2 + (xx * (yy / 3))",
"xx + (2 * (3 / yy))",
36848 "xx + ((yy * zz) / ww)",
"xx + ((yy * zz) / 7)",
36849 "xx + ((yy * 7) / zz)",
"xx + ((7 * yy) / zz)",
36850 "7 + ((yy * zz) / ww)",
"2 + ((xx * 3) / yy)",
36851 "xx + ((2 * yy) / 3)",
"2 + ((xx * yy) / 3)",
36852 "xx + ((2 * 3) / yy)",
"(((xx + yy) * zz) / ww)",
36853 "(((xx + yy) * zz) / 7)",
"(((xx + yy) * 7) / zz)",
36854 "(((xx + 7) * yy) / zz)",
"(((7 + xx) * yy) / zz)",
36855 "(((2 + xx) * 3) / yy)",
"(((xx + 2) * yy) / 3)",
36856 "(((2 + xx) * yy) / 3)",
"(((xx + 2) * 3) / yy)",
36857 "((xx + (yy * zz)) / ww)",
"((xx + (yy * zz)) / 7)",
36858 "((xx + (yy * 7)) / yy)",
"((xx + (7 * yy)) / zz)",
36859 "((7 + (xx * yy)) / zz)",
"((2 + (xx * 3)) / yy)",
36860 "((xx + (2 * yy)) / 3)",
"((2 + (xx * yy)) / 3)",
36861 "((xx + (2 * 3)) / yy)" 36863 static const std::size_t expression_list_size =
sizeof(expression_list) /
sizeof(
std::string);
36885 typedef typename std::deque<exprtk::expression<T> > expr_list_t;
36886 expr_list_t expr_list;
36888 const std::size_t rounds = 50;
36891 for (std::size_t r = 0; r < rounds; ++r)
36896 for (std::size_t i = 0; i < expression_list_size; ++i)
36915 static const T lower_bound = T(-20);
36916 static const T upper_bound = T(+20);
36917 static const T delta = T(0.1);
36921 for (
x = lower_bound;
x <= upper_bound;
x += delta)
36923 for (y = lower_bound; y <= upper_bound; y += delta)
36933 for (std::size_t i = 0; i < expr_list.size(); ++i)
36940 for (std::size_t i = 0; i < 10000; ++i)
36942 const T v = T(123.456 + i);
36947 #define else_stmt(N) \ 36948 else if (details::is_true(details::numeric::nequal(details::numeric::fast_exp<T,N>::result(v),details::numeric::pow(v,T(N))))) \ 36973 #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) 36977 # ifndef WIN32_LEAN_AND_MEAN 36978 # define WIN32_LEAN_AND_MEAN 36980 # include <windows.h> 36984 # include <sys/time.h> 36985 # include <sys/types.h> 36994 #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) 36998 QueryPerformanceFrequency(&clock_frequency_);
37001 inline void start()
37013 inline double time()
const 37073 #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) 37076 LARGE_INTEGER clock_frequency_;
37085 #ifndef exprtk_disable_rtl_io 37088 namespace rtl {
namespace io {
namespace details
37090 template <
typename T>
37095 printf(fmt.c_str(),v);
37098 template <
typename T>
37110 for (std::size_t i = 0; i < parameters.
size(); ++i)
37125 default :
continue;
37137 for (std::size_t i = 0; i < v.
size(); ++i)
37141 if ((i + 1) < v.
size())
37148 printf(
"%s",
to_str(s).c_str());
37154 template <
typename T>
37176 template <
typename T>
37199 template <
typename T>
37207 #define exprtk_register_function(FunctionName,FunctionType) \ 37208 if (!symtab.add_function(FunctionName,FunctionType)) \ 37211 "exprtk::rtl::io::register_package - Failed to add function: %s\n", \ 37218 #undef exprtk_register_function 37229 #ifndef exprtk_disable_rtl_io_file 37233 namespace rtl {
namespace io {
namespace file {
namespace details
37259 std::ifstream* stream =
new std::ifstream(
file_name.c_str(),std::ios::binary);
37275 std::ofstream* stream =
new std::ofstream(
file_name.c_str(),std::ios::binary);
37291 std::fstream* stream =
new std::fstream(
file_name.c_str(),std::ios::binary);
37309 template <
typename Stream,
typename Ptr>
37312 Stream* stream =
reinterpret_cast<Stream*
>(p);
37315 p =
reinterpret_cast<Ptr
>(0);
37331 default :
return false;
37337 template <
typename View>
37338 bool write(
const View& view,
const std::size_t amount,
const std::size_t offset = 0)
37343 write(reinterpret_cast<const char*>(view.begin() + offset), amount *
sizeof(
typename View::value_t));
37347 write(reinterpret_cast<const char*>(view.begin() + offset) , amount *
sizeof(
typename View::value_t));
37350 default :
return false;
37356 template <
typename View>
37357 bool read(View& view,
const std::size_t amount,
const std::size_t offset = 0)
37362 read(reinterpret_cast<char*>(view.begin() + offset), amount *
sizeof(
typename View::value_t));
37366 read(reinterpret_cast<char*>(view.begin() + offset) , amount *
sizeof(
typename View::value_t));
37369 default :
return false;
37379 case e_read :
return (!!std::getline(*reinterpret_cast<std::ifstream*>(
stream_ptr),s));
37380 case e_rdwrt :
return (!!std::getline(*reinterpret_cast<std::fstream* >(
stream_ptr),s));
37381 default :
return false;
37392 default :
return true;
37398 if (access.empty() || access.size() > 2)
37401 std::size_t w_cnt = 0;
37402 std::size_t r_cnt = 0;
37404 for (std::size_t i = 0; i < access.size(); ++i)
37406 switch (std::tolower(access[i]))
37408 case 'r' : r_cnt++;
break;
37409 case 'w' : w_cnt++;
break;
37414 if ((0 == r_cnt) && (0 == w_cnt))
37416 else if ((r_cnt > 1) || (w_cnt > 1))
37418 else if ((1 == r_cnt) && (1 == w_cnt))
37420 else if (1 == r_cnt)
37427 template <
typename T>
37432 std::memcpy(reinterpret_cast<char*>(&fd),
37433 reinterpret_cast<const char*>(&v),
37438 template <
typename T>
37442 #pragma warning(push) 37443 #pragma warning(disable: 4127) 37445 if (
sizeof(T) <
sizeof(
void*))
37447 throw std::runtime_error(
"exprtk::rtl::io::file - Error - pointer size larger than holder.");
37450 #pragma warning(pop) 37456 template <
typename T>
37470 { details::perform_check<T>(); }
37477 if (file_name.empty())
37493 std::memcpy(reinterpret_cast<char*>(&
t ),
37494 reinterpret_cast<char*>(&fd),
37506 template <
typename T>
37513 { details::perform_check<T>(); }
37528 template <
typename T>
37544 { details::perform_check<T>(); }
37550 std::size_t amount = 0;
37563 static_cast<std::size_t
>(
scalar_t(parameters[2])()));
37568 const vector_t vec(parameters[1]);
37569 amount = vec.
size();
37570 return T(fd->
write(vec, amount) ? 1 : 0);
37574 const vector_t vec(parameters[1]);
37576 static_cast<std::size_t
>(
scalar_t(parameters[2])()));
37577 return T(fd->
write(vec, amount) ? 1 : 0);
37585 template <
typename T>
37601 { details::perform_check<T>(); }
37607 std::size_t amount = 0;
37620 static_cast<std::size_t
>(
scalar_t(parameters[2])()));
37626 amount = vec.
size();
37627 return T(fd->
read(vec,amount) ? 1 : 0);
37633 static_cast<std::size_t
>(
scalar_t(parameters[2])()));
37634 return T(fd->
read(vec,amount) ? 1 : 0);
37642 template <
typename T>
37657 { details::perform_check<T>(); }
37663 return T(fd->
getline(result) ? 1 : 0);
37667 template <
typename T>
37674 { details::perform_check<T>(); }
37680 return (fd->
eof() ? T(1) : T(0));
37684 template <
typename T>
37696 #define exprtk_register_function(FunctionName,FunctionType) \ 37697 if (!symtab.add_function(FunctionName,FunctionType)) \ 37700 "exprtk::rtl::io::file::register_package - Failed to add function: %s\n", \ 37711 #undef exprtk_register_function 37723 #ifndef exprtk_disable_rtl_vecops 37726 namespace rtl {
namespace vecops {
37730 template <
typename Vector>
37731 inline bool invalid_range(
const Vector& v,
const std::size_t r0,
const std::size_t r1)
37733 if (r0 > (v.size() - 1))
37735 else if (r1 > (v.size() - 1))
37743 template <
typename T>
37753 std::size_t& r0, std::size_t& r1,
37754 const std::size_t& r0_prmidx,
37755 const std::size_t& r1_prmidx,
37756 const std::size_t vec_idx = 0)
37758 if (r0_prmidx >= parameters.
size())
37761 if (r1_prmidx >= parameters.
size())
37777 template <
typename T>
37781 const T y = sum +
x;
37788 template <
typename T>
37811 const vector_t vec(parameters[0]);
37813 std::size_t r0 = 0;
37814 std::size_t r1 = vec.
size() - 1;
37820 return std::numeric_limits<T>::quiet_NaN();
37822 for (std::size_t i = r0; i <= r1; ++i)
37824 if (vec[i] == T(0))
37834 template <
typename T>
37857 const vector_t vec(parameters[0]);
37859 std::size_t r0 = 0;
37860 std::size_t r1 = vec.
size() - 1;
37866 return std::numeric_limits<T>::quiet_NaN();
37868 for (std::size_t i = r0; i <= r1; ++i)
37870 if (vec[i] != T(0))
37880 template <
typename T>
37903 const vector_t vec(parameters[0]);
37905 std::size_t r0 = 0;
37906 std::size_t r1 = vec.
size() - 1;
37912 return std::numeric_limits<T>::quiet_NaN();
37914 for (std::size_t i = r0; i <= r1; ++i)
37916 if (vec[i] != T(0))
37926 template <
typename T>
37949 const vector_t vec(parameters[0]);
37951 std::size_t r0 = 0;
37952 std::size_t r1 = vec.
size() - 1;
37958 return std::numeric_limits<T>::quiet_NaN();
37960 for (std::size_t i = r0; i <= r1; ++i)
37962 if (vec[i] == T(0))
37972 template <
typename T>
37995 const vector_t vec(parameters[0]);
37997 std::size_t r0 = 0;
37998 std::size_t r1 = vec.
size() - 1;
38004 return std::numeric_limits<T>::quiet_NaN();
38006 std::size_t cnt = 0;
38008 for (std::size_t i = r0; i <= r1; ++i)
38010 if (vec[i] != T(0)) ++cnt;
38017 template <
typename T>
38042 vector_t y(parameters[(0 == ps_index) ? 1 : 3]);
38044 std::size_t xr0 = 0;
38045 std::size_t xr1 =
x.size() - 1;
38047 std::size_t yr0 = 0;
38048 std::size_t yr1 = y.
size() - 1;
38059 const std::size_t n =
std::min(xr1 - xr0 + 1, yr1 - yr0 + 1);
38061 std::copy(
x.begin() + xr0,
x.begin() + xr0 + n, y.
begin() + yr0);
38067 template <
typename T>
38094 std::size_t r0 = 0;
38095 std::size_t r1 = vec.
size() - 1;
38097 if (!
scalar_t(parameters[1]).to_uint(n))
38106 std::size_t dist = r1 - r0 + 1;
38107 std::size_t shift = n % dist;
38109 std::rotate(vec.
begin() + r0, vec.
begin() + r0 + shift, vec.
begin() + r1 + 1);
38115 template <
typename T>
38142 std::size_t r0 = 0;
38143 std::size_t r1 = vec.
size() - 1;
38145 if (!
scalar_t(parameters[1]).to_uint(n))
38154 std::size_t dist = r1 - r0 + 1;
38155 std::size_t shift = (dist - (n % dist)) % dist;
38157 std::rotate(vec.
begin() + r0, vec.
begin() + r0 + shift, vec.
begin() + r1 + 1);
38163 template <
typename T>
38190 std::size_t r0 = 0;
38191 std::size_t r1 = vec.
size() - 1;
38193 if (!
scalar_t(parameters[1]).to_uint(n))
38202 std::size_t dist = r1 - r0 + 1;
38207 std::rotate(vec.
begin() + r0, vec.
begin() + r0 + n, vec.
begin() + r1 + 1);
38209 for (std::size_t i = r1 - n + 1; i <= r1; ++i)
38218 template <
typename T>
38245 std::size_t r0 = 0;
38246 std::size_t r1 = vec.
size() - 1;
38248 if (!
scalar_t(parameters[1]).to_uint(n))
38257 std::size_t dist = r1 - r0 + 1;
38262 std::size_t shift = (dist - (n % dist)) % dist;
38264 std::rotate(vec.
begin() + r0, vec.
begin() + r0 + shift, vec.
begin() + r1 + 1);
38266 for (std::size_t i = r0; i < r0 + n; ++i)
38275 template <
typename T>
38303 std::size_t r0 = 0;
38304 std::size_t r1 = vec.
size() - 1;
38311 bool ascending =
true;
38313 if ((2 == ps_index) || (3 == ps_index))
38324 std::sort(vec.
begin() + r0, vec.
begin() + r1 + 1, std::less<T> ());
38326 std::sort(vec.
begin() + r0, vec.
begin() + r1 + 1, std::greater<T>());
38332 template <
typename T>
38359 std::size_t r0 = 0;
38360 std::size_t r1 = vec.
size() - 1;
38362 if (!
scalar_t(parameters[1]).to_uint(n))
38366 return std::numeric_limits<T>::quiet_NaN();
38368 std::nth_element(vec.
begin() + r0, vec.
begin() + r0 + n , vec.
begin() + r1 + 1);
38374 template <
typename T>
38402 T increment =
scalar_t(parameters[1])();
38403 T base = ((1 == ps_index) || (3 == ps_index)) ?
scalar_t(parameters[2])() : T(0);
38405 std::size_t r0 = 0;
38406 std::size_t r1 = vec.
size() - 1;
38409 return std::numeric_limits<T>::quiet_NaN();
38411 return std::numeric_limits<T>::quiet_NaN();
38416 for (std::size_t i = r0; i <= r1; ++i, ++j)
38418 vec[i] = base + (increment * j);
38426 template <
typename T>
38449 const vector_t vec(parameters[0]);
38451 std::size_t r0 = 0;
38452 std::size_t r1 = vec.
size() - 1;
38455 return std::numeric_limits<T>::quiet_NaN();
38460 for (std::size_t i = r0; i <= r1; ++i)
38469 template <
typename T>
38497 std::size_t r0 = 0;
38501 return std::numeric_limits<T>::quiet_NaN();
38503 return std::numeric_limits<T>::quiet_NaN();
38505 const T a =
scalar_t(parameters[0])();
38507 for (std::size_t i = r0; i <= r1; ++i)
38509 y[i] = (a *
x[i]) + y[i];
38516 template <
typename T>
38544 std::size_t r0 = 0;
38548 return std::numeric_limits<T>::quiet_NaN();
38550 return std::numeric_limits<T>::quiet_NaN();
38552 const T a =
scalar_t(parameters[0])();
38553 const T b =
scalar_t(parameters[2])();
38555 for (std::size_t i = r0; i <= r1; ++i)
38557 y[i] = (a *
x[i]) + (b * y[i]);
38564 template <
typename T>
38593 std::size_t r0 = 0;
38597 return std::numeric_limits<T>::quiet_NaN();
38599 return std::numeric_limits<T>::quiet_NaN();
38601 return std::numeric_limits<T>::quiet_NaN();
38603 const T a =
scalar_t(parameters[0])();
38605 for (std::size_t i = r0; i <= r1; ++i)
38607 z[i] = (a *
x[i]) + y[i];
38614 template <
typename T>
38643 std::size_t r0 = 0;
38647 return std::numeric_limits<T>::quiet_NaN();
38649 return std::numeric_limits<T>::quiet_NaN();
38651 return std::numeric_limits<T>::quiet_NaN();
38653 const T a =
scalar_t(parameters[0])();
38654 const T b =
scalar_t(parameters[2])();
38656 for (std::size_t i = r0; i <= r1; ++i)
38658 z[i] = (a *
x[i]) + (b * y[i]);
38665 template <
typename T>
38693 std::size_t r0 = 0;
38694 std::size_t r1 =
x.size() - 1;
38697 return std::numeric_limits<T>::quiet_NaN();
38699 return std::numeric_limits<T>::quiet_NaN();
38701 const T a =
scalar_t(parameters[0])();
38702 const T b =
scalar_t(parameters[2])();
38704 for (std::size_t i = r0; i <= r1; ++i)
38706 z[i] = (a *
x[i]) + b;
38713 template <
typename T>
38740 std::size_t r0 = 0;
38744 return std::numeric_limits<T>::quiet_NaN();
38746 return std::numeric_limits<T>::quiet_NaN();
38750 for (std::size_t i = r0; i <= r1; ++i)
38752 result += (
x[i] * y[i]);
38759 template <
typename T>
38786 std::size_t r0 = 0;
38790 return std::numeric_limits<T>::quiet_NaN();
38792 return std::numeric_limits<T>::quiet_NaN();
38797 for (std::size_t i = r0; i <= r1; ++i)
38806 template <
typename T>
38833 #define exprtk_register_function(FunctionName,FunctionType) \ 38834 if (!symtab.add_function(FunctionName,FunctionType)) \ 38837 "exprtk::rtl::vecops::register_package - Failed to add function: %s\n", \ 38865 #undef exprtk_register_function 38878 namespace information
38880 static const char*
library =
"Mathematical Expression Toolkit";
38881 static const char*
version =
"2.71828182845904523536028747135266249775724709369995957" 38882 "4966967627724076630353547594571382178525166427427466391";
38895 #ifdef exprtk_debug 38896 #undef exprtk_debug 38899 #ifdef exprtk_error_location 38900 #undef exprtk_error_location 38903 #ifdef exprtk_disable_fallthrough_begin 38904 #undef exprtk_disable_fallthrough_begin 38907 #ifdef exprtk_disable_fallthrough_end 38908 #undef exprtk_disable_fallthrough_end