| // |
| // 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; |
| } |
| |
| |