From 820b73f2abdf51bd59cb5b74739fb6f264b7c54e Mon Sep 17 00:00:00 2001 From: Tim Redfern Date: Tue, 31 Dec 2013 12:41:42 +0000 Subject: factory not working with templates --- NT/src/nodes.h | 35 ++++++++++------- NT/src/rotor.cpp | 112 +++++++++++++++++++++++++------------------------------ NT/src/rotor.h | 48 +++++------------------- 3 files changed, 83 insertions(+), 112 deletions(-) diff --git a/NT/src/nodes.h b/NT/src/nodes.h index 5bb8830..8ce7cdd 100644 --- a/NT/src/nodes.h +++ b/NT/src/nodes.h @@ -1,45 +1,51 @@ +#ifndef ROTOR_NODES_H +#define ROTOR_NODES_H + #include "rotor.h" -namespace Rotor { - class time: public Node_type { + +using namespace std; + +namespace Rotor{ + class Time: public Node_type { public: - time(){}; - time(map &settings):time() { + Time(){}; + Time(map &settings):Time() { init(settings); }; const double &get_output(const Frame_parameters &frame){ value=frame.time; return value; } - time* clone(map &_settings) { return new time(_settings);}; + Time* clone(map &_settings) { return new Time(_settings);}; private: double value; }; - class multiply: public Node_type { + class Multiply: public Node_type { public: - multiply(){ + Multiply(){ inlet=create_inlet("inlet"); value=create_inlet("value"); } - multiply(map &settings):multiply() { + Multiply(map &settings):Multiply() { init(settings); }; const double &get_output(const Frame_parameters &frame){ result=inlet->get(frame)*value->get(frame); return result; } - multiply* clone(map &_settings) { return new multiply(_settings);}; + Multiply* clone(map &_settings) { return new Multiply(_settings);}; private: Variable_type *inlet; Variable_type *value; double result; }; - class print: public Node_type { + class Print: public Node_type { public: - print(){ + Print(){ inlet=create_inlet("inlet"); } - print(map &settings):print() { + Print(map &settings):Print() { init(settings); }; const std::string &get_output(const Frame_parameters &frame){ @@ -48,9 +54,12 @@ namespace Rotor { result=out.str(); return result; } - print* clone(map &_settings) { return new print(_settings);}; + Print* clone(map &_settings) { return new Print(_settings);}; private: Variable_type *inlet; std::string result; }; } + + +#endif //ROTOR_NODES_H diff --git a/NT/src/rotor.cpp b/NT/src/rotor.cpp index c10520a..597ded6 100644 --- a/NT/src/rotor.cpp +++ b/NT/src/rotor.cpp @@ -2,81 +2,71 @@ #include "rotor.h" #include "nodes.h" +#include "factory.h" using namespace std; -using namespace Rotor; - -template -void Rotor::Variable_type::init(std::string s){ - std::istringstream cur(s); - cur >> value; -} -template -bool Rotor::Variable_type::connect(Node* target){ - if (connectable){ - if (dynamic_cast*>(target)){ - connection=target; - return true; - } +namespace Rotor{ + template + void Rotor::Variable_type::init(std::string s){ + std::istringstream cur(s); + cur >> value; } - return false; -} -template -const T& Rotor::Variable_type::get(const Frame_parameters &frame){ - if (connection){ - return (dynamic_cast*>(connection))->get_output(frame); + template + bool Rotor::Variable_type::connect(Node* target){ + if (connectable){ + if (dynamic_cast*>(target)){ + connection=target; + return true; + } + } + return false; } - return value; -} - -template -void Node_type::init(map settings){ - for (auto s:settings) { - if (vars.find(s.first)!=vars.end()){ - vars[s.first]->init(s.second); - //printf("set %s to %s\n",s.first.c_str(),s.second.c_str()); + template + const T& Rotor::Variable_type::get(const Frame_parameters &frame){ + if (connection){ + return (dynamic_cast*>(connection))->get_output(frame); } - }; -} - -template -bool Node_type::connect(string v,Node *t){ - auto var=vars.find(v); - if (var!=vars.end()){ - if ((*var).second->connect(t)){ - return true; + return value; + } + bool Node::connect(string v,Node *t){ + auto var=vars.find(v); + if (var!=vars.end()){ + if ((*var).second->connect(t)){ + return true; + } } + return false; + } + template + void Node_type::init(map settings){ + for (auto s:settings) { + if (vars.find(s.first)!=vars.end()){ + vars[s.first]->init(s.second); + //printf("set %s to %s\n",s.first.c_str(),s.second.c_str()); + } + }; } - return false; -} - -template -template -Variable_type* Node_type::create_inlet(std::string name){ - vars[name]=new Variable_type(true); - return (dynamic_cast*>(vars[name])); } -template -template -Variable_type* Node_type::create_attribute(std::string name){ - vars[name]=new Variable_type(false); - return (dynamic_cast*>(vars[name])); -} +using namespace Rotor; int main(){ - Rotor::time t; - multiply m; - map settings={{"value","2"}}; - m.init(settings); - if (!m.connect("inlet",&t)) printf("not connected...\n"); - Rotor::print p; - if (!p.connect("inlet",&m)) printf("not connected...\n"); + Node_factory f; + map settings={{"type","time"}}; + Node *t=f.create(settings); + settings={{"value","2"},{"type","multiply"}}; + Node *m=f.create(settings); + if (!m->connect("inlet",t)) printf("not connected...\n"); + settings={{"type","print"}}; + Node *p=f.create(settings); + if (!p->connect("inlet",m)) printf("not connected...\n"); for (double t=0;t<10.0;t+=0.765){ Frame_parameters f=Frame_parameters(t,25.0,10.0,640,360); - printf("%04f %s\n",t,p.get_output(f).c_str()); - + printf("%04f %s\n",t,(dynamic_cast*>(p))->get_output(f).c_str()); } + delete t; + delete m; + delete p; } diff --git a/NT/src/rotor.h b/NT/src/rotor.h index 26f7fb0..49e978f 100644 --- a/NT/src/rotor.h +++ b/NT/src/rotor.h @@ -9,7 +9,7 @@ #include #include -#include "xmlIO.h" + namespace Rotor { @@ -68,7 +68,8 @@ namespace Rotor { delete v.second; } } - virtual Node* clone(map &_settings)=0; + bool connect(std::string v,Node *t); + virtual Node* clone(std::map &_settings)=0; std::string type; protected: std::unordered_map vars; @@ -77,43 +78,14 @@ namespace Rotor { public: virtual const NT& get_output(const Frame_parameters &frame)=0; void init(std::map settings); - bool connect(std::string v,Node *t); - template Variable_type* create_inlet(std::string name); - template Variable_type* create_attribute(std::string name); - }; - class Node_factory{ - public: - Node_factory(); - ~Node_factory(){ - for (auto t:type_map) delete t.second; + template Variable_type* create_inlet(std::string name){ + vars[name]=new Variable_type(true); + return (dynamic_cast*>(vars[name])); + } + template Variable_type* create_attribute(std::string name){ + vars[name]=new Variable_type(false); + return (dynamic_cast*>(vars[name])); } - void add_type(std::string type,Node* proto){ - type_map[type]=proto; - type_map[type]->type=type; - }; - void add_type(std::string type,Node* proto,std::vector &category){ - add_type(type,proto); - category.push_back(proto); - }; - Node *create(std::map &settings){ - if (settings.find("type")!=settings.end()) { - if (type_map.find(settings["type"])!=type_map.end()) { - return type_map[settings["type"]]->clone(settings); - } - } - return NULL; - }; - bool list_node(const std::string &t,xmlIO XML); - bool list_node(const std::string &t,Json::Value &JSON); - void list_node(Rotor::Node* type,xmlIO XML,int i=0); - Json::Value list_node(Rotor::Node* type); - void list_nodes(xmlIO XML); - void list_nodes(Json::Value &JSON); - void list_categories(xmlIO XML); - void list_categories(Json::Value &JSON); - private: - std::map type_map; - std::map > category; }; } -- cgit v1.2.3