#ifndef MODULE_H_ #define MODULE_H_ #include #include #include #include "value.h" class ModuleInstantiation { public: std::string label; std::string modname; std::vector argnames; std::vector argexpr; std::vector argvalues; std::vector children; bool tag_root; bool tag_highlight; bool tag_background; const class Context *ctx; ModuleInstantiation() : tag_root(false), tag_highlight(false), tag_background(false), ctx(NULL) { } virtual ~ModuleInstantiation(); std::string dump(const std::string &indent) const; class AbstractNode *evaluate(const Context *ctx) const; std::vector evaluateChildren(const Context *ctx = NULL) const; }; class IfElseModuleInstantiation : public ModuleInstantiation { public: virtual ~IfElseModuleInstantiation(); std::vector evaluateElseChildren(const Context *ctx = NULL) const; std::vector else_children; }; class AbstractModule { public: virtual ~AbstractModule(); virtual class AbstractNode *evaluate(const Context *ctx, const ModuleInstantiation *inst) const; virtual std::string dump(const std::string &indent, const std::string &name) const; }; class Module : public AbstractModule { public: typedef boost::unordered_map ModuleContainer; ModuleContainer usedlibs; struct libs_cache_ent { Module *mod; std::string cache_id, msg; }; static boost::unordered_map libs_cache; static Module *compile_library(std::string filename); std::vector argnames; std::vector argexpr; std::vector assignments_var; std::vector assignments_expr; typedef boost::unordered_map FunctionContainer; FunctionContainer functions; typedef boost::unordered_map AbstractModuleContainer; AbstractModuleContainer modules; std::vector children; Module() { } virtual ~Module(); virtual AbstractNode *evaluate(const Context *ctx, const ModuleInstantiation *inst) const; virtual std::string dump(const std::string &indent, const std::string &name) const; }; #endif