+// Alternatively, an exvector may be passed into the static function, instead
+// of individual ex objects. Then, the number of arguments is not limited.
+typedef ex (* eval_funcp_exvector)(const exvector &);
+typedef ex (* evalf_funcp_exvector)(const exvector &);
+typedef ex (* conjugate_funcp_exvector)(const exvector &);
+typedef ex (* real_part_funcp_exvector)(const exvector &);
+typedef ex (* imag_part_funcp_exvector)(const exvector &);
+typedef ex (* derivative_funcp_exvector)(const exvector &, unsigned);
+typedef ex (* power_funcp_exvector)(const exvector &, const ex &);
+typedef ex (* series_funcp_exvector)(const exvector &, const relational &, int, unsigned);
+typedef void (* print_funcp_exvector)(const exvector &, const print_context &);
+
+
+class function_options
+{
+ friend class function;
+ friend class fderivative;
+public:
+ function_options();
+ function_options(std::string const & n, std::string const & tn=std::string());
+ function_options(std::string const & n, unsigned np);
+ ~function_options();
+ void initialize();
+
+ function_options & dummy() { return *this; }
+ function_options & set_name(std::string const & n, std::string const & tn=std::string());
+ function_options & latex_name(std::string const & tn);
+// the following lines have been generated for max. ${maxargs} parameters
+$eval_func_interface
+$evalf_func_interface
+$conjugate_func_interface
+$real_part_func_interface
+$imag_part_func_interface
+$derivative_func_interface
+$power_func_interface
+$series_func_interface
+$print_func_interface
+// end of generated lines
+ function_options & eval_func(eval_funcp_exvector e);
+ function_options & evalf_func(evalf_funcp_exvector ef);
+ function_options & conjugate_func(conjugate_funcp_exvector d);
+ function_options & real_part_func(real_part_funcp_exvector d);
+ function_options & imag_part_func(imag_part_funcp_exvector d);
+ function_options & derivative_func(derivative_funcp_exvector d);
+ function_options & power_func(power_funcp_exvector d);
+ function_options & series_func(series_funcp_exvector s);
+
+ template <class Ctx> function_options & print_func(print_funcp_exvector p)
+ {
+ print_use_exvector_args = true;
+ set_print_func(Ctx::get_class_info_static().options.get_id(), print_funcp(p));
+ return *this;
+ }
+
+ function_options & set_return_type(unsigned rt, const return_type_t* rtt = 0);
+ function_options & do_not_evalf_params();
+ function_options & remember(unsigned size, unsigned assoc_size=0,
+ unsigned strategy=remember_strategies::delete_never);
+ function_options & overloaded(unsigned o);
+ function_options & set_symmetry(const symmetry & s);
+
+ std::string get_name() const { return name; }
+ unsigned get_nparams() const { return nparams; }
+
+protected:
+ bool has_derivative() const { return derivative_f != NULL; }
+ bool has_power() const { return power_f != NULL; }
+ void test_and_set_nparams(unsigned n);
+ void set_print_func(unsigned id, print_funcp f);
+
+ std::string name;
+ std::string TeX_name;
+
+ unsigned nparams;
+
+ eval_funcp eval_f;
+ evalf_funcp evalf_f;
+ conjugate_funcp conjugate_f;
+ real_part_funcp real_part_f;
+ imag_part_funcp imag_part_f;
+ derivative_funcp derivative_f;
+ power_funcp power_f;
+ series_funcp series_f;
+ std::vector<print_funcp> print_dispatch_table;
+
+ bool evalf_params_first;
+
+ bool use_return_type;
+ unsigned return_type;
+ return_type_t return_type_tinfo;
+
+ bool use_remember;
+ unsigned remember_size;
+ unsigned remember_assoc_size;
+ unsigned remember_strategy;
+
+ bool eval_use_exvector_args;
+ bool evalf_use_exvector_args;
+ bool conjugate_use_exvector_args;
+ bool real_part_use_exvector_args;
+ bool imag_part_use_exvector_args;
+ bool derivative_use_exvector_args;
+ bool power_use_exvector_args;
+ bool series_use_exvector_args;
+ bool print_use_exvector_args;
+
+ unsigned functions_with_same_name;
+
+ ex symtree;