The Battle for Wesnoth  1.19.15+dev
engine.hpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2009 - 2025
3  by Yurii Chernyi <terraninfo@terraninfo.net>
4  Part of the Battle for Wesnoth Project https://www.wesnoth.org/
5 
6  This program is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2 of the License, or
9  (at your option) any later version.
10  This program is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY.
12 
13  See the COPYING file for more details.
14 */
15 
16 /**
17  * AI Support engine - creating specific ai components from config
18  * @file
19  */
20 
21 #pragma once
22 
24 #include "ai/contexts.hpp"
25 
26 #include <iterator>
27 
28 //============================================================================
29 
30 namespace ai {
31 
32 class rca_context;
33 
34 class engine : public component {
35 public:
36  engine( readonly_context &context, const config &cfg );
37 
38  virtual ~engine();
39 
40  virtual bool is_ok() const;
41 
42  static void parse_aspect_from_config( readonly_context &context, const config &cfg, const std::string &id, std::back_insert_iterator<std::vector< aspect_ptr >> b );
43 
44  static void parse_goal_from_config( readonly_context &context, const config &cfg, std::back_insert_iterator<std::vector< goal_ptr >> b );
45 
46  static void parse_candidate_action_from_config( rca_context &context, const config &cfg, std::back_insert_iterator<std::vector< candidate_action_ptr >> b );
47 
48  static void parse_engine_from_config( readonly_context &context, const config &cfg, std::back_insert_iterator<std::vector< engine_ptr >> b );
49 
50  static void parse_stage_from_config( ai_context &context, const config &cfg, std::back_insert_iterator<std::vector< stage_ptr >> b );
51 
52  //do not override that method in subclasses which cannot create aspects
53  virtual void do_parse_aspect_from_config( const config &cfg, const std::string &id, std::back_insert_iterator< std::vector< aspect_ptr>> b );
54 
55  //do not override that method in subclasses which cannot create candidate_actions
56  virtual void do_parse_candidate_action_from_config( rca_context &context, const config &cfg, std::back_insert_iterator<std::vector< candidate_action_ptr >> b );
57 
58  //do not override that method in subclasses which cannot create goals
59  virtual void do_parse_goal_from_config( const config &cfg, std::back_insert_iterator<std::vector< goal_ptr >> b );
60 
61  //do not override that method in subclasses which cannot create engines
62  virtual void do_parse_engine_from_config( const config &cfg, std::back_insert_iterator<std::vector< engine_ptr >> b );
63 
64  //do not override that method in subclasses which cannot create stages
65  virtual void do_parse_stage_from_config( ai_context &context, const config &cfg, std::back_insert_iterator<std::vector< stage_ptr >> b );
66 
68 
69  /**
70  * set ai context (which is not available during early initialization)
71  */
72  virtual void set_ai_context(ai_context_ptr context);
73 
75  /**
76  * serialize
77  */
78  virtual config to_config() const;
79 
80  virtual std::string get_id() const
81  { return id_; }
82 
83  virtual std::string get_engine() const
84  { return engine_; }
85 
86  virtual std::string get_name() const
87  { return name_; }
88 
89 protected:
92 
93  /** name of the engine which has created this engine*/
94  std::string engine_;
95  std::string id_;
96  std::string name_;
97 };
98 
99 
101  bool is_duplicate(const std::string &name);
102 public:
103  typedef std::shared_ptr< engine_factory > factory_ptr;
104  typedef std::map<std::string, factory_ptr> factory_map;
105  typedef std::pair<const std::string, factory_ptr> factory_map_pair;
106 
107  static factory_map& get_list() {
108  static factory_map *engine_factories;
109  if (engine_factories==nullptr) {
110  engine_factories = new factory_map;
111  }
112  return *engine_factories;
113  }
114 
116  virtual engine_ptr get_new_instance( readonly_context &ai, const std::string& name ) = 0;
117 
118  engine_factory( const std::string &name )
119  {
120  if (is_duplicate(name)) {
121  return;
122  }
123  factory_ptr ptr_to_this(this);
124  get_list().emplace(name,ptr_to_this);
125  }
126 
127  virtual ~engine_factory() {}
128 };
129 
130 template<class ENGINE>
132 public:
133  register_engine_factory( const std::string &name )
134  : engine_factory( name )
135  {
136  }
137 
139  engine_ptr e = std::make_shared<ENGINE>(ai, cfg);
140  if (!e->is_ok()) {
141  return engine_ptr();
142  }
143  return e;
144  }
145 
146  virtual engine_ptr get_new_instance( readonly_context &ai, const std::string& name ){
147  config cfg;
148  cfg["name"] = name;
149  cfg["engine"] = "cpp"; // @Crab: what is the purpose of this line(neph)
150  return std::make_shared<ENGINE>(ai, cfg);
151  }
152 };
153 
154 } //end of namespace ai
virtual engine_ptr get_new_instance(readonly_context &ai, const std::string &name)=0
virtual engine_ptr get_new_instance(readonly_context &ai, const config &cfg)=0
engine_factory(const std::string &name)
Definition: engine.hpp:118
static factory_map & get_list()
Definition: engine.hpp:107
virtual ~engine_factory()
Definition: engine.hpp:127
std::map< std::string, factory_ptr > factory_map
Definition: engine.hpp:104
std::pair< const std::string, factory_ptr > factory_map_pair
Definition: engine.hpp:105
std::shared_ptr< engine_factory > factory_ptr
Definition: engine.hpp:103
bool is_duplicate(const std::string &name)
Definition: engine.cpp:143
std::string engine_
name of the engine which has created this engine
Definition: engine.hpp:94
virtual ai_context_ptr get_ai_context()
Definition: engine.cpp:124
engine(readonly_context &context, const config &cfg)
Definition: engine.cpp:33
std::string name_
Definition: engine.hpp:96
static void parse_goal_from_config(readonly_context &context, const config &cfg, std::back_insert_iterator< std::vector< goal_ptr >> b)
Definition: engine.cpp:79
virtual std::string get_id() const
Definition: engine.hpp:80
virtual void set_ai_context(ai_context_ptr context)
set ai context (which is not available during early initialization)
Definition: engine.cpp:119
virtual ~engine()
Definition: engine.cpp:43
virtual config to_config() const
serialize
Definition: engine.cpp:129
virtual std::string get_name() const
Definition: engine.hpp:86
static void parse_aspect_from_config(readonly_context &context, const config &cfg, const std::string &id, std::back_insert_iterator< std::vector< aspect_ptr >> b)
Definition: engine.cpp:52
ai_context_ptr ai_context_
Definition: engine.hpp:91
virtual void do_parse_aspect_from_config(const config &cfg, const std::string &id, std::back_insert_iterator< std::vector< aspect_ptr >> b)
Definition: engine.cpp:97
virtual void do_parse_engine_from_config(const config &cfg, std::back_insert_iterator< std::vector< engine_ptr >> b)
Definition: engine.cpp:106
virtual void do_parse_candidate_action_from_config(rca_context &context, const config &cfg, std::back_insert_iterator< std::vector< candidate_action_ptr >> b)
Definition: engine.cpp:102
static void parse_candidate_action_from_config(rca_context &context, const config &cfg, std::back_insert_iterator< std::vector< candidate_action_ptr >> b)
Definition: engine.cpp:61
virtual void do_parse_stage_from_config(ai_context &context, const config &cfg, std::back_insert_iterator< std::vector< stage_ptr >> b)
Definition: engine.cpp:114
static void parse_stage_from_config(ai_context &context, const config &cfg, std::back_insert_iterator< std::vector< stage_ptr >> b)
Definition: engine.cpp:88
readonly_context & ai_
Definition: engine.hpp:90
static void parse_engine_from_config(readonly_context &context, const config &cfg, std::back_insert_iterator< std::vector< engine_ptr >> b)
Definition: engine.cpp:70
virtual bool is_ok() const
Definition: engine.cpp:47
readonly_context & get_readonly_context()
Definition: engine.cpp:137
virtual std::string get_engine() const
Definition: engine.hpp:83
virtual void do_parse_goal_from_config(const config &cfg, std::back_insert_iterator< std::vector< goal_ptr >> b)
Definition: engine.cpp:110
std::string id_
Definition: engine.hpp:95
virtual engine_ptr get_new_instance(readonly_context &ai, const std::string &name)
Definition: engine.hpp:146
register_engine_factory(const std::string &name)
Definition: engine.hpp:133
virtual engine_ptr get_new_instance(readonly_context &ai, const config &cfg)
Definition: engine.hpp:138
A config object defines a single node in a WML file, with access to child nodes.
Definition: config.hpp:158
A component of the AI framework.
Helper functions for the object which operates in the context of AI for specific side this is part of...
const config * cfg
A small explanation about what's going on here: Each action has access to two game_info objects First...
Definition: actions.cpp:59
std::shared_ptr< engine > engine_ptr
Definition: game_info.hpp:99
#define e
#define b