+unsigned function::register_new(function_options const & opt)
+{
+ unsigned same_name=0;
+ for (unsigned i=0; i<registered_functions().size(); ++i) {
+ if (registered_functions()[i].name==opt.name) {
+ same_name++;
+ }
+ }
+ if (same_name>=opt.functions_with_same_name) {
+ // we do not throw an exception here because this code is
+ // usually executed before main(), so the exception could not
+ // caught anyhow
+ std::cerr << "WARNING: function name " << opt.name
+ << " already in use!" << std::endl;
+ }
+ registered_functions().push_back(opt);
+ if (opt.use_remember) {
+ remember_table::remember_tables().
+ push_back(remember_table(opt.remember_size,
+ opt.remember_assoc_size,
+ opt.remember_strategy));
+ } else {
+ remember_table::remember_tables().push_back(remember_table());
+ }
+ return registered_functions().size()-1;
+}
+
+/** Find serial number of function by name and number of parameters.
+ * Throws exception if function was not found. */
+unsigned function::find_function(const std::string &name, unsigned nparams)
+{
+ std::vector<function_options>::const_iterator i = function::registered_functions().begin(), end = function::registered_functions().end();
+ unsigned serial = 0;
+ while (i != end) {
+ if (i->get_name() == name && i->get_nparams() == nparams)
+ return serial;
+ i++;
+ serial++;
+ }
+ throw (std::runtime_error("no function '" + name + "' with " + ToString(nparams) + " parameters defined"));
+}
+
+/** Return the print name of the function. */
+std::string function::get_name(void) const
+{
+ GINAC_ASSERT(serial<registered_functions().size());
+ return registered_functions()[serial].name;
+}