#include "functions.hh" #include #include using namespace std; // FIXME: this stuff should be read from some configuration file. namespace functions { class MinWrapper : public FunctionWrapper { public: virtual string neutral_element() { return "INT_MAX"; } virtual string combine(string acc, string newval) { return "std::min("+acc+", "+newval+")"; } }; class MaxWrapper : public FunctionWrapper { public: virtual string neutral_element() { return "INT_MIN"; } virtual string combine(string acc, string newval) { return "std::max("+acc+", "+newval+")"; } }; class SumWrapper : public FunctionWrapper { public: virtual string neutral_element() { return "0"; } virtual string combine(string acc, string newval) { return acc+"+"+newval; } }; class ProdWrapper : public FunctionWrapper { public: virtual string neutral_element() { return "1"; } virtual string combine(string acc, string newval) { return acc+"*"+newval; } }; struct FunEntry { string name; FunctionWrapper *wrapper; }; static FunEntry fun_table[] = { { "min", new MinWrapper() }, { "max", new MaxWrapper() }, { "sum", new SumWrapper() }, { "prod", new ProdWrapper() }, { "__none__", 0}, }; }; using namespace functions; typedef map wrapper_table_t; static wrapper_table_t* build_wrapper_table() { wrapper_table_t *table = new wrapper_table_t; for (int i = 0; fun_table[i].wrapper != 0; ++i) { (*table)[fun_table[i].name] = fun_table[i].wrapper; } return table; } static wrapper_table_t *table = build_wrapper_table(); bool functions::defined(const char *name) { assert(name != 0); string sname(name); FunctionWrapper *w = (*table)[sname]; return w != 0; } functions::FunctionWrapper * functions::get_function(const char *name) { assert(name != 0); assert(defined(name)); string sname(name); return (*table)[sname]; }