diff --git a/exprtk.hpp b/exprtk.hpp index b9e1464..9e9b913 100644 --- a/exprtk.hpp +++ b/exprtk.hpp @@ -224,7 +224,7 @@ namespace exprtk static const std::string reserved_words[] = { "and", "false", "for", "if", "ilike", "in", "like", "nand", "nor", "not", - "or", "shl", "shr", "true", "while", "xor" + "null", "or", "shl", "shr", "true", "while", "xor" }; static const std::size_t reserved_words_size = sizeof(reserved_words) / sizeof(std::string); @@ -233,11 +233,11 @@ namespace exprtk { "abs", "acos", "and", "asin", "atan", "atan2", "avg", "ceil", "clamp", "cos", "cosh", "cot", "csc", "deg2grad", "deg2rad", "equal", "erf", "erfc", - "exp", "false", "floor", "for", "frac", "grad2deg", "hyp", "if", "ilike", - "in", "inrange", "like", "log", "log10", "logn", "max", "min", "mod", "mul", - "nand", "nor", "not", "not_equal", "or", "pow", "rad2deg", "root", "round", - "roundn", "sec", "sgn", "shl", "shr", "sin", "sinh", "sqrt", "sum", "tan", - "tanh", "true", "trunc", "while", "xor" + "exp", "false", "floor", "for", "frac", "grad2deg", "hypot", "if", "ilike", + "in", "inrange", "like", "log", "log10", "logn", "log1p", "max", "min", "mod", + "mul", "nand", "nor", "not", "not_equal", "null", "or", "pow", "rad2deg", + "root", "round", "roundn", "sec", "sgn", "shl", "shr", "sin", "sinh", "sqrt", + "sum", "tan", "tanh", "true", "trunc", "while", "xor" }; static const std::size_t reserved_symbols_size = sizeof(reserved_symbols) / sizeof(std::string); @@ -477,6 +477,33 @@ namespace exprtk return static_cast(logn_impl(static_cast(v0),static_cast(v1),real_type_tag())); } + template + inline T log1p_impl(const T v, real_type_tag) + { + if (v > T(-1)) + { + if (abs_impl(v,real_type_tag()) > T(0.0001)) + { + return std::log(T(1) + v); + } + else + return (T(-0.5) * v + T(1)) * v; + } + else + return std::numeric_limits::quiet_NaN(); + } + + template + inline T log1p_impl(const T v, int_type_tag) + { + if (v > T(-1)) + { + return std::log(T(1) + v); + } + else + return std::numeric_limits::quiet_NaN(); + } + template inline T root_impl(const T v0, const T v1, real_type_tag) { @@ -489,6 +516,12 @@ namespace exprtk return root_impl(static_cast(v0),static_cast(v1),real_type_tag()); } + template + inline T round_impl(const T v, real_type_tag) + { + return ((v < T(0)) ? std::ceil(v - T(0.5)) : floor(v + T(0.5))); + } + template inline T roundn_impl(const T v0, const T v1, real_type_tag) { @@ -502,13 +535,13 @@ namespace exprtk } template - inline T hyp_impl(const T v0, const T v1, real_type_tag) + inline T hypot_impl(const T v0, const T v1, real_type_tag) { return std::sqrt((v0 * v0) + (v1 * v1)); } template - inline T hyp_impl(const T v0, const T v1, int_type_tag) + inline T hypot_impl(const T v0, const T v1, int_type_tag) { return static_cast(std::sqrt(static_cast((v0 * v0) + (v1 * v1)))); } @@ -640,7 +673,6 @@ namespace exprtk template inline T log10_impl(const T v, real_type_tag) { return std::log10(v); } template inline T neg_impl(const T v, real_type_tag) { return -v; } template inline T pos_impl(const T v, real_type_tag) { return +v; } - template inline T round_impl(const T v, real_type_tag) { return std::floor(v + T(0.5)); } template inline T sin_impl(const T v, real_type_tag) { return std::sin (v); } template inline T sinh_impl(const T v, real_type_tag) { return std::sinh (v); } template inline T sqrt_impl(const T v, real_type_tag) { return std::sqrt (v); } @@ -755,10 +787,10 @@ namespace exprtk } template - inline T hyp(const T v0, const T v1) + inline T hypot(const T v0, const T v1) { typename details::number_type::type num_type; - return details::hyp_impl(v0,v1,num_type); + return details::hypot_impl(v0,v1,num_type); } template @@ -848,6 +880,7 @@ namespace exprtk exprtk_define_unary_function(floor) exprtk_define_unary_function(log ) exprtk_define_unary_function(log10) + exprtk_define_unary_function(log1p) exprtk_define_unary_function(neg ) exprtk_define_unary_function(pos ) exprtk_define_unary_function(round) @@ -2602,79 +2635,26 @@ namespace exprtk namespace details { - enum operator_type { - e_default, - e_add , - e_sub , - e_mul , - e_div , - e_mod , - e_pow , - e_atan2 , - e_min , - e_max , - e_avg , - e_sum , - e_prod , - e_lt , - e_lte , - e_eq , - e_equal , - e_ne , - e_nequal , - e_gte , - e_gt , - e_and , - e_nand , - e_or , - e_nor , - e_xor , - e_shr , - e_shl , - e_abs , - e_acos , - e_asin , - e_atan , - e_ceil , - e_cos , - e_cosh , - e_exp , - e_floor , - e_log , - e_log10 , - e_logn , - e_neg , - e_pos , - e_round , - e_roundn , - e_root , - e_sqrt , - e_sin , - e_sinh , - e_sec , - e_csc , - e_tan , - e_tanh , - e_cot , - e_clamp , - e_inrange, - e_sgn , - e_r2d , - e_d2r , - e_d2g , - e_g2d , - e_hyp , - e_notl , - e_erf , - e_erfc , - e_frac , - e_trunc , - e_assign , - e_in , - e_like , - e_ilike , + e_default, e_null , e_add , e_sub , + e_mul , e_div , e_mod , e_pow , + e_atan2 , e_min , e_max , e_avg , + e_sum , e_prod , e_lt , e_lte , + e_eq , e_equal , e_ne , e_nequal , + e_gte , e_gt , e_and , e_nand , + e_or , e_nor , e_xor , e_shr , + e_shl , e_abs , e_acos , e_asin , + e_atan , e_ceil , e_cos , e_cosh , + e_exp , e_floor , e_log , e_log10 , + e_log1p , e_logn , e_neg , e_pos , + e_round , e_roundn , e_root , e_sqrt , + e_sin , e_sinh , e_sec , e_csc , + e_tan , e_tanh , e_cot , e_clamp , + e_inrange, e_sgn , e_r2d , e_d2r , + e_d2g , e_g2d , e_hypot , e_notl , + e_erf , e_erfc , e_frac , e_trunc , + e_assign , e_in , e_like , e_ilike , // Do not add new functions/operators after this point. e_sf00 = 1000, e_sf01 = 1001, e_sf02 = 1002, e_sf03 = 1003, @@ -2746,6 +2726,7 @@ namespace exprtk case e_floor : return numeric::floor(arg); case e_log : return numeric::log (arg); case e_log10 : return numeric::log10(arg); + case e_log1p : return numeric::log1p(arg); case e_neg : return numeric::neg (arg); case e_pos : return numeric::pos (arg); case e_round : return numeric::round(arg); @@ -2780,6 +2761,7 @@ namespace exprtk case e_exp : return numeric::exp (arg); case e_log : return numeric::log (arg); case e_log10 : return numeric::log10(arg); + case e_log1p : return numeric::log1p(arg); case e_neg : return numeric::neg (arg); case e_pos : return numeric::pos (arg); case e_sqrt : return numeric::sqrt (arg); @@ -2819,7 +2801,7 @@ namespace exprtk case e_roundn : return roundn(arg0,arg1); case e_equal : return equal(arg0,arg1); case e_nequal : return nequal(arg0,arg1); - case e_hyp : return hyp(arg0,arg1); + case e_hypot : return hypot(arg0,arg1); case e_avg : return (arg0 + arg1)/T(2); case e_sum : return (arg0 + arg1); case e_prod : return (arg0 * arg1); @@ -2857,7 +2839,7 @@ namespace exprtk case e_root : return root(arg0,arg1); case e_equal : return arg0 == arg1; case e_nequal : return arg0 != arg1; - case e_hyp : return hyp(arg0,arg1); + case e_hypot : return hypot(arg0,arg1); case e_avg : return (arg0 + arg1) >> 1; case e_sum : return (arg0 + arg1); case e_prod : return (arg0 * arg1); @@ -2890,99 +2872,30 @@ namespace exprtk enum node_type { - e_none , - e_null , - e_constant , - e_unary , - e_binary , - e_binary_ext , - e_trinary , - e_quaternary , - e_quinary , - e_senary , - e_conditional , - e_while , - e_variable , - e_stringvar , - e_stringconst , - e_function , - e_add , - e_sub , - e_mul , - e_div , - e_mod , - e_pow , - e_lt , - e_lte , - e_gt , - e_gte , - e_eq , - e_ne , - e_and , - e_nand , - e_or , - e_nor , - e_xor , - e_in , - e_like , - e_ilike , - e_inranges , - e_ipow , - e_ipowinv , - e_abs , - e_acos , - e_asin , - e_atan , - e_ceil , - e_cos , - e_cosh , - e_exp , - e_floor , - e_log , - e_log10 , - e_neg , - e_pos , - e_round , - e_sin , - e_sinh , - e_sqrt , - e_tan , - e_tanh , - e_cot , - e_sec , - e_csc , - e_r2d , - e_d2r , - e_d2g , - e_g2d , - e_notl , - e_sgn , - e_erf , - e_erfc , - e_frac , - e_trunc , - e_uvouv , - e_vov , - e_cov , - e_voc , - e_vob , - e_bov , - e_cob , - e_boc , - e_vovov , - e_vovoc , - e_vocov , - e_covov , - e_covoc , - e_vovovov , - e_vovovoc , - e_vovocov , - e_vocovov , - e_covovov , - e_covocov , - e_vocovoc , - e_covovoc , - e_vococov + e_none , e_null , e_constant , e_unary , + e_binary , e_binary_ext , e_trinary , e_quaternary , + e_quinary , e_senary , e_conditional , e_while , + e_variable , e_stringvar , e_stringconst , e_function , + e_add , e_sub , e_mul , e_div , + e_mod , e_pow , e_lt , e_lte , + e_gt , e_gte , e_eq , e_ne , + e_and , e_nand , e_or , e_nor , + e_xor , e_in , e_like , e_ilike , + e_inranges , e_ipow , e_ipowinv , e_abs , + e_acos , e_asin , e_atan , e_ceil , + e_cos , e_cosh , e_exp , e_floor , + e_log , e_log10 , e_log1p , e_neg , + e_pos , e_round , e_sin , e_sinh , + e_sqrt , e_tan , e_tanh , e_cot , + e_sec , e_csc , e_r2d , e_d2r , + e_d2g , e_g2d , e_notl , e_sgn , + e_erf , e_erfc , e_frac , e_trunc , + e_uvouv , e_vov , e_cov , e_voc , + e_vob , e_bov , e_cob , e_boc , + e_vovov , e_vovoc , e_vocov , e_covov , + e_covoc , e_vovovov , e_vovovoc , e_vovocov , + e_vocovov , e_covovov , e_covocov , e_vocovoc , + e_covovoc , e_vococov }; typedef T value_type; @@ -3059,6 +2972,12 @@ namespace exprtk return (details::expression_node::e_constant == node->type()); } + template + inline bool is_null_node(const expression_node* node) + { + return (details::expression_node::e_null == node->type()); + } + template inline bool is_function(const expression_node* node) { @@ -4492,6 +4411,7 @@ namespace exprtk exprtk_def_unary_op(g2d ) exprtk_def_unary_op(log ) exprtk_def_unary_op(log10) + exprtk_def_unary_op(log1p) exprtk_def_unary_op(neg ) exprtk_def_unary_op(notl ) exprtk_def_unary_op(pos ) @@ -6700,6 +6620,7 @@ namespace exprtk register_op( "floor",e_floor , 1) register_op( "log",e_log , 1) register_op( "log10",e_log10 , 1) + register_op( "log1p",e_log1p , 1) register_op( "round",e_round , 1) register_op( "sin",e_sin , 1) register_op( "sinh",e_sinh , 1) @@ -6732,7 +6653,7 @@ namespace exprtk register_op( "roundn",e_roundn , 2) register_op( "equal",e_equal , 2) register_op("not_equal",e_nequal , 2) - register_op( "hyp",e_hyp , 2) + register_op( "hypot",e_hypot , 2) register_op( "shr",e_shr , 2) register_op( "shl",e_shl , 2) register_op( "clamp",e_clamp , 3) @@ -7956,6 +7877,8 @@ namespace exprtk e_level13 }; + struct state_t; + typedef const T& cref_t; typedef const T const_t; typedef ifunction F; @@ -8425,13 +8348,13 @@ namespace exprtk case token_t::e_pow : current_state.set(e_level12,e_level12,details:: e_pow); break; default : if (token_t::e_symbol == current_token_.type) { - static const std::string s_and = "and"; - static const std::string s_nand = "nand"; - static const std::string s_or = "or"; - static const std::string s_nor = "nor"; - static const std::string s_xor = "xor"; - static const std::string s_in = "in"; - static const std::string s_like = "like"; + static const std::string s_and = "and"; + static const std::string s_nand = "nand"; + static const std::string s_or = "or"; + static const std::string s_nor = "nor"; + static const std::string s_xor = "xor"; + static const std::string s_in = "in"; + static const std::string s_like = "like"; static const std::string s_ilike = "ilike"; if (details::imatch(current_token_.value,s_and)) @@ -8865,6 +8788,12 @@ namespace exprtk } } + inline expression_node_ptr parse_null_statement() + { + next_token(); + return node_allocator_.allocate >(); + } + inline expression_node_ptr parse_symtab_symbol() { const std::string symbol = current_token_.value; @@ -8965,6 +8894,7 @@ namespace exprtk { static const std::string symbol_if = "if"; static const std::string symbol_while = "while"; + static const std::string symbol_null = "null"; if (valid_base_operation(current_token_.value)) { @@ -8982,6 +8912,10 @@ namespace exprtk { return parse_special_function(); } + else if (details::imatch(current_token_.value,symbol_null)) + { + return parse_null_statement(); + } else if (symbol_table_.valid()) { return parse_symtab_symbol(); @@ -9241,17 +9175,18 @@ namespace exprtk (details::e_ceil == operation) || (details::e_cos == operation) || (details::e_cosh == operation) || (details::e_exp == operation) || (details::e_floor == operation) || (details::e_log == operation) || - (details::e_log10 == operation) || (details::e_neg == operation) || - (details::e_pos == operation) || (details::e_round == operation) || - (details::e_sin == operation) || (details::e_sinh == operation) || - (details::e_sqrt == operation) || (details::e_tan == operation) || - (details::e_tanh == operation) || (details::e_cot == operation) || - (details::e_sec == operation) || (details::e_csc == operation) || - (details::e_r2d == operation) || (details::e_d2r == operation) || - (details::e_d2g == operation) || (details::e_g2d == operation) || - (details::e_notl == operation) || (details::e_sgn == operation) || - (details::e_erf == operation) || (details::e_erfc == operation) || - (details::e_frac == operation) || (details::e_trunc == operation); + (details::e_log10 == operation) || (details::e_log1p == operation) || + (details::e_neg == operation) || (details::e_pos == operation) || + (details::e_round == operation) || (details::e_sin == operation) || + (details::e_sinh == operation) || (details::e_sqrt == operation) || + (details::e_tan == operation) || (details::e_tanh == operation) || + (details::e_cot == operation) || (details::e_sec == operation) || + (details::e_csc == operation) || (details::e_r2d == operation) || + (details::e_d2r == operation) || (details::e_d2g == operation) || + (details::e_g2d == operation) || (details::e_notl == operation) || + (details::e_sgn == operation) || (details::e_erf == operation) || + (details::e_erfc == operation) || (details::e_frac == operation) || + (details::e_trunc == operation); } inline bool sf3_optimizable(const std::string sf3id, trinary_functor_t& tfunc) @@ -9298,6 +9233,8 @@ namespace exprtk { if (0 == branch[0]) return error_node(); + else if (details::is_null_node(branch[0])) + return branch[0]; else if (details::is_constant_node(branch[0])) return synthesize_expression(operation,branch); else if (unary_optimizable(operation) && details::is_variable_node(branch[0])) @@ -9376,7 +9313,9 @@ namespace exprtk inline std::string branch_to_id(expression_node_ptr branch) { - if (details::is_constant_node(branch)) + if (details::is_null_node(branch)) + return "(null)"; + else if (details::is_constant_node(branch)) return "(c)"; else if (details::is_variable_node(branch)) return "(v)"; @@ -9515,6 +9454,12 @@ namespace exprtk return (b0_string && b1_string && b2_string && (details::e_inrange == operation)); } + inline bool is_null_present(expression_node_ptr (&branch)[2]) + { + return details::is_null_node(branch[0]) || + details::is_null_node(branch[1]); + } + inline expression_node_ptr operator()(const details::operator_type& operation, expression_node_ptr (&branch)[2]) { if ((0 == branch[0]) || (0 == branch[1])) @@ -9528,6 +9473,8 @@ namespace exprtk return synthesize_assignment_expression(operation,branch); else if (is_string_operation(operation,branch)) return synthesize_string_expression(operation,branch); + else if (is_null_present(branch)) + return synthesize_null_expression(operation,branch); expression_node_ptr result = error_node(); if (synthesize_expression(operation,branch,result)) return result; @@ -9648,6 +9595,11 @@ namespace exprtk free_node(*node_allocator_,branch); return result; } + else if (details::is_null_node(condition)) + { + free_node(*node_allocator_,condition); + return branch; + } else return node_allocator_->allocate(condition,branch); } @@ -9664,6 +9616,7 @@ namespace exprtk case_stmt(details::e_floor,details::floor_op) \ case_stmt(details:: e_log,details:: log_op) \ case_stmt(details::e_log10,details::log10_op) \ + case_stmt(details::e_log1p,details::log1p_op) \ case_stmt(details:: e_neg,details:: neg_op) \ case_stmt(details:: e_pos,details:: pos_op) \ case_stmt(details::e_round,details::round_op) \ @@ -9715,52 +9668,29 @@ namespace exprtk switch (operation) { #define case_stmt(op0,op1) case op0 : temp_node = node_allocator_->allocate > >(operation,branch); break; - case_stmt(details::e_sf00,details::sf00_op) - case_stmt(details::e_sf01,details::sf01_op) - case_stmt(details::e_sf02,details::sf02_op) - case_stmt(details::e_sf03,details::sf03_op) - case_stmt(details::e_sf04,details::sf04_op) - case_stmt(details::e_sf05,details::sf05_op) - case_stmt(details::e_sf06,details::sf06_op) - case_stmt(details::e_sf07,details::sf07_op) - case_stmt(details::e_sf08,details::sf08_op) - case_stmt(details::e_sf09,details::sf09_op) - case_stmt(details::e_sf10,details::sf10_op) - case_stmt(details::e_sf11,details::sf11_op) - case_stmt(details::e_sf12,details::sf12_op) - case_stmt(details::e_sf13,details::sf13_op) - case_stmt(details::e_sf14,details::sf14_op) - case_stmt(details::e_sf15,details::sf15_op) - case_stmt(details::e_sf16,details::sf16_op) - case_stmt(details::e_sf17,details::sf17_op) - case_stmt(details::e_sf18,details::sf18_op) - case_stmt(details::e_sf19,details::sf19_op) - case_stmt(details::e_sf20,details::sf20_op) - case_stmt(details::e_sf21,details::sf21_op) - case_stmt(details::e_sf22,details::sf22_op) - case_stmt(details::e_sf23,details::sf23_op) - case_stmt(details::e_sf24,details::sf24_op) - case_stmt(details::e_sf25,details::sf25_op) - case_stmt(details::e_sf26,details::sf26_op) - case_stmt(details::e_sf27,details::sf27_op) - case_stmt(details::e_sf28,details::sf28_op) - case_stmt(details::e_sf29,details::sf29_op) - case_stmt(details::e_sf30,details::sf30_op) - case_stmt(details::e_sf31,details::sf31_op) - case_stmt(details::e_sf32,details::sf32_op) - case_stmt(details::e_sf33,details::sf33_op) - case_stmt(details::e_sf34,details::sf34_op) - case_stmt(details::e_sf35,details::sf35_op) - case_stmt(details::e_sf36,details::sf36_op) - case_stmt(details::e_sf37,details::sf37_op) - case_stmt(details::e_sf38,details::sf38_op) - case_stmt(details::e_sf39,details::sf39_op) - case_stmt(details::e_sf40,details::sf40_op) - case_stmt(details::e_sf41,details::sf41_op) - case_stmt(details::e_sf42,details::sf42_op) - case_stmt(details::e_sf43,details::sf43_op) - case_stmt(details::e_sf44,details::sf44_op) - case_stmt(details::e_sf45,details::sf45_op) + case_stmt(details::e_sf00,details::sf00_op) case_stmt(details::e_sf01,details::sf01_op) + case_stmt(details::e_sf02,details::sf02_op) case_stmt(details::e_sf03,details::sf03_op) + case_stmt(details::e_sf04,details::sf04_op) case_stmt(details::e_sf05,details::sf05_op) + case_stmt(details::e_sf06,details::sf06_op) case_stmt(details::e_sf07,details::sf07_op) + case_stmt(details::e_sf08,details::sf08_op) case_stmt(details::e_sf09,details::sf09_op) + case_stmt(details::e_sf10,details::sf10_op) case_stmt(details::e_sf11,details::sf11_op) + case_stmt(details::e_sf12,details::sf12_op) case_stmt(details::e_sf13,details::sf13_op) + case_stmt(details::e_sf14,details::sf14_op) case_stmt(details::e_sf15,details::sf15_op) + case_stmt(details::e_sf16,details::sf16_op) case_stmt(details::e_sf17,details::sf17_op) + case_stmt(details::e_sf18,details::sf18_op) case_stmt(details::e_sf19,details::sf19_op) + case_stmt(details::e_sf20,details::sf20_op) case_stmt(details::e_sf21,details::sf21_op) + case_stmt(details::e_sf22,details::sf22_op) case_stmt(details::e_sf23,details::sf23_op) + case_stmt(details::e_sf24,details::sf24_op) case_stmt(details::e_sf25,details::sf25_op) + case_stmt(details::e_sf26,details::sf26_op) case_stmt(details::e_sf27,details::sf27_op) + case_stmt(details::e_sf28,details::sf28_op) case_stmt(details::e_sf29,details::sf29_op) + case_stmt(details::e_sf30,details::sf30_op) case_stmt(details::e_sf31,details::sf31_op) + case_stmt(details::e_sf32,details::sf32_op) case_stmt(details::e_sf33,details::sf33_op) + case_stmt(details::e_sf34,details::sf34_op) case_stmt(details::e_sf35,details::sf35_op) + case_stmt(details::e_sf36,details::sf36_op) case_stmt(details::e_sf37,details::sf37_op) + case_stmt(details::e_sf38,details::sf38_op) case_stmt(details::e_sf39,details::sf39_op) + case_stmt(details::e_sf40,details::sf40_op) case_stmt(details::e_sf41,details::sf41_op) + case_stmt(details::e_sf42,details::sf42_op) case_stmt(details::e_sf43,details::sf43_op) + case_stmt(details::e_sf44,details::sf44_op) case_stmt(details::e_sf45,details::sf45_op) #undef case_stmt default : return error_node(); } @@ -9778,52 +9708,29 @@ namespace exprtk switch (operation) { #define case_stmt(op0,op1) case op0 : return node_allocator_->allocate_rrr > >(v0,v1,v2); - case_stmt(details::e_sf00,details::sf00_op) - case_stmt(details::e_sf01,details::sf01_op) - case_stmt(details::e_sf02,details::sf02_op) - case_stmt(details::e_sf03,details::sf03_op) - case_stmt(details::e_sf04,details::sf04_op) - case_stmt(details::e_sf05,details::sf05_op) - case_stmt(details::e_sf06,details::sf06_op) - case_stmt(details::e_sf07,details::sf07_op) - case_stmt(details::e_sf08,details::sf08_op) - case_stmt(details::e_sf09,details::sf09_op) - case_stmt(details::e_sf10,details::sf10_op) - case_stmt(details::e_sf11,details::sf11_op) - case_stmt(details::e_sf12,details::sf12_op) - case_stmt(details::e_sf13,details::sf13_op) - case_stmt(details::e_sf14,details::sf14_op) - case_stmt(details::e_sf15,details::sf15_op) - case_stmt(details::e_sf16,details::sf16_op) - case_stmt(details::e_sf17,details::sf17_op) - case_stmt(details::e_sf18,details::sf18_op) - case_stmt(details::e_sf19,details::sf19_op) - case_stmt(details::e_sf20,details::sf20_op) - case_stmt(details::e_sf21,details::sf21_op) - case_stmt(details::e_sf22,details::sf22_op) - case_stmt(details::e_sf23,details::sf23_op) - case_stmt(details::e_sf24,details::sf24_op) - case_stmt(details::e_sf25,details::sf25_op) - case_stmt(details::e_sf26,details::sf26_op) - case_stmt(details::e_sf27,details::sf27_op) - case_stmt(details::e_sf28,details::sf28_op) - case_stmt(details::e_sf29,details::sf29_op) - case_stmt(details::e_sf30,details::sf30_op) - case_stmt(details::e_sf31,details::sf31_op) - case_stmt(details::e_sf32,details::sf32_op) - case_stmt(details::e_sf33,details::sf33_op) - case_stmt(details::e_sf34,details::sf34_op) - case_stmt(details::e_sf35,details::sf35_op) - case_stmt(details::e_sf36,details::sf36_op) - case_stmt(details::e_sf37,details::sf37_op) - case_stmt(details::e_sf38,details::sf38_op) - case_stmt(details::e_sf39,details::sf39_op) - case_stmt(details::e_sf40,details::sf40_op) - case_stmt(details::e_sf41,details::sf41_op) - case_stmt(details::e_sf42,details::sf42_op) - case_stmt(details::e_sf43,details::sf43_op) - case_stmt(details::e_sf44,details::sf44_op) - case_stmt(details::e_sf45,details::sf45_op) + case_stmt(details::e_sf00,details::sf00_op) case_stmt(details::e_sf01,details::sf01_op) + case_stmt(details::e_sf02,details::sf02_op) case_stmt(details::e_sf03,details::sf03_op) + case_stmt(details::e_sf04,details::sf04_op) case_stmt(details::e_sf05,details::sf05_op) + case_stmt(details::e_sf06,details::sf06_op) case_stmt(details::e_sf07,details::sf07_op) + case_stmt(details::e_sf08,details::sf08_op) case_stmt(details::e_sf09,details::sf09_op) + case_stmt(details::e_sf10,details::sf10_op) case_stmt(details::e_sf11,details::sf11_op) + case_stmt(details::e_sf12,details::sf12_op) case_stmt(details::e_sf13,details::sf13_op) + case_stmt(details::e_sf14,details::sf14_op) case_stmt(details::e_sf15,details::sf15_op) + case_stmt(details::e_sf16,details::sf16_op) case_stmt(details::e_sf17,details::sf17_op) + case_stmt(details::e_sf18,details::sf18_op) case_stmt(details::e_sf19,details::sf19_op) + case_stmt(details::e_sf20,details::sf20_op) case_stmt(details::e_sf21,details::sf21_op) + case_stmt(details::e_sf22,details::sf22_op) case_stmt(details::e_sf23,details::sf23_op) + case_stmt(details::e_sf24,details::sf24_op) case_stmt(details::e_sf25,details::sf25_op) + case_stmt(details::e_sf26,details::sf26_op) case_stmt(details::e_sf27,details::sf27_op) + case_stmt(details::e_sf28,details::sf28_op) case_stmt(details::e_sf29,details::sf29_op) + case_stmt(details::e_sf30,details::sf30_op) case_stmt(details::e_sf31,details::sf31_op) + case_stmt(details::e_sf32,details::sf32_op) case_stmt(details::e_sf33,details::sf33_op) + case_stmt(details::e_sf34,details::sf34_op) case_stmt(details::e_sf35,details::sf35_op) + case_stmt(details::e_sf36,details::sf36_op) case_stmt(details::e_sf37,details::sf37_op) + case_stmt(details::e_sf38,details::sf38_op) case_stmt(details::e_sf39,details::sf39_op) + case_stmt(details::e_sf40,details::sf40_op) case_stmt(details::e_sf41,details::sf41_op) + case_stmt(details::e_sf42,details::sf42_op) case_stmt(details::e_sf43,details::sf43_op) + case_stmt(details::e_sf44,details::sf44_op) case_stmt(details::e_sf45,details::sf45_op) #undef case_stmt default : return error_node(); } @@ -9841,52 +9748,29 @@ namespace exprtk switch (operation) { #define case_stmt(op0,op1) case op0 : return node_allocator_->allocate > >(operation,branch); - case_stmt(details::e_sf00,details::sf00_op) - case_stmt(details::e_sf01,details::sf01_op) - case_stmt(details::e_sf02,details::sf02_op) - case_stmt(details::e_sf03,details::sf03_op) - case_stmt(details::e_sf04,details::sf04_op) - case_stmt(details::e_sf05,details::sf05_op) - case_stmt(details::e_sf06,details::sf06_op) - case_stmt(details::e_sf07,details::sf07_op) - case_stmt(details::e_sf08,details::sf08_op) - case_stmt(details::e_sf09,details::sf09_op) - case_stmt(details::e_sf10,details::sf10_op) - case_stmt(details::e_sf11,details::sf11_op) - case_stmt(details::e_sf12,details::sf12_op) - case_stmt(details::e_sf13,details::sf13_op) - case_stmt(details::e_sf14,details::sf14_op) - case_stmt(details::e_sf15,details::sf15_op) - case_stmt(details::e_sf16,details::sf16_op) - case_stmt(details::e_sf17,details::sf17_op) - case_stmt(details::e_sf18,details::sf18_op) - case_stmt(details::e_sf19,details::sf19_op) - case_stmt(details::e_sf20,details::sf20_op) - case_stmt(details::e_sf21,details::sf21_op) - case_stmt(details::e_sf22,details::sf22_op) - case_stmt(details::e_sf23,details::sf23_op) - case_stmt(details::e_sf24,details::sf24_op) - case_stmt(details::e_sf25,details::sf25_op) - case_stmt(details::e_sf26,details::sf26_op) - case_stmt(details::e_sf27,details::sf27_op) - case_stmt(details::e_sf28,details::sf28_op) - case_stmt(details::e_sf29,details::sf29_op) - case_stmt(details::e_sf30,details::sf30_op) - case_stmt(details::e_sf31,details::sf31_op) - case_stmt(details::e_sf32,details::sf32_op) - case_stmt(details::e_sf33,details::sf33_op) - case_stmt(details::e_sf34,details::sf34_op) - case_stmt(details::e_sf35,details::sf35_op) - case_stmt(details::e_sf36,details::sf36_op) - case_stmt(details::e_sf37,details::sf37_op) - case_stmt(details::e_sf38,details::sf38_op) - case_stmt(details::e_sf39,details::sf39_op) - case_stmt(details::e_sf40,details::sf40_op) - case_stmt(details::e_sf41,details::sf41_op) - case_stmt(details::e_sf42,details::sf42_op) - case_stmt(details::e_sf43,details::sf43_op) - case_stmt(details::e_sf44,details::sf44_op) - case_stmt(details::e_sf45,details::sf45_op) + case_stmt(details::e_sf00,details::sf00_op) case_stmt(details::e_sf01,details::sf01_op) + case_stmt(details::e_sf02,details::sf02_op) case_stmt(details::e_sf03,details::sf03_op) + case_stmt(details::e_sf04,details::sf04_op) case_stmt(details::e_sf05,details::sf05_op) + case_stmt(details::e_sf06,details::sf06_op) case_stmt(details::e_sf07,details::sf07_op) + case_stmt(details::e_sf08,details::sf08_op) case_stmt(details::e_sf09,details::sf09_op) + case_stmt(details::e_sf10,details::sf10_op) case_stmt(details::e_sf11,details::sf11_op) + case_stmt(details::e_sf12,details::sf12_op) case_stmt(details::e_sf13,details::sf13_op) + case_stmt(details::e_sf14,details::sf14_op) case_stmt(details::e_sf15,details::sf15_op) + case_stmt(details::e_sf16,details::sf16_op) case_stmt(details::e_sf17,details::sf17_op) + case_stmt(details::e_sf18,details::sf18_op) case_stmt(details::e_sf19,details::sf19_op) + case_stmt(details::e_sf20,details::sf20_op) case_stmt(details::e_sf21,details::sf21_op) + case_stmt(details::e_sf22,details::sf22_op) case_stmt(details::e_sf23,details::sf23_op) + case_stmt(details::e_sf24,details::sf24_op) case_stmt(details::e_sf25,details::sf25_op) + case_stmt(details::e_sf26,details::sf26_op) case_stmt(details::e_sf27,details::sf27_op) + case_stmt(details::e_sf28,details::sf28_op) case_stmt(details::e_sf29,details::sf29_op) + case_stmt(details::e_sf30,details::sf30_op) case_stmt(details::e_sf31,details::sf31_op) + case_stmt(details::e_sf32,details::sf32_op) case_stmt(details::e_sf33,details::sf33_op) + case_stmt(details::e_sf34,details::sf34_op) case_stmt(details::e_sf35,details::sf35_op) + case_stmt(details::e_sf36,details::sf36_op) case_stmt(details::e_sf37,details::sf37_op) + case_stmt(details::e_sf38,details::sf38_op) case_stmt(details::e_sf39,details::sf39_op) + case_stmt(details::e_sf40,details::sf40_op) case_stmt(details::e_sf41,details::sf41_op) + case_stmt(details::e_sf42,details::sf42_op) case_stmt(details::e_sf43,details::sf43_op) + case_stmt(details::e_sf44,details::sf44_op) case_stmt(details::e_sf45,details::sf45_op) #undef case_stmt default : return error_node(); } @@ -9898,58 +9782,32 @@ namespace exprtk switch (operation) { #define case_stmt(op0,op1) case op0 : temp_node = node_allocator_->allocate > >(operation,branch); break; - case_stmt(details::e_sf46,details::sf46_op) - case_stmt(details::e_sf47,details::sf47_op) - case_stmt(details::e_sf48,details::sf48_op) - case_stmt(details::e_sf49,details::sf49_op) - case_stmt(details::e_sf50,details::sf50_op) - case_stmt(details::e_sf51,details::sf51_op) - case_stmt(details::e_sf52,details::sf52_op) - case_stmt(details::e_sf53,details::sf53_op) - case_stmt(details::e_sf54,details::sf54_op) - case_stmt(details::e_sf55,details::sf55_op) - case_stmt(details::e_sf56,details::sf56_op) - case_stmt(details::e_sf57,details::sf57_op) - case_stmt(details::e_sf58,details::sf58_op) - case_stmt(details::e_sf59,details::sf59_op) - case_stmt(details::e_sf60,details::sf60_op) - case_stmt(details::e_sf61,details::sf61_op) - case_stmt(details::e_sf62,details::sf62_op) - case_stmt(details::e_sf63,details::sf63_op) - case_stmt(details::e_sf64,details::sf64_op) - case_stmt(details::e_sf65,details::sf65_op) - case_stmt(details::e_sf66,details::sf66_op) - case_stmt(details::e_sf67,details::sf67_op) - case_stmt(details::e_sf68,details::sf68_op) - case_stmt(details::e_sf69,details::sf69_op) - case_stmt(details::e_sf70,details::sf70_op) - case_stmt(details::e_sf71,details::sf71_op) - case_stmt(details::e_sf72,details::sf72_op) - case_stmt(details::e_sf73,details::sf73_op) - case_stmt(details::e_sf74,details::sf74_op) - case_stmt(details::e_sf75,details::sf75_op) - case_stmt(details::e_sf76,details::sf76_op) - case_stmt(details::e_sf77,details::sf77_op) - case_stmt(details::e_sf78,details::sf78_op) - case_stmt(details::e_sf79,details::sf79_op) - case_stmt(details::e_sf80,details::sf80_op) - case_stmt(details::e_sf81,details::sf81_op) - case_stmt(details::e_sf82,details::sf82_op) - case_stmt(details::e_sf83,details::sf83_op) - case_stmt(details::e_sf84,details::sf84_op) - case_stmt(details::e_sf85,details::sf85_op) - case_stmt(details::e_sf86,details::sf86_op) - case_stmt(details::e_sf87,details::sf87_op) - case_stmt(details::e_sf88,details::sf88_op) - case_stmt(details::e_sf89,details::sf89_op) - case_stmt(details::e_sf90,details::sf90_op) - case_stmt(details::e_sf91,details::sf91_op) - case_stmt(details::e_sf92,details::sf92_op) - case_stmt(details::e_sf93,details::sf93_op) - case_stmt(details::e_sf94,details::sf94_op) - case_stmt(details::e_sf95,details::sf95_op) - case_stmt(details::e_sf96,details::sf96_op) - case_stmt(details::e_sf97,details::sf97_op) + case_stmt(details::e_sf46,details::sf46_op) case_stmt(details::e_sf47,details::sf47_op) + case_stmt(details::e_sf48,details::sf48_op) case_stmt(details::e_sf49,details::sf49_op) + case_stmt(details::e_sf50,details::sf50_op) case_stmt(details::e_sf51,details::sf51_op) + case_stmt(details::e_sf52,details::sf52_op) case_stmt(details::e_sf53,details::sf53_op) + case_stmt(details::e_sf54,details::sf54_op) case_stmt(details::e_sf55,details::sf55_op) + case_stmt(details::e_sf56,details::sf56_op) case_stmt(details::e_sf57,details::sf57_op) + case_stmt(details::e_sf58,details::sf58_op) case_stmt(details::e_sf59,details::sf59_op) + case_stmt(details::e_sf60,details::sf60_op) case_stmt(details::e_sf61,details::sf61_op) + case_stmt(details::e_sf62,details::sf62_op) case_stmt(details::e_sf63,details::sf63_op) + case_stmt(details::e_sf64,details::sf64_op) case_stmt(details::e_sf65,details::sf65_op) + case_stmt(details::e_sf66,details::sf66_op) case_stmt(details::e_sf67,details::sf67_op) + case_stmt(details::e_sf68,details::sf68_op) case_stmt(details::e_sf69,details::sf69_op) + case_stmt(details::e_sf70,details::sf70_op) case_stmt(details::e_sf71,details::sf71_op) + case_stmt(details::e_sf72,details::sf72_op) case_stmt(details::e_sf73,details::sf73_op) + case_stmt(details::e_sf74,details::sf74_op) case_stmt(details::e_sf75,details::sf75_op) + case_stmt(details::e_sf76,details::sf76_op) case_stmt(details::e_sf77,details::sf77_op) + case_stmt(details::e_sf78,details::sf78_op) case_stmt(details::e_sf79,details::sf79_op) + case_stmt(details::e_sf80,details::sf80_op) case_stmt(details::e_sf81,details::sf81_op) + case_stmt(details::e_sf82,details::sf82_op) case_stmt(details::e_sf83,details::sf83_op) + case_stmt(details::e_sf84,details::sf84_op) case_stmt(details::e_sf85,details::sf85_op) + case_stmt(details::e_sf86,details::sf86_op) case_stmt(details::e_sf87,details::sf87_op) + case_stmt(details::e_sf88,details::sf88_op) case_stmt(details::e_sf89,details::sf89_op) + case_stmt(details::e_sf90,details::sf90_op) case_stmt(details::e_sf91,details::sf91_op) + case_stmt(details::e_sf92,details::sf92_op) case_stmt(details::e_sf93,details::sf93_op) + case_stmt(details::e_sf94,details::sf94_op) case_stmt(details::e_sf95,details::sf95_op) + case_stmt(details::e_sf96,details::sf96_op) case_stmt(details::e_sf97,details::sf97_op) #undef case_stmt default : return error_node(); } @@ -9967,58 +9825,32 @@ namespace exprtk switch (operation) { #define case_stmt(op0,op1) case op0 : return node_allocator_->allocate_rrrr > >(v0,v1,v2,v3); - case_stmt(details::e_sf46,details::sf46_op) - case_stmt(details::e_sf47,details::sf47_op) - case_stmt(details::e_sf48,details::sf48_op) - case_stmt(details::e_sf49,details::sf49_op) - case_stmt(details::e_sf50,details::sf50_op) - case_stmt(details::e_sf51,details::sf51_op) - case_stmt(details::e_sf52,details::sf52_op) - case_stmt(details::e_sf53,details::sf53_op) - case_stmt(details::e_sf54,details::sf54_op) - case_stmt(details::e_sf55,details::sf55_op) - case_stmt(details::e_sf56,details::sf56_op) - case_stmt(details::e_sf57,details::sf57_op) - case_stmt(details::e_sf58,details::sf58_op) - case_stmt(details::e_sf59,details::sf59_op) - case_stmt(details::e_sf60,details::sf60_op) - case_stmt(details::e_sf61,details::sf61_op) - case_stmt(details::e_sf62,details::sf62_op) - case_stmt(details::e_sf63,details::sf63_op) - case_stmt(details::e_sf64,details::sf64_op) - case_stmt(details::e_sf65,details::sf65_op) - case_stmt(details::e_sf66,details::sf66_op) - case_stmt(details::e_sf67,details::sf67_op) - case_stmt(details::e_sf68,details::sf68_op) - case_stmt(details::e_sf69,details::sf69_op) - case_stmt(details::e_sf70,details::sf70_op) - case_stmt(details::e_sf71,details::sf71_op) - case_stmt(details::e_sf72,details::sf72_op) - case_stmt(details::e_sf73,details::sf73_op) - case_stmt(details::e_sf74,details::sf74_op) - case_stmt(details::e_sf75,details::sf75_op) - case_stmt(details::e_sf76,details::sf76_op) - case_stmt(details::e_sf77,details::sf77_op) - case_stmt(details::e_sf78,details::sf78_op) - case_stmt(details::e_sf79,details::sf79_op) - case_stmt(details::e_sf80,details::sf80_op) - case_stmt(details::e_sf81,details::sf81_op) - case_stmt(details::e_sf82,details::sf82_op) - case_stmt(details::e_sf83,details::sf83_op) - case_stmt(details::e_sf84,details::sf84_op) - case_stmt(details::e_sf85,details::sf85_op) - case_stmt(details::e_sf86,details::sf86_op) - case_stmt(details::e_sf87,details::sf87_op) - case_stmt(details::e_sf88,details::sf88_op) - case_stmt(details::e_sf89,details::sf89_op) - case_stmt(details::e_sf90,details::sf90_op) - case_stmt(details::e_sf91,details::sf91_op) - case_stmt(details::e_sf92,details::sf92_op) - case_stmt(details::e_sf93,details::sf93_op) - case_stmt(details::e_sf94,details::sf94_op) - case_stmt(details::e_sf95,details::sf95_op) - case_stmt(details::e_sf96,details::sf96_op) - case_stmt(details::e_sf97,details::sf97_op) + case_stmt(details::e_sf46,details::sf46_op) case_stmt(details::e_sf47,details::sf47_op) + case_stmt(details::e_sf48,details::sf48_op) case_stmt(details::e_sf49,details::sf49_op) + case_stmt(details::e_sf50,details::sf50_op) case_stmt(details::e_sf51,details::sf51_op) + case_stmt(details::e_sf52,details::sf52_op) case_stmt(details::e_sf53,details::sf53_op) + case_stmt(details::e_sf54,details::sf54_op) case_stmt(details::e_sf55,details::sf55_op) + case_stmt(details::e_sf56,details::sf56_op) case_stmt(details::e_sf57,details::sf57_op) + case_stmt(details::e_sf58,details::sf58_op) case_stmt(details::e_sf59,details::sf59_op) + case_stmt(details::e_sf60,details::sf60_op) case_stmt(details::e_sf61,details::sf61_op) + case_stmt(details::e_sf62,details::sf62_op) case_stmt(details::e_sf63,details::sf63_op) + case_stmt(details::e_sf64,details::sf64_op) case_stmt(details::e_sf65,details::sf65_op) + case_stmt(details::e_sf66,details::sf66_op) case_stmt(details::e_sf67,details::sf67_op) + case_stmt(details::e_sf68,details::sf68_op) case_stmt(details::e_sf69,details::sf69_op) + case_stmt(details::e_sf70,details::sf70_op) case_stmt(details::e_sf71,details::sf71_op) + case_stmt(details::e_sf72,details::sf72_op) case_stmt(details::e_sf73,details::sf73_op) + case_stmt(details::e_sf74,details::sf74_op) case_stmt(details::e_sf75,details::sf75_op) + case_stmt(details::e_sf76,details::sf76_op) case_stmt(details::e_sf77,details::sf77_op) + case_stmt(details::e_sf78,details::sf78_op) case_stmt(details::e_sf79,details::sf79_op) + case_stmt(details::e_sf80,details::sf80_op) case_stmt(details::e_sf81,details::sf81_op) + case_stmt(details::e_sf82,details::sf82_op) case_stmt(details::e_sf83,details::sf83_op) + case_stmt(details::e_sf84,details::sf84_op) case_stmt(details::e_sf85,details::sf85_op) + case_stmt(details::e_sf86,details::sf86_op) case_stmt(details::e_sf87,details::sf87_op) + case_stmt(details::e_sf88,details::sf88_op) case_stmt(details::e_sf89,details::sf89_op) + case_stmt(details::e_sf90,details::sf90_op) case_stmt(details::e_sf91,details::sf91_op) + case_stmt(details::e_sf92,details::sf92_op) case_stmt(details::e_sf93,details::sf93_op) + case_stmt(details::e_sf94,details::sf94_op) case_stmt(details::e_sf95,details::sf95_op) + case_stmt(details::e_sf96,details::sf96_op) case_stmt(details::e_sf97,details::sf97_op) #undef case_stmt default : return error_node(); } @@ -10035,58 +9867,32 @@ namespace exprtk switch (operation) { #define case_stmt(op0,op1) case op0 : return node_allocator_->allocate > >(operation,branch); - case_stmt(details::e_sf46,details::sf46_op) - case_stmt(details::e_sf47,details::sf47_op) - case_stmt(details::e_sf48,details::sf48_op) - case_stmt(details::e_sf49,details::sf49_op) - case_stmt(details::e_sf50,details::sf50_op) - case_stmt(details::e_sf51,details::sf51_op) - case_stmt(details::e_sf52,details::sf52_op) - case_stmt(details::e_sf53,details::sf53_op) - case_stmt(details::e_sf54,details::sf54_op) - case_stmt(details::e_sf55,details::sf55_op) - case_stmt(details::e_sf56,details::sf56_op) - case_stmt(details::e_sf57,details::sf57_op) - case_stmt(details::e_sf58,details::sf58_op) - case_stmt(details::e_sf59,details::sf59_op) - case_stmt(details::e_sf60,details::sf60_op) - case_stmt(details::e_sf61,details::sf61_op) - case_stmt(details::e_sf62,details::sf62_op) - case_stmt(details::e_sf63,details::sf63_op) - case_stmt(details::e_sf64,details::sf64_op) - case_stmt(details::e_sf65,details::sf65_op) - case_stmt(details::e_sf66,details::sf66_op) - case_stmt(details::e_sf67,details::sf67_op) - case_stmt(details::e_sf68,details::sf68_op) - case_stmt(details::e_sf69,details::sf69_op) - case_stmt(details::e_sf70,details::sf70_op) - case_stmt(details::e_sf71,details::sf71_op) - case_stmt(details::e_sf72,details::sf72_op) - case_stmt(details::e_sf73,details::sf73_op) - case_stmt(details::e_sf74,details::sf74_op) - case_stmt(details::e_sf75,details::sf75_op) - case_stmt(details::e_sf76,details::sf76_op) - case_stmt(details::e_sf77,details::sf77_op) - case_stmt(details::e_sf78,details::sf78_op) - case_stmt(details::e_sf79,details::sf79_op) - case_stmt(details::e_sf80,details::sf80_op) - case_stmt(details::e_sf81,details::sf81_op) - case_stmt(details::e_sf82,details::sf82_op) - case_stmt(details::e_sf83,details::sf83_op) - case_stmt(details::e_sf84,details::sf84_op) - case_stmt(details::e_sf85,details::sf85_op) - case_stmt(details::e_sf86,details::sf86_op) - case_stmt(details::e_sf87,details::sf87_op) - case_stmt(details::e_sf88,details::sf88_op) - case_stmt(details::e_sf89,details::sf89_op) - case_stmt(details::e_sf90,details::sf90_op) - case_stmt(details::e_sf91,details::sf91_op) - case_stmt(details::e_sf92,details::sf92_op) - case_stmt(details::e_sf93,details::sf93_op) - case_stmt(details::e_sf94,details::sf94_op) - case_stmt(details::e_sf95,details::sf95_op) - case_stmt(details::e_sf96,details::sf96_op) - case_stmt(details::e_sf97,details::sf97_op) + case_stmt(details::e_sf46,details::sf46_op) case_stmt(details::e_sf47,details::sf47_op) + case_stmt(details::e_sf48,details::sf48_op) case_stmt(details::e_sf49,details::sf49_op) + case_stmt(details::e_sf50,details::sf50_op) case_stmt(details::e_sf51,details::sf51_op) + case_stmt(details::e_sf52,details::sf52_op) case_stmt(details::e_sf53,details::sf53_op) + case_stmt(details::e_sf54,details::sf54_op) case_stmt(details::e_sf55,details::sf55_op) + case_stmt(details::e_sf56,details::sf56_op) case_stmt(details::e_sf57,details::sf57_op) + case_stmt(details::e_sf58,details::sf58_op) case_stmt(details::e_sf59,details::sf59_op) + case_stmt(details::e_sf60,details::sf60_op) case_stmt(details::e_sf61,details::sf61_op) + case_stmt(details::e_sf62,details::sf62_op) case_stmt(details::e_sf63,details::sf63_op) + case_stmt(details::e_sf64,details::sf64_op) case_stmt(details::e_sf65,details::sf65_op) + case_stmt(details::e_sf66,details::sf66_op) case_stmt(details::e_sf67,details::sf67_op) + case_stmt(details::e_sf68,details::sf68_op) case_stmt(details::e_sf69,details::sf69_op) + case_stmt(details::e_sf70,details::sf70_op) case_stmt(details::e_sf71,details::sf71_op) + case_stmt(details::e_sf72,details::sf72_op) case_stmt(details::e_sf73,details::sf73_op) + case_stmt(details::e_sf74,details::sf74_op) case_stmt(details::e_sf75,details::sf75_op) + case_stmt(details::e_sf76,details::sf76_op) case_stmt(details::e_sf77,details::sf77_op) + case_stmt(details::e_sf78,details::sf78_op) case_stmt(details::e_sf79,details::sf79_op) + case_stmt(details::e_sf80,details::sf80_op) case_stmt(details::e_sf81,details::sf81_op) + case_stmt(details::e_sf82,details::sf82_op) case_stmt(details::e_sf83,details::sf83_op) + case_stmt(details::e_sf84,details::sf84_op) case_stmt(details::e_sf85,details::sf85_op) + case_stmt(details::e_sf86,details::sf86_op) case_stmt(details::e_sf87,details::sf87_op) + case_stmt(details::e_sf88,details::sf88_op) case_stmt(details::e_sf89,details::sf89_op) + case_stmt(details::e_sf90,details::sf90_op) case_stmt(details::e_sf91,details::sf91_op) + case_stmt(details::e_sf92,details::sf92_op) case_stmt(details::e_sf93,details::sf93_op) + case_stmt(details::e_sf94,details::sf94_op) case_stmt(details::e_sf95,details::sf95_op) + case_stmt(details::e_sf96,details::sf96_op) case_stmt(details::e_sf97,details::sf97_op) #undef case_stmt default : return error_node(); } @@ -10455,34 +10261,20 @@ namespace exprtk switch (sf3opr) { #define case_stmt(op0,op1) case op0 : return details::T0oT1oT2_sf3ext >::allocate(*(expr_gen.node_allocator_),t0,t1,t2); - case_stmt(details::e_sf00,details::sf00_op) - case_stmt(details::e_sf01,details::sf01_op) - case_stmt(details::e_sf02,details::sf02_op) - case_stmt(details::e_sf03,details::sf03_op) - case_stmt(details::e_sf04,details::sf04_op) - case_stmt(details::e_sf05,details::sf05_op) - case_stmt(details::e_sf06,details::sf06_op) - case_stmt(details::e_sf07,details::sf07_op) - case_stmt(details::e_sf08,details::sf08_op) - case_stmt(details::e_sf09,details::sf09_op) - case_stmt(details::e_sf10,details::sf10_op) - case_stmt(details::e_sf11,details::sf11_op) - case_stmt(details::e_sf12,details::sf12_op) - case_stmt(details::e_sf13,details::sf13_op) - case_stmt(details::e_sf14,details::sf14_op) - case_stmt(details::e_sf15,details::sf15_op) - case_stmt(details::e_sf16,details::sf16_op) - case_stmt(details::e_sf17,details::sf17_op) - case_stmt(details::e_sf18,details::sf18_op) - case_stmt(details::e_sf19,details::sf19_op) - case_stmt(details::e_sf20,details::sf20_op) - case_stmt(details::e_sf21,details::sf21_op) - case_stmt(details::e_sf22,details::sf22_op) - case_stmt(details::e_sf23,details::sf23_op) - case_stmt(details::e_sf24,details::sf24_op) - case_stmt(details::e_sf25,details::sf25_op) - case_stmt(details::e_sf26,details::sf26_op) - case_stmt(details::e_sf27,details::sf27_op) + case_stmt(details::e_sf00,details::sf00_op) case_stmt(details::e_sf01,details::sf01_op) + case_stmt(details::e_sf02,details::sf02_op) case_stmt(details::e_sf03,details::sf03_op) + case_stmt(details::e_sf04,details::sf04_op) case_stmt(details::e_sf05,details::sf05_op) + case_stmt(details::e_sf06,details::sf06_op) case_stmt(details::e_sf07,details::sf07_op) + case_stmt(details::e_sf08,details::sf08_op) case_stmt(details::e_sf09,details::sf09_op) + case_stmt(details::e_sf10,details::sf10_op) case_stmt(details::e_sf11,details::sf11_op) + case_stmt(details::e_sf12,details::sf12_op) case_stmt(details::e_sf13,details::sf13_op) + case_stmt(details::e_sf14,details::sf14_op) case_stmt(details::e_sf15,details::sf15_op) + case_stmt(details::e_sf16,details::sf16_op) case_stmt(details::e_sf17,details::sf17_op) + case_stmt(details::e_sf18,details::sf18_op) case_stmt(details::e_sf19,details::sf19_op) + case_stmt(details::e_sf20,details::sf20_op) case_stmt(details::e_sf21,details::sf21_op) + case_stmt(details::e_sf22,details::sf22_op) case_stmt(details::e_sf23,details::sf23_op) + case_stmt(details::e_sf24,details::sf24_op) case_stmt(details::e_sf25,details::sf25_op) + case_stmt(details::e_sf26,details::sf26_op) case_stmt(details::e_sf27,details::sf27_op) case_stmt(details::e_sf28,details::sf28_op) #undef case_stmt default : return error_node(); @@ -10513,82 +10305,44 @@ namespace exprtk switch (sf4opr) { #define case_stmt(op0,op1) case op0 : return details::T0oT1oT2oT3_sf4ext >::allocate(*(expr_gen.node_allocator_),t0,t1,t2,t3); - case_stmt(details::e_sf46,details::sf46_op) - case_stmt(details::e_sf47,details::sf47_op) - case_stmt(details::e_sf48,details::sf48_op) - case_stmt(details::e_sf49,details::sf49_op) - case_stmt(details::e_sf50,details::sf50_op) - case_stmt(details::e_sf51,details::sf51_op) - case_stmt(details::e_sf52,details::sf52_op) - case_stmt(details::e_sf53,details::sf53_op) - case_stmt(details::e_sf54,details::sf54_op) - case_stmt(details::e_sf55,details::sf55_op) - case_stmt(details::e_sf56,details::sf56_op) - case_stmt(details::e_sf57,details::sf57_op) - case_stmt(details::e_sf58,details::sf58_op) - case_stmt(details::e_sf59,details::sf59_op) - case_stmt(details::e_sf60,details::sf60_op) - case_stmt(details::e_sf61,details::sf61_op) - case_stmt(details::e_sf62,details::sf62_op) - case_stmt(details::e_sf63,details::sf63_op) - case_stmt(details::e_sf64,details::sf64_op) - case_stmt(details::e_sf65,details::sf65_op) - case_stmt(details::e_sf66,details::sf66_op) - case_stmt(details::e_sf67,details::sf67_op) - case_stmt(details::e_sf68,details::sf68_op) - case_stmt(details::e_sf69,details::sf69_op) - case_stmt(details::e_sf70,details::sf70_op) - case_stmt(details::e_sf71,details::sf71_op) - case_stmt(details::e_sf72,details::sf72_op) - case_stmt(details::e_sf73,details::sf73_op) - case_stmt(details::e_sf74,details::sf74_op) - case_stmt(details::e_sf75,details::sf75_op) - case_stmt(details::e_sf76,details::sf76_op) - case_stmt(details::e_sf77,details::sf77_op) - case_stmt(details::e_sf78,details::sf78_op) - case_stmt(details::e_sf79,details::sf79_op) - case_stmt(details::e_sf80,details::sf80_op) - case_stmt(details::e_sf81,details::sf81_op) - case_stmt(details::e_sf4ext00,details::sfext00_op) - case_stmt(details::e_sf4ext01,details::sfext01_op) - case_stmt(details::e_sf4ext02,details::sfext02_op) - case_stmt(details::e_sf4ext03,details::sfext03_op) - case_stmt(details::e_sf4ext04,details::sfext04_op) - case_stmt(details::e_sf4ext05,details::sfext05_op) - case_stmt(details::e_sf4ext06,details::sfext06_op) - case_stmt(details::e_sf4ext07,details::sfext07_op) - case_stmt(details::e_sf4ext08,details::sfext08_op) - case_stmt(details::e_sf4ext09,details::sfext09_op) - case_stmt(details::e_sf4ext10,details::sfext10_op) - case_stmt(details::e_sf4ext11,details::sfext11_op) - case_stmt(details::e_sf4ext12,details::sfext12_op) - case_stmt(details::e_sf4ext13,details::sfext13_op) - case_stmt(details::e_sf4ext14,details::sfext14_op) - case_stmt(details::e_sf4ext15,details::sfext15_op) - case_stmt(details::e_sf4ext16,details::sfext16_op) - case_stmt(details::e_sf4ext17,details::sfext17_op) - case_stmt(details::e_sf4ext18,details::sfext18_op) - case_stmt(details::e_sf4ext19,details::sfext19_op) - case_stmt(details::e_sf4ext20,details::sfext20_op) - case_stmt(details::e_sf4ext21,details::sfext21_op) - case_stmt(details::e_sf4ext22,details::sfext22_op) - case_stmt(details::e_sf4ext23,details::sfext23_op) - case_stmt(details::e_sf4ext24,details::sfext24_op) - case_stmt(details::e_sf4ext25,details::sfext25_op) - case_stmt(details::e_sf4ext26,details::sfext26_op) - case_stmt(details::e_sf4ext27,details::sfext27_op) - case_stmt(details::e_sf4ext28,details::sfext28_op) - case_stmt(details::e_sf4ext29,details::sfext29_op) - case_stmt(details::e_sf4ext30,details::sfext30_op) - case_stmt(details::e_sf4ext31,details::sfext31_op) - case_stmt(details::e_sf4ext32,details::sfext32_op) - case_stmt(details::e_sf4ext33,details::sfext33_op) - case_stmt(details::e_sf4ext34,details::sfext34_op) - case_stmt(details::e_sf4ext35,details::sfext35_op) - case_stmt(details::e_sf4ext36,details::sfext36_op) - case_stmt(details::e_sf4ext37,details::sfext37_op) - case_stmt(details::e_sf4ext38,details::sfext38_op) - case_stmt(details::e_sf4ext39,details::sfext39_op) + case_stmt(details::e_sf46,details::sf46_op) case_stmt(details::e_sf47,details::sf47_op) + case_stmt(details::e_sf48,details::sf48_op) case_stmt(details::e_sf49,details::sf49_op) + case_stmt(details::e_sf50,details::sf50_op) case_stmt(details::e_sf51,details::sf51_op) + case_stmt(details::e_sf52,details::sf52_op) case_stmt(details::e_sf53,details::sf53_op) + case_stmt(details::e_sf54,details::sf54_op) case_stmt(details::e_sf55,details::sf55_op) + case_stmt(details::e_sf56,details::sf56_op) case_stmt(details::e_sf57,details::sf57_op) + case_stmt(details::e_sf58,details::sf58_op) case_stmt(details::e_sf59,details::sf59_op) + case_stmt(details::e_sf60,details::sf60_op) case_stmt(details::e_sf61,details::sf61_op) + case_stmt(details::e_sf62,details::sf62_op) case_stmt(details::e_sf63,details::sf63_op) + case_stmt(details::e_sf64,details::sf64_op) case_stmt(details::e_sf65,details::sf65_op) + case_stmt(details::e_sf66,details::sf66_op) case_stmt(details::e_sf67,details::sf67_op) + case_stmt(details::e_sf68,details::sf68_op) case_stmt(details::e_sf69,details::sf69_op) + case_stmt(details::e_sf70,details::sf70_op) case_stmt(details::e_sf71,details::sf71_op) + case_stmt(details::e_sf72,details::sf72_op) case_stmt(details::e_sf73,details::sf73_op) + case_stmt(details::e_sf74,details::sf74_op) case_stmt(details::e_sf75,details::sf75_op) + case_stmt(details::e_sf76,details::sf76_op) case_stmt(details::e_sf77,details::sf77_op) + case_stmt(details::e_sf78,details::sf78_op) case_stmt(details::e_sf79,details::sf79_op) + case_stmt(details::e_sf80,details::sf80_op) case_stmt(details::e_sf81,details::sf81_op) + case_stmt(details::e_sf4ext00,details::sfext00_op) case_stmt(details::e_sf4ext01,details::sfext01_op) + case_stmt(details::e_sf4ext02,details::sfext02_op) case_stmt(details::e_sf4ext03,details::sfext03_op) + case_stmt(details::e_sf4ext04,details::sfext04_op) case_stmt(details::e_sf4ext05,details::sfext05_op) + case_stmt(details::e_sf4ext06,details::sfext06_op) case_stmt(details::e_sf4ext07,details::sfext07_op) + case_stmt(details::e_sf4ext08,details::sfext08_op) case_stmt(details::e_sf4ext09,details::sfext09_op) + case_stmt(details::e_sf4ext10,details::sfext10_op) case_stmt(details::e_sf4ext11,details::sfext11_op) + case_stmt(details::e_sf4ext12,details::sfext12_op) case_stmt(details::e_sf4ext13,details::sfext13_op) + case_stmt(details::e_sf4ext14,details::sfext14_op) case_stmt(details::e_sf4ext15,details::sfext15_op) + case_stmt(details::e_sf4ext16,details::sfext16_op) case_stmt(details::e_sf4ext17,details::sfext17_op) + case_stmt(details::e_sf4ext18,details::sfext18_op) case_stmt(details::e_sf4ext19,details::sfext19_op) + case_stmt(details::e_sf4ext20,details::sfext20_op) case_stmt(details::e_sf4ext21,details::sfext21_op) + case_stmt(details::e_sf4ext22,details::sfext22_op) case_stmt(details::e_sf4ext23,details::sfext23_op) + case_stmt(details::e_sf4ext24,details::sfext24_op) case_stmt(details::e_sf4ext25,details::sfext25_op) + case_stmt(details::e_sf4ext26,details::sfext26_op) case_stmt(details::e_sf4ext27,details::sfext27_op) + case_stmt(details::e_sf4ext28,details::sfext28_op) case_stmt(details::e_sf4ext29,details::sfext29_op) + case_stmt(details::e_sf4ext30,details::sfext30_op) case_stmt(details::e_sf4ext31,details::sfext31_op) + case_stmt(details::e_sf4ext32,details::sfext32_op) case_stmt(details::e_sf4ext33,details::sfext33_op) + case_stmt(details::e_sf4ext34,details::sfext34_op) case_stmt(details::e_sf4ext35,details::sfext35_op) + case_stmt(details::e_sf4ext36,details::sfext36_op) case_stmt(details::e_sf4ext37,details::sfext37_op) + case_stmt(details::e_sf4ext38,details::sfext38_op) case_stmt(details::e_sf4ext39,details::sfext39_op) #undef case_stmt default : return error_node(); } @@ -13189,6 +12943,52 @@ namespace exprtk } #endif + inline expression_node_ptr synthesize_null_expression(const details::operator_type& operation, expression_node_ptr (&branch)[2]) + { + bool b0_null = details::is_null_node(branch[0]); + bool b1_null = details::is_null_node(branch[1]); + + if (b0_null && b1_null) + { + details::free_node(*node_allocator_,branch[1]); + return branch[0]; + } + else if (b0_null) + { + details::free_node(*node_allocator_,branch[0]); + branch[0] = branch[1]; + branch[1] = error_node(); + } + else if (b1_null) + { + details::free_node(*node_allocator_,branch[1]); + branch[1] = error_node(); + } + + if ( + (details::e_add == operation) || (details::e_sub == operation) || + (details::e_mul == operation) || (details::e_div == operation) || + (details::e_mod == operation) || (details::e_pow == operation) + ) + { + return branch[0]; + } + else if ( + (details::e_lt == operation) || (details::e_lte == operation) || + (details::e_gt == operation) || (details::e_gte == operation) || + (details::e_eq == operation) || (details::e_ne == operation) || + (details::e_and == operation) || (details::e_nand == operation) || + (details::e_or == operation) || (details::e_nor == operation) || + (details::e_xor == operation) || (details::e_in == operation) || + (details::e_like == operation) || (details::e_ilike == operation) + ) + { + return node_allocator_->allocate_c(T(0)); + } + details::free_node(*node_allocator_,branch[0]); + return node_allocator_->allocate >(); + } + template inline expression_node_ptr synthesize_expression(const details::operator_type& operation, expression_node_ptr (&branch)[N]) { @@ -13267,7 +13067,6 @@ namespace exprtk inline void load_unary_operations_map(unary_op_map_t& m) { #define register_unary_op(Op,UnaryFunctor) m.insert(std::make_pair(Op,UnaryFunctor::process)); - register_unary_op(details:: e_abs,details:: abs_op) register_unary_op(details:: e_acos,details:: acos_op) register_unary_op(details:: e_asin,details:: asin_op) @@ -13279,6 +13078,7 @@ namespace exprtk register_unary_op(details::e_floor,details::floor_op) register_unary_op(details:: e_log,details:: log_op) register_unary_op(details::e_log10,details::log10_op) + register_unary_op(details::e_log1p,details::log1p_op) register_unary_op(details:: e_neg,details:: neg_op) register_unary_op(details:: e_pos,details:: pos_op) register_unary_op(details::e_round,details::round_op) @@ -13306,7 +13106,6 @@ namespace exprtk inline void load_binary_operations_map(binary_op_map_t& m) { #define register_binary_op(Op,BinaryFunctor) m.insert(typename binary_op_map_t::value_type(Op,BinaryFunctor::process)); - register_binary_op(details:: e_add,details:: add_op) register_binary_op(details:: e_sub,details:: sub_op) register_binary_op(details:: e_mul,details:: mul_op) @@ -13330,7 +13129,6 @@ namespace exprtk inline void load_inv_binary_operations_map(inv_binary_op_map_t& m) { #define register_binary_op(Op,BinaryFunctor) m.insert(typename inv_binary_op_map_t::value_type(BinaryFunctor::process,Op)); - register_binary_op(details:: e_add,details:: add_op) register_binary_op(details:: e_sub,details:: sub_op) register_binary_op(details:: e_mul,details:: mul_op) @@ -13355,35 +13153,13 @@ namespace exprtk { typedef std::pair pair_t; #define register_sf3(Op) sf3_map[details::sf##Op##_op::id()] = pair_t(details::sf##Op##_op::process,details::e_sf##Op); - - register_sf3(00) - register_sf3(01) - register_sf3(02) - register_sf3(03) - register_sf3(04) - register_sf3(05) - register_sf3(06) - register_sf3(07) - register_sf3(08) - register_sf3(09) - register_sf3(10) - register_sf3(11) - register_sf3(12) - register_sf3(13) - register_sf3(14) - register_sf3(15) - register_sf3(16) - register_sf3(17) - register_sf3(18) - register_sf3(19) - register_sf3(20) - register_sf3(21) - register_sf3(22) - register_sf3(23) - register_sf3(24) - register_sf3(25) - register_sf3(26) - register_sf3(27) + register_sf3(00) register_sf3(01) register_sf3(02) register_sf3(03) + register_sf3(04) register_sf3(05) register_sf3(06) register_sf3(07) + register_sf3(08) register_sf3(09) register_sf3(10) register_sf3(11) + register_sf3(12) register_sf3(13) register_sf3(14) register_sf3(15) + register_sf3(16) register_sf3(17) register_sf3(18) register_sf3(19) + register_sf3(20) register_sf3(21) register_sf3(22) register_sf3(23) + register_sf3(24) register_sf3(25) register_sf3(26) register_sf3(27) register_sf3(28) #undef register_sf3 } @@ -13392,79 +13168,27 @@ namespace exprtk { typedef std::pair pair_t; #define register_sf4(Op) sf4_map[details::sf##Op##_op::id()] = pair_t(details::sf##Op##_op::process,details::e_sf##Op); - - register_sf4(46) - register_sf4(47) - register_sf4(48) - register_sf4(49) - register_sf4(50) - register_sf4(51) - register_sf4(52) - register_sf4(53) - register_sf4(54) - register_sf4(55) - register_sf4(56) - register_sf4(57) - register_sf4(58) - register_sf4(59) - register_sf4(60) - register_sf4(61) - register_sf4(62) - register_sf4(63) - register_sf4(64) - register_sf4(65) - register_sf4(66) - register_sf4(67) - register_sf4(68) - register_sf4(69) - register_sf4(70) - register_sf4(71) - register_sf4(72) - register_sf4(73) - register_sf4(74) - register_sf4(75) - register_sf4(76) - register_sf4(77) - register_sf4(78) - register_sf4(79) - register_sf4(80) - register_sf4(81) + register_sf4(46) register_sf4(47) register_sf4(48) register_sf4(49) + register_sf4(50) register_sf4(51) register_sf4(52) register_sf4(53) + register_sf4(54) register_sf4(55) register_sf4(56) register_sf4(57) + register_sf4(58) register_sf4(59) register_sf4(60) register_sf4(61) + register_sf4(62) register_sf4(63) register_sf4(64) register_sf4(65) + register_sf4(66) register_sf4(67) register_sf4(68) register_sf4(69) + register_sf4(70) register_sf4(71) register_sf4(72) register_sf4(73) + register_sf4(74) register_sf4(75) register_sf4(76) register_sf4(77) + register_sf4(78) register_sf4(79) register_sf4(80) register_sf4(81) #undef register_sf4 typedef std::pair pair_t; #define register_sf4ext(Op) sf4_map[details::sfext##Op##_op::id()] = pair_t(details::sfext##Op##_op::process,details::e_sf4ext##Op); - register_sf4ext(00) - register_sf4ext(01) - register_sf4ext(02) - register_sf4ext(03) - register_sf4ext(04) - register_sf4ext(05) - register_sf4ext(06) - register_sf4ext(07) - register_sf4ext(08) - register_sf4ext(09) - register_sf4ext(10) - register_sf4ext(11) - register_sf4ext(12) - register_sf4ext(13) - register_sf4ext(14) - register_sf4ext(15) - register_sf4ext(16) - register_sf4ext(17) - register_sf4ext(18) - register_sf4ext(19) - register_sf4ext(20) - register_sf4ext(21) - register_sf4ext(22) - register_sf4ext(23) - register_sf4ext(24) - register_sf4ext(25) - register_sf4ext(26) - register_sf4ext(27) - register_sf4ext(28) - register_sf4ext(29) - register_sf4ext(30) - register_sf4ext(31) + register_sf4ext(00) register_sf4ext(01) register_sf4ext(02) register_sf4ext(03) + register_sf4ext(04) register_sf4ext(05) register_sf4ext(06) register_sf4ext(07) + register_sf4ext(08) register_sf4ext(09) register_sf4ext(10) register_sf4ext(11) + register_sf4ext(12) register_sf4ext(13) register_sf4ext(14) register_sf4ext(15) + register_sf4ext(16) register_sf4ext(17) register_sf4ext(18) register_sf4ext(19) + register_sf4ext(20) register_sf4ext(21) register_sf4ext(22) register_sf4ext(23) + register_sf4ext(24) register_sf4ext(25) register_sf4ext(26) register_sf4ext(27) + register_sf4ext(28) register_sf4ext(29) register_sf4ext(30) register_sf4ext(31) #undef register_sf4ext } diff --git a/exprtk_benchmark.cpp b/exprtk_benchmark.cpp index 7ebf74b..aa5576e 100644 --- a/exprtk_benchmark.cpp +++ b/exprtk_benchmark.cpp @@ -40,7 +40,7 @@ const std::string expression_list[] = { "x + (cos(y - sin(2 / x * pi)) - sin(x - cos(2 * y / pi))) - y", "clamp(-1.0, sin(2 * pi * x) + cos(y / 2 * pi), +1.0)", "max(3.33, min(sqrt(1 - sin(2 * x) + cos(pi / y) / 3), 1.11))", - "if(avg(x,y) <= x + y, x - y, x * y) + 2 * pi / x" + "if((y + (x * 2.2)) <= (x + y + 1.1), x - y, x * y) + 2 * pi / x" }; const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string); @@ -257,7 +257,7 @@ struct native static inline T func15(Type x, Type y) { - return ((avg(x,y) <= x + y) ? x - y : x * y) + T(2.0) * pi / x; + return (((y + (x * 2.2)) <= (x + y + 1.1)) ? x - y : x * y) + T(2.0) * pi / x; } }; diff --git a/exprtk_test.cpp b/exprtk_test.cpp index 80e92e3..68e00bb 100644 --- a/exprtk_test.cpp +++ b/exprtk_test.cpp @@ -600,8 +600,8 @@ static const test_t test_list[] = test_t("log(2.7182818284590451)",1.0), test_t("log10(10.0)",1.0), test_t("frac(12.34) + trunc(12.34)",12.34), - test_t("hyp(3.0,4.0)",5.0), - test_t("hyp(1.0,sqrt(3.0))",2.0), + test_t("hypot(3.0,4.0)",5.0), + test_t("hypot(1.0,sqrt(3.0))",2.0), test_t("if(1 < 2, 3, 4)",3.0), test_t("if(1.1 < 2.2, 3.3, 4.4)",3.3), test_t("if((1.0+1.1) < (2.0+1.2), 3.3, 4.4)",3.3), diff --git a/readme.txt b/readme.txt index 3fa5968..cf25d89 100644 --- a/readme.txt +++ b/readme.txt @@ -16,12 +16,13 @@ operations, functions and processes: (1) Basic operators: +, -, *, /, %, ^ (2) Functions: min, max, avg, sum, abs, ceil, floor, round, - roundn, exp, log, log10, logn, root, sqrt, - clamp, inrange, sgn, erf, erfc, frac, trunc + roundn, exp, log, log10, logn, log1p, root, + sqrt, clamp, inrange, sgn, erf, erfc, frac, + trunc (3) Trigonometry: sin, cos, tan, acos, asin, atan, atan2, cosh, cot, csc, sec, sinh, tanh, rad2deg, deg2rad, - deg2grad, grad2deg, hyp + deg2grad, grad2deg, hypot (4) Equalities & Inequalities: =, ==, <>, !=, <, <=, >, >= @@ -34,10 +35,10 @@ operations, functions and processes: (7) Assignment: := -(8) Calculus: numerical integration and differentiation +(8) String + processing: in, like, ilike -Note 1: Normal mathematical operator precedence is applied (BEDMAS). -Note 2: The trigonometry functions assume radians as input. +(9) Calculus: numerical integration and differentiation @@ -108,11 +109,200 @@ Expression Library can be found at: +[BUILT-IN OPERATIONS & FUNCTIONS] + +(0) Basic Operators ++-----------+--------------------------------------------------------+ +| OPERATOR | DEFINITION | ++-----------+--------------------------------------------------------+ +| + | Addition between x and y. (eg: x + y) | ++-----------+--------------------------------------------------------+ +| - | Subtraction between x and y. (eg: x - y) | ++-----------+--------------------------------------------------------+ +| * | Multiplication between x and y. (eg: x * y) | ++-----------+--------------------------------------------------------+ +| / | Division between x and y (eg: x / y) | ++-----------+--------------------------------------------------------+ +| % | Modulus of x with respect to y. (eg: x % y) | ++-----------+--------------------------------------------------------+ +| ^ | x to the power of y. (eg: x ^ y) | ++-----------+--------------------------------------------------------+ +| := | Assign the value of x to y. (eg: y := x) | +| | where y is a variable type. | ++-----------+--------------------------------------------------------+ + +(1) Equalities & Inequalities ++-----------+--------------------------------------------------------+ +| OPERATOR | DEFINITION | ++-----------+--------------------------------------------------------+ +| == or = | True only if x is strictly equal to y. (eg: x == y) | ++-----------+--------------------------------------------------------+ +| <> or != | True only if x does not equal y (eg: x <> y or x != y) | ++-----------+--------------------------------------------------------+ +| < | True only if x less than y. (eg: x < y) | ++-----------+--------------------------------------------------------+ +| <= | True only if x less than or equal to y. (eg: x <= y) | ++-----------+--------------------------------------------------------+ +| > | True only if x greater than y. (eg: x > y) | ++-----------+--------------------------------------------------------+ +| >= | True only if x greater than or equal to y (eg: x >= y) | ++-----------+--------------------------------------------------------+ + +(2) Boolean Operations ++-----------+--------------------------------------------------------+ +| OPERATOR | DEFINITION | ++-----------+--------------------------------------------------------+ +| true | True state or any value other than zero (typically 1). | ++-----------+--------------------------------------------------------+ +| false | False state, value of zero. | ++-----------|--------------------------------------------------------+ +| and | Logical AND, True only if x and y are both true. | +| | (eg: x and y) | ++-----------+--------------------------------------------------------+ +| nand | Logical NAND, True only if either x or y is false. | +| | (eg: x nand y) | ++-----------+--------------------------------------------------------+ +| nor | Logical NOR, True only if the result of x or y is false| +| | (eg: x nor y) | ++-----------+--------------------------------------------------------+ +| not | Logical NOT, Negate the logical sense of the input. | +| | (eg: not(x and y) == x nand y) | ++-----------+--------------------------------------------------------+ +| or | Logical OR, True if either x or y is true. (eg: x or y)| ++-----------+--------------------------------------------------------+ +| xor | Local XOR, True only if the logical states of x and y | +| | differ. (eg: x xor y) | ++-----------+--------------------------------------------------------+ +| if | If x is true then return y else return z. | +| | (eg: if(x, y, z) or if((x + 1) > 2y, z + 1, w / v)) | ++-----------+--------------------------------------------------------+ + +(3) General Purpose Functions ++-----------+--------------------------------------------------------+ +| FUNCTION | DEFINITION | ++-----------+--------------------------------------------------------+ +| abs | Absolute value of x. | ++-----------+--------------------------------------------------------+ +| avg | The average of all the inputs. | +| | (eg: avg(x,y,z,w) == (x+y+z+w)/4) | ++-----------+--------------------------------------------------------+ +| ceil | Smallest integer that is greater than or equal to x. | ++-----------+--------------------------------------------------------+ +| clamp | Clamp x in range between r0 and r1, where r0 < r1. | +| | (eg: clamp(r0,x,r1) | ++-----------+--------------------------------------------------------+ +| equal | Equality test between x and y using normalized epsilon | ++-----------+--------------------------------------------------------+ +| erf | Error function of x | ++-----------+--------------------------------------------------------+ +| erfc | Complimentary error function of x | ++-----------+--------------------------------------------------------+ +| exp | e to the power of x | ++-----------+--------------------------------------------------------+ +| floor | Largest integer that is less than or equal to x. | ++-----------+--------------------------------------------------------+ +| frac | Fractional portion of x | ++-----------+--------------------------------------------------------+ +| hypot | Hypotenuse of x and y (eg: hypot(x,y)) | ++-----------+--------------------------------------------------------+ +| log | Natural logarithm of x | ++-----------+--------------------------------------------------------+ +| log10 | Base 10 logarithm of x | ++-----------+--------------------------------------------------------+ +| logn | Base N logarithm of x (eg: logn(1235,8)) | +| | where n > 0 and is an integer. | ++-----------+--------------------------------------------------------+ +| log1p | Natural logarithm of 1 + x (eg: log1p(x)) | +| | where x is very small. | ++-----------+--------------------------------------------------------+ +| nequal | Not-equal test between x and y using normalized epsilon| ++-----------+--------------------------------------------------------+ +| root | Nth-Root of x (eg: root(x,3)) | +| | where n > 0 and is an integer. | ++-----------+--------------------------------------------------------+ +| round | Round x to the nearest integer. | ++-----------+--------------------------------------------------------+ +| roundn | Round x to the n decimal places (eg: roundn(x,4)) | +| | where n > 0 and is an integer. | ++-----------+--------------------------------------------------------+ +| sgn | Sign of x, -1 where x < 0, +1 where x > 0, else zero. | ++-----------+--------------------------------------------------------+ +| sqrt | Square root of x, where x > 0 | ++-----------+--------------------------------------------------------+ +| sum | The sum of all the inputs. | +| | (eg: sum(x,y,z,w,v) == (x+y+z+w+v)) | ++-----------+--------------------------------------------------------+ +| trunc | Integer portion of x | ++-----------+--------------------------------------------------------+ + +(4) Trigonometry Functions ++-----------+--------------------------------------------------------+ +| FUNCTION | DEFINITION | ++-----------+--------------------------------------------------------+ +| acos | Arc cosine of x expressed in radians. Interval [-1,+1] | ++-----------+--------------------------------------------------------+ +| asin | Arc sine of x expressed in radians. Interval [-1,+1] | ++-----------+--------------------------------------------------------+ +| atan | Arc tangent of x expressed in radians. Interval [-1,+1]| ++-----------+--------------------------------------------------------+ +| atan2 | Arc tangent of x expressed in radians. Interval [-1,+1]| ++-----------+--------------------------------------------------------+ +| cos | Cosine of x | ++-----------+--------------------------------------------------------+ +| cosh | Hyperbolic cosine of x | ++-----------+--------------------------------------------------------+ +| cot | Cotangent of x | ++-----------+--------------------------------------------------------+ +| csc | Cosecant of x | ++-----------+--------------------------------------------------------+ +| sec | Secant of x | ++-----------+--------------------------------------------------------+ +| sin | Sine of x | ++-----------+--------------------------------------------------------+ +| sinh | Hyperbolic sine of x | ++-----------+--------------------------------------------------------+ +| tan | Tangent of x | ++-----------+--------------------------------------------------------+ +| tanh | Hyperbolic tangent of x | ++-----------+--------------------------------------------------------+ +| rad2deg | Convert x from radians to degrees | ++-----------+--------------------------------------------------------+ +| deg2rad | Convert x from degrees to radians | ++-----------+--------------------------------------------------------+ +| deg2grad | Convert x from degrees to gradians | ++-----------+--------------------------------------------------------+ +| grad2deg | Convert x from gradians to degrees | ++-----------+--------------------------------------------------------+ + +(5) String Processing ++-----------+--------------------------------------------------------+ +| FUNCTION | DEFINITION | ++-----------+--------------------------------------------------------+ +| in | True only if x is a substring of y | +| | (eg: x in y or 'abc' in 'abcdefgh') | ++-----------+--------------------------------------------------------+ +| like | True only if the string x matches the pattern y. | +| | Available wildcard characters are '*' and '?' denoting | +| | zero or more and zero or one matches respectively. | +| | (eg: x like y or 'abcdefgh' like 'a?d*') | ++-----------+--------------------------------------------------------+ +| like | True only if the string x matches the pattern y in a | +| | case insensitive manner. Available wildcard characters | +| | are '*' and '?' denoting zero or more and zero or one | +| | matches respectively. | +| | (eg: x ilike y or 'abcdefgh' like 'a?d*') | ++-----------+--------------------------------------------------------+ + + + [SPECIAL FUNCTIONS] The purpose of special functions in ExprTk is to provide compiler generated equivalents of common mathematical expressions which can be invoked by using the 'special function' syntax (eg: $f12(x,y,z) or -$f24(x,y,z,w)). +$f24(x,y,z,w)). Where possible, for sub-expressions that are comprised +of combinations of variables and literal values the ExprTk compiler +will perform a best effort attempt to replace such expressions with +special functions. Special functions dramatically decrease the total evaluation time of expressions which would otherwise have been written using the common @@ -179,7 +369,32 @@ correctly optimize such expressions for a given architecture. -[SIMPLE EXAMPLE] +[EXPRTK NOTES] + (0) Supported types are float, double and long double. + + (1) Standard mathematical operator precedence is applied (BEDMAS). + + (2) All variables and functions are case-insensitive + + (3) Expression lengths are limited only by storage capacity. + + (4) Equal/Nequal routines use epsilons of 0.00000000001 and 0.000001 + for double and float types respectively. + + (5) All trigonometric functions assume radian input unless + stated otherwise. + + (6) Expressions can contain white-space characters such as + space, tabs, new-lines, control-feed et al. + ('\n', '\r', '\t', '\b', '\v', '\f') + + (7) User defined functions can have up to 20 parameters. + + (8) Polynomial functions can be at most of degree 10. + + + +[SIMPLE EXPRTK EXAMPLE] --- snip --- #include #include