@@ -3273,15 +3273,15 @@ struct myfunc : public exprtk::ifunction<T>
32733273 }
32743274};
32753275
3276- #define define_free_functions (Type ) \
3277- Type foo1 (Type v0) { return v0; } \
3278- Type foo2 (Type v0, Type v1) { return v0 + v1; } \
3279- Type foo3 (Type v0, Type v1, Type v2) { return v0 + v1 + v2; } \
3280- Type foo4 (Type v0, Type v1, Type v2, Type v3) { return v0 + v1 + v2 + v3; } \
3281- Type foo5 (Type v0, Type v1, Type v2, Type v3, Type v4) { return v0 + v1 + v2 + v3 + v4; } \
3282- Type foo6 (Type v0, Type v1, Type v2, Type v3, Type v4, Type v5) { return v0 + v1 + v2 + v3 + v4 + v5; } \
3283-
3284- define_free_functions (numeric_type)
3276+ #define define_free_functions (N, Type ) \
3277+ Type N## 1 (Type v0) { return v0; } \
3278+ Type N## 2 (Type v0, Type v1) { return v0 + v1; } \
3279+ Type N## 3 (Type v0, Type v1, Type v2) { return v0 + v1 + v2; } \
3280+ Type N## 4 (Type v0, Type v1, Type v2, Type v3) { return v0 + v1 + v2 + v3; } \
3281+ Type N## 5 (Type v0, Type v1, Type v2, Type v3, Type v4) { return v0 + v1 + v2 + v3 + v4; } \
3282+ Type N## 6 (Type v0, Type v1, Type v2, Type v3, Type v4, Type v5) { return v0 + v1 + v2 + v3 + v4 + v5; } \
3283+
3284+ define_free_functions (foo, numeric_type)
32853285#undef define_free_functions
32863286
32873287template <typename T>
@@ -7665,54 +7665,164 @@ struct my_usr : public exprtk::parser<T>::unknown_symbol_resolver
76657665 }
76667666};
76677667
7668+ template <typename T>
7669+ struct my_usr_ext : public exprtk ::parser<T>::unknown_symbol_resolver
7670+ {
7671+ typedef exprtk::symbol_table<T> symbol_table_t ;
7672+ typedef typename exprtk::parser<T>::unknown_symbol_resolver usr_t ;
7673+
7674+ my_usr_ext ()
7675+ : usr_t (usr_t ::e_usrmode_extended)
7676+ {}
7677+
7678+ virtual bool process (const std::string& unknown_symbol,
7679+ symbol_table_t & symbol_table,
7680+ std::string& error_message)
7681+ {
7682+ bool result = false ;
7683+
7684+ if (unknown_symbol[0 ] == ' v' )
7685+ {
7686+ static T var_default_value = 1.0 ;
7687+
7688+ if (!(result = symbol_table.create_variable (unknown_symbol, var_default_value++)))
7689+ {
7690+ error_message = " Failed to create variable(" + unknown_symbol + " ) in primary symbol table" ;
7691+ }
7692+ }
7693+ else if (unknown_symbol[0 ] == ' c' )
7694+ {
7695+ static T cvar_default_value = 1.0 ;
7696+
7697+ if (!(result = symbol_table.add_constant (unknown_symbol, cvar_default_value++)))
7698+ {
7699+ error_message = " Failed to create const variable(" + unknown_symbol + " ) in primary symbol table" ;
7700+ }
7701+ }
7702+ else if (0 == unknown_symbol.find (" foo" ))
7703+ {
7704+ // functions of form: fooXX
7705+ if (4 >= unknown_symbol.size ())
7706+ {
7707+ switch (unknown_symbol[3 ])
7708+ {
7709+ case ' 1' : result = symbol_table.add_function (unknown_symbol,foo1);
7710+ break ;
7711+
7712+ case ' 2' : result = symbol_table.add_function (unknown_symbol,foo2);
7713+ break ;
7714+
7715+ case ' 3' : result = symbol_table.add_function (unknown_symbol,foo3);
7716+ break ;
7717+
7718+ case ' 4' : result = symbol_table.add_function (unknown_symbol,foo4);
7719+ break ;
7720+
7721+ case ' 5' : result = symbol_table.add_function (unknown_symbol,foo5);
7722+ break ;
7723+
7724+ case ' 6' : result = symbol_table.add_function (unknown_symbol,foo6);
7725+ break ;
7726+ }
7727+ }
7728+
7729+ if (!result)
7730+ {
7731+ error_message = " Failed to add function(" + unknown_symbol + " ) in primary symbol table" ;
7732+ }
7733+ }
7734+ else
7735+ error_message = " Indeterminable symbol type." ;
7736+
7737+ return result;
7738+ }
7739+ };
7740+
76687741template <typename T>
76697742inline bool run_test20 ()
76707743{
76717744 typedef exprtk::expression<T> expression_t ;
76727745
7673- for (std::size_t i = 0 ; i < 100 ; ++i)
76747746 {
7675- exprtk::symbol_table<T> symbol_table0;
7676- exprtk::symbol_table<T> symbol_table1;
7677- exprtk::symbol_table<T> symbol_table2;
7678- exprtk::symbol_table<T> symbol_table3;
7747+ for (std::size_t i = 0 ; i < 100 ; ++i)
7748+ {
7749+ exprtk::symbol_table<T> symbol_table0; // primary symbol_table
7750+ exprtk::symbol_table<T> symbol_table1;
7751+ exprtk::symbol_table<T> symbol_table2;
7752+ exprtk::symbol_table<T> symbol_table3;
76797753
7680- symbol_table0.add_constants ();
7754+ symbol_table0.add_constants ();
76817755
7682- expression_t expression;
7683- expression.register_symbol_table (symbol_table0);
7684- expression.register_symbol_table (symbol_table1);
7685- expression.register_symbol_table (symbol_table2);
7686- expression.register_symbol_table (symbol_table3);
7756+ expression_t expression;
7757+ expression.register_symbol_table (symbol_table0);
7758+ expression.register_symbol_table (symbol_table1);
7759+ expression.register_symbol_table (symbol_table2);
7760+ expression.register_symbol_table (symbol_table3);
76877761
7688- exprtk::parser<T> parser;
7762+ exprtk::parser<T> parser;
76897763
7690- my_usr<T> musr;
7691- musr.next_value (true );
7692- parser.enable_unknown_symbol_resolver (&musr);
7764+ my_usr<T> musr;
7765+ musr.next_value (true );
7766+ parser.enable_unknown_symbol_resolver (&musr);
76937767
7694- std::string expr_str = " v01+c02+v03+c04+v05+c06+v07+c08+v09+c10+"
7695- " v11+c12+v13+c14+v15+c16+v17+c18+v19+c20+"
7696- " v21+c22+v23+c24+v25+c26+v27+c28+v29+c30 " ;
7768+ std::string expr_str = " v01+c02+v03+c04+v05+c06+v07+c08+v09+c10+"
7769+ " v11+c12+v13+c14+v15+c16+v17+c18+v19+c20+"
7770+ " v21+c22+v23+c24+v25+c26+v27+c28+v29+c30 " ;
76977771
7698- if (!parser.compile (expr_str,expression))
7699- {
7700- printf (" run_test20() - Error: %s Expression: %s\n " ,
7701- parser.error ().c_str (),
7702- expr_str.c_str ());
7772+ if (!parser.compile (expr_str,expression))
7773+ {
7774+ printf (" run_test20() - [1] Error: %s Expression: %s\n " ,
7775+ parser.error ().c_str (),
7776+ expr_str.c_str ());
77037777
7704- return false ;
7705- }
7778+ return false ;
7779+ }
7780+
7781+ T sum_1_30 = T ((1 + 30 ) * 15 );
7782+ T result = expression.value ();
7783+
7784+ if (sum_1_30 != result)
7785+ {
7786+ printf (" run_test20() - [1] Error in evaluation! (1) Expression: %s\n " ,
7787+ expr_str.c_str ());
77067788
7707- T sum_1_30 = T ((1 + 30 ) * 15 );
7708- T result = expression.value ();
7789+ return false ;
7790+ }
7791+ }
7792+ }
77097793
7710- if (sum_1_30 != result)
7794+ {
7795+ for (std::size_t i = 0 ; i < 100 ; ++i)
77117796 {
7712- printf (" run_test20() - Error in evaluation! (1) Expression: %s\n " ,
7713- expr_str.c_str ());
7797+ exprtk::symbol_table<T> symbol_table0; // primary symbol_table
7798+ exprtk::symbol_table<T> symbol_table1;
7799+ exprtk::symbol_table<T> symbol_table2;
7800+ exprtk::symbol_table<T> symbol_table3;
77147801
7715- return false ;
7802+ symbol_table0.add_constants ();
7803+
7804+ expression_t expression;
7805+ expression.register_symbol_table (symbol_table0);
7806+ expression.register_symbol_table (symbol_table1);
7807+ expression.register_symbol_table (symbol_table2);
7808+ expression.register_symbol_table (symbol_table3);
7809+
7810+ exprtk::parser<T> parser;
7811+
7812+ my_usr_ext<T> musr;
7813+ parser.enable_unknown_symbol_resolver (&musr);
7814+
7815+ std::string expr_str = " foo6(foo1(v0),foo2(c1,foo4(v2,c3,v4,c5)),foo3"
7816+ " (v6,c7,foo5(v8,c9,v10,c11,v12)),c13,v14,c15) " ;
7817+
7818+ if (!parser.compile (expr_str,expression))
7819+ {
7820+ printf (" run_test20() - [2] Error: %s Expression: %s\n " ,
7821+ parser.error ().c_str (),
7822+ expr_str.c_str ());
7823+
7824+ return false ;
7825+ }
77167826 }
77177827 }
77187828
0 commit comments