| // |
| // C++ Implementation: BuiltinFuncs |
| // |
| // Description: |
| // |
| // |
| // Author: Carmelo Piccione <carmelo.piccione@gmail.com>, (C) 2007 |
| // |
| // Copyright: See COPYING file that comes with this distribution |
| // |
| // |
| |
| /* Loads all builtin functions */ |
| |
| |
| /* Loads a builtin function */ |
| #include "BuiltinFuncs.hpp" |
| #include <string> |
| #include <iostream> |
| #include "fatal.h" |
| |
| |
| std::map<std::string, Func*> BuiltinFuncs::builtin_func_tree; |
| |
| |
| int |
| BuiltinFuncs::load_builtin_func ( |
| const std::string & name, |
| float (*func_ptr)(float*), |
| int num_args |
| ) |
| { |
| Func * func; |
| int retval; |
| |
| /* Create new function */ |
| func = new Func (name, func_ptr, num_args); |
| |
| if (func == 0) |
| return PROJECTM_OUTOFMEM_ERROR; |
| |
| retval = insert_func (func); |
| |
| return retval; |
| } |
| |
| Func * |
| BuiltinFuncs::find_func (const std::string & name) |
| { |
| std::map<std::string, Func*>::iterator pos = builtin_func_tree.find (name); |
| |
| // Case: function not found, return null |
| if (pos == builtin_func_tree.end()) |
| return 0; |
| |
| // Case: function found, return a pointer to it |
| return pos->second; |
| } |
| |
| int |
| BuiltinFuncs::load_all_builtin_func() |
| { |
| if (load_builtin_func ("int", FuncWrappers::int_wrapper, 1) < 0) |
| return PROJECTM_ERROR; |
| if (load_builtin_func ("abs", FuncWrappers::abs_wrapper, 1) < 0) |
| return PROJECTM_ERROR; |
| if (load_builtin_func ("sin", FuncWrappers::sin_wrapper, 1) < 0) |
| return PROJECTM_ERROR; |
| if (load_builtin_func ("cos", FuncWrappers::cos_wrapper, 1) < 0) |
| return PROJECTM_ERROR; |
| if (load_builtin_func ("tan", FuncWrappers::tan_wrapper, 1) < 0) |
| return PROJECTM_ERROR; |
| if (load_builtin_func ("asin", FuncWrappers::asin_wrapper, 1) < 0) |
| return PROJECTM_ERROR; |
| if (load_builtin_func ("acos", FuncWrappers::acos_wrapper, 1) < 0) |
| return PROJECTM_ERROR; |
| if (load_builtin_func ("atan", FuncWrappers::atan_wrapper, 1) < 0) |
| return PROJECTM_ERROR; |
| if (load_builtin_func ("sqr", FuncWrappers::sqr_wrapper, 1) < 0) |
| return PROJECTM_ERROR; |
| if (load_builtin_func ("sqrt", FuncWrappers::sqrt_wrapper, 1) < 0) |
| return PROJECTM_ERROR; |
| if (load_builtin_func ("pow", FuncWrappers::pow_wrapper, 2) < 0) |
| return PROJECTM_ERROR; |
| if (load_builtin_func ("exp", FuncWrappers::exp_wrapper, 1) < 0) |
| return PROJECTM_ERROR; |
| if (load_builtin_func ("log", FuncWrappers::log_wrapper, 1) < 0) |
| return PROJECTM_ERROR; |
| if (load_builtin_func ("log10", FuncWrappers::log10_wrapper, 1) < 0) |
| return PROJECTM_ERROR; |
| if (load_builtin_func ("sign", FuncWrappers::sign_wrapper, 1) < 0) |
| return PROJECTM_ERROR; |
| if (load_builtin_func ("min", FuncWrappers::min_wrapper, 2) < 0) |
| return PROJECTM_ERROR; |
| if (load_builtin_func ("max", FuncWrappers::max_wrapper, 2) < 0) |
| return PROJECTM_ERROR; |
| if (load_builtin_func ("sigmoid", FuncWrappers::sigmoid_wrapper, 2) < 0) |
| return PROJECTM_ERROR; |
| if (load_builtin_func ("atan2", FuncWrappers::atan2_wrapper, 2) < 0) |
| return PROJECTM_ERROR; |
| if (load_builtin_func ("rand", FuncWrappers::rand_wrapper, 1) < 0) |
| return PROJECTM_ERROR; |
| if (load_builtin_func ("band", FuncWrappers::band_wrapper, 2) < 0) |
| return PROJECTM_ERROR; |
| if (load_builtin_func ("bor", FuncWrappers::bor_wrapper, 2) < 0) |
| return PROJECTM_ERROR; |
| if (load_builtin_func ("bnot", FuncWrappers::bnot_wrapper, 1) < 0) |
| return PROJECTM_ERROR; |
| if (load_builtin_func ("if", FuncWrappers::if_wrapper, 3) < 0) |
| return PROJECTM_ERROR; |
| if (load_builtin_func ("equal", FuncWrappers::equal_wrapper, 2) < 0) |
| return PROJECTM_ERROR; |
| if (load_builtin_func ("above", FuncWrappers::above_wrapper, 2) < 0) |
| return PROJECTM_ERROR; |
| if (load_builtin_func ("below", FuncWrappers::below_wrapper, 2) < 0) |
| return PROJECTM_ERROR; |
| if (load_builtin_func ("nchoosek", FuncWrappers::nchoosek_wrapper, 2) < 0) |
| return PROJECTM_ERROR; |
| if (load_builtin_func ("fact", FuncWrappers::fact_wrapper, 1) < 0) |
| return PROJECTM_ERROR; |
| if (load_builtin_func("print", FuncWrappers::print_wrapper, 1) < 0) |
| return PROJECTM_ERROR; |
| return PROJECTM_SUCCESS; |
| } |
| |
| volatile bool BuiltinFuncs::initialized = false; |
| |
| /* Initialize the builtin function database. |
| Should only be necessary once */ |
| int |
| BuiltinFuncs::init_builtin_func_db() |
| { |
| int retval; |
| |
| if (initialized) { |
| return 0; |
| } else |
| initialized = true; |
| |
| retval = load_all_builtin_func(); |
| return retval; |
| } |
| |
| |
| |
| /* Destroy the builtin function database. |
| Generally, do this on projectm exit */ |
| int |
| BuiltinFuncs::destroy_builtin_func_db() |
| { |
| traverse<TraverseFunctors::Delete<Func> >(builtin_func_tree); |
| |
| builtin_func_tree.clear(); |
| initialized = false; |
| return PROJECTM_SUCCESS; |
| } |
| |
| /* Insert a function into the database */ |
| int |
| BuiltinFuncs::insert_func (Func *func) |
| { |
| assert (func); |
| |
| if (func == 0) { |
| std::cerr << "Received a null function object, ignoring...." << std::endl; |
| return PROJECTM_ERROR; |
| } |
| |
| // //std::cout << "inserting function " << func->getName() << std::endl; |
| |
| const std::pair<std::string, Func*> pair = std::make_pair (std::string (func->getName()), func); |
| |
| assert (pair.second); |
| |
| const std::pair<std::map<std::string, Func*>::iterator, bool> inserteePair = |
| builtin_func_tree.insert (pair); |
| |
| if (!inserteePair.second) { |
| std::cerr << "Failed to insert builtin function \"" << func->getName() << "\" into collection! Bailing..." << std::endl; |
| abort(); |
| } |
| |
| return PROJECTM_SUCCESS; |
| } |