1 /*
2    Copyright (C) 2009 - 2018 by Yurii Chernyi <terraninfo@terraninfo.net>
3    Part of the Battle for Wesnoth Project https://www.wesnoth.org/
4 
5    This program is free software; you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 2 of the License, or
8    (at your option) any later version.
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY.
11 
12    See the COPYING file for more details.
13 */
14 
15 /**
16  * @file
17  * A component of the AI framework
18  */
19 
20 #pragma once
21 
22 class config;
23 
24 #include <iostream>
25 #include <map>
26 #include <memory>
27 #include <string>
28 #include <vector>
29 
30 //============================================================================
31 namespace ai {
32 
33 //TODO: find a good place for this
34 struct path_element {
path_elementai::path_element35 	path_element()
36 		: property()
37 		, id()
38 		, position(0)
39 	{
40 	}
41 
42 	std::string property;
43 	std::string id;
44 	int position;
45 };
46 
47 class base_property_handler;
48 typedef std::shared_ptr<base_property_handler> property_handler_ptr;
49 typedef std::map<std::string,property_handler_ptr> property_handler_map;
50 
51 class component {
52 public:
component()53 	component()
54 		: property_handlers_()
55 	{
56 	}
57 
58 	virtual std::string get_id() const = 0;
59 	virtual std::string get_name() const = 0;
60 	virtual std::string get_engine() const = 0;
~component()61 	virtual ~component() {}
62 	virtual component* get_child(const path_element &child);
63 	virtual std::vector<component*> get_children(const std::string &type);
64 	virtual std::vector<std::string> get_children_types();
65 	virtual bool change_child(const path_element &child, const config &cfg);
66 	virtual bool add_child(const path_element &child, const config &cfg);
67 	virtual bool delete_child(const path_element &child);
68 
69 	property_handler_map& property_handlers();
70 
71 private:
72 	property_handler_map property_handlers_;
73 };
74 
75 class component_manager {
76 public:
77 	static bool add_component(component *root, const std::string &path, const config &cfg);
78 	static bool change_component(component *root, const std::string &path, const config &cfg);
79 	static bool delete_component(component *root, const std::string &path);
80 	static std::string print_component_tree(component *root, const std::string &path);
81 
82 	static component* get_component(component *root, const std::string &path);
83 };
84 
85 
86 } //end of namespace ai
87 
88 std::ostream &operator<<(std::ostream &o, const ai::path_element &e);
89