How to reduce the long, if ..., such an operator?
if( strcmp( alnumToc, "log") == 0){
ARGNUMCHECK( in, 1);
mpfr_log( num, stack[j-1], MPFR_RNDN);
CPYRES( 1);
} else if( strcmp( alnumToc, "log2") == 0){
ARGNUMCHECK( in, 1);
mpfr_log2( num, stack[j-1], MPFR_RNDN);
CPYRES( 1);
} else if( strcmp( alnumToc, "log10") == 0){
ARGNUMCHECK( in, 1);
mpfr_log10( num, stack[j-1], MPFR_RNDN);
CPYRES( 1);
} else if( strcmp( alnumToc, "sqrt") == 0){
ARGNUMCHECK( in, 1);
mpfr_sqrt( num, stack[j-1], MPFR_RNDN);
CPYRES( 1);
} else if( strcmp( alnumToc, "cbrt") == 0){
ARGNUMCHECK( in, 1);
mpfr_cbrt( num, stack[j-1], MPFR_RNDN);
CPYRES( 1);
} else if( strcmp( alnumToc, "abs") == 0){
ARGNUMCHECK( in, 1);
mpfr_abs( num, stack[j-1], MPFR_RNDN);
CPYRES( 1);
} else if( strcmp( alnumToc, "sin") == 0){
ARGNUMCHECK( in, 1);
mpfr_sin( num, stack[j-1], MPFR_RNDN);
CPYRES( 1);
} else if( strcmp( alnumToc, "cos") == 0){
ARGNUMCHECK( in, 1);
mpfr_cos( num, stack[j-1], MPFR_RNDN);
CPYRES( 1);
} else if( strcmp( alnumToc, "csc") == 0){
ARGNUMCHECK( in, 1);
mpfr_csc( num, stack[j-1], MPFR_RNDN);
CPYRES( 1);
} else if( strcmp( alnumToc, "cot") == 0){
ARGNUMCHECK( in, 1);
mpfr_cot( num, stack[j-1], MPFR_RNDN);
CPYRES( 1);
} else if( strcmp( alnumToc, "acos") == 0){
ARGNUMCHECK( in, 1);
mpfr_acos( num, stack[j-1], MPFR_RNDN);
CPYRES( 1);
} else if( strcmp( alnumToc, "asin") == 0){
ARGNUMCHECK( in, 1);
mpfr_asin( num, stack[j-1], MPFR_RNDN);
CPYRES( 1);
} else if( strcmp( alnumToc, "atan") == 0){
ARGNUMCHECK( in, 1);
mpfr_atan( num, stack[j-1], MPFR_RNDN);
CPYRES( 1);
} else if( strcmp( alnumToc, "cosh") == 0){
ARGNUMCHECK( in, 1);
mpfr_cosh( num, stack[j-1], MPFR_RNDN);
CPYRES( 1);
} else if( strcmp( alnumToc, "sinh") == 0){
ARGNUMCHECK( in, 1);
mpfr_sinh( num, stack[j-1], MPFR_RNDN);
CPYRES( 1);
}
It is not just ugly, but also slow. I was thinking about using a hash table with function pointers. This is a good decision?
Note: there will be some mpfr functions that will contain more arguments, so I cannot create only one macro.