blob: a53915400bd0e696773e0e3763752defeec1edd6 [file] [log] [blame]
//
// 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;
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;
}