summaryrefslogtreecommitdiff
path: root/NT/src/factory.h
blob: 006db02bbd25ffeb7f10eb0fd8c13c7467694dd9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#ifndef ROTOR_FACTORY_H
#define ROTOR_FACTORY_H

#include "rotor.h"
#include "nodes.h"

namespace Rotor {
	class Node_factory{
		public:
			Node_factory(std::string _log_id=std::string("Rotor"));
			~Node_factory(){
				for (auto t:type_map) delete t.second;
			}
			void add_type(Node* proto){
				type_map[proto->get_type()]=proto;
			};
			void add_type(Node* proto,std::string category){
				add_type(proto);
				if (category_map.find(category)==category_map.end()) category_map[category]=vector<Node*>();
				category_map[category].push_back(proto);
			};
			Node *create(Json::Value &settings){
				settings["log_id"]=log_id;
				if (type_map.find(settings["type"].asString())!=type_map.end()) {
					return type_map[settings["type"].asString()]->clone(settings);
				}
				return NULL;
			};
			bool list_node(const std::string &t,Json::Value &json);
			void list_nodes(Json::Value &json);
			void list_categories(Json::Value &json);
		private:
			std::string log_id;
			std::map<std::string,Node*> type_map;
			std::map<std::string,std::vector<Rotor::Node*> > category_map;
	};
}

#endif //ROTOR_H