Shiokaze Framework
A research-oriented fluid solver for computer graphics
configurable.h
Go to the documentation of this file.
1 /*
2 ** configurable.h
3 **
4 ** This is part of Shiokaze, a research-oriented fluid solver for computer graphics.
5 ** Created by Ryoichi Ando <rand@nii.ac.jp> on Sep 8, 2017.
6 **
7 ** Permission is hereby granted, free of charge, to any person obtaining a copy of
8 ** this software and associated documentation files (the "Software"), to deal in
9 ** the Software without restriction, including without limitation the rights to use,
10 ** copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
11 ** Software, and to permit persons to whom the Software is furnished to do so,
12 ** subject to the following conditions:
13 **
14 ** The above copyright notice and this permission notice shall be included in all copies
15 ** or substantial portions of the Software.
16 **
17 ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
18 ** INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
19 ** PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
20 ** HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
21 ** CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
22 ** OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 */
24 //
25 #ifndef SHKZ_CONFIGURABLE_H
26 #define SHKZ_CONFIGURABLE_H
27 //
29 #include <string>
30 #include <vector>
31 #include <map>
32 #include <cassert>
33 #include <algorithm>
34 //
36 //
38 class configurable {
41 public:
46  using environment_map = std::map<std::string,const void *>;
53  virtual void load ( configuration &config ) {}
60  virtual void configure ( configuration &config ) {}
67  virtual void initialize( const environment_map &environment ) {}
74  static configuration& set_global_configuration( const configuration& config );
88  template <class T > static const T& get_env( const environment_map &environment, std::string key ) {
89  return *reinterpret_cast<const T *>(environment.at(key));
90  }
95  virtual void setup_now( configuration& config=get_global_configuration() ) {
96  assert(not_recursive());
97  load(config);
98  configure(config);
100  }
107  virtual bool not_recursive() { return true; } // for safety check
108 protected:
115  bool check_set( const environment_map &environment, std::vector<std::string> names ) {
116  bool result (true);
117  for( const auto &key : names ) {
118  result = result && environment.find(key) != environment.end();
119  }
120  return result;
121  }
122 };
123 //
127 public:
132  recursive_configurable() = default;
139  virtual void recursive_load ( configuration &config ) {
140  load(config);
141  for( auto it=m_children.rbegin(); it!=m_children.rend(); ++it ) (*it)->load(config);
142  for( auto it=m_recursive_children.rbegin(); it!=m_recursive_children.rend(); ++it ) (*it)->recursive_load(config);
143  post_load();
144  m_load_done = true;
145  }
152  virtual void recursive_configure ( configuration &config ) {
153  assert(m_load_done);
154  configure(config);
155  for( auto it=m_children.rbegin(); it!=m_children.rend(); ++it ) (*it)->configure(config);
156  for( auto it=m_recursive_children.rbegin(); it!=m_recursive_children.rend(); ++it ) (*it)->recursive_configure(config);
157  post_configure();
158  m_configure_done = true;
159  }
167  assert(m_configure_done);
168  configurable::environment_map merged_environment(m_environment);
169  merged_environment.insert(environment.begin(),environment.end());
170  initialize(merged_environment);
171  for( auto it=m_children.rbegin(); it!=m_children.rend(); ++it ) (*it)->initialize(merged_environment);
172  for( auto it=m_recursive_children.rbegin(); it!=m_recursive_children.rend(); ++it ) (*it)->recursive_initialize(merged_environment);
173  post_initialize();
174  m_initialize_done = true;
175  }
182  virtual bool is_ready() const {
183  return m_initialize_done;
184  }
191  virtual void add_child( configurable *child ) {
192  assert(child->not_recursive());
193  m_children.push_back(child);
194  }
201  virtual void add_child( recursive_configurable *child ) {
202  m_recursive_children.push_back(child);
203  }
210  virtual void remove_child( configurable *child ) {
211  assert(child->not_recursive());
212  m_children.erase(find(m_children.begin(),m_children.end(),child));
213  }
220  virtual void remove_child( recursive_configurable *child ) {
221  m_recursive_children.erase(find(m_recursive_children.begin(),m_recursive_children.end(),child));
222  }
227  virtual void setup_now( configuration& config=get_global_configuration() ) override {
228  recursive_load(config);
229  recursive_configure(config);
231  }
238  virtual bool not_recursive() override { return false; } // for safety check
247  void set_environment( std::string name, const void *value ) {
248  m_environment[name] = value;
249  }
250  //
251 protected:
252  //
256  public:
264  instance->m_environment.clear();
265  }
276  environment_setter ( recursive_configurable *instance, std::string name, const void *value ) {
277  instance->m_environment[name] = value;
278  }
288  instance->m_environment = env;
289  }
290  };
291  //
292 private:
293  //
294  using configurable::load;
296  //
297  virtual void initialize( const environment_map &environment ) override { configurable::initialize(environment); }
298  virtual void post_load () {}
299  virtual void post_configure () {}
300  virtual void post_initialize () {}
301  //
302  std::vector<configurable *> m_children;
303  std::vector<recursive_configurable *> m_recursive_children;
304  configurable::environment_map m_environment;
305  //
306  bool m_load_done{false}, m_configure_done{false}, m_initialize_done{false};
307  //
309  recursive_configurable& operator=( const recursive_configurable & ) = delete;
310 };
311 //
313 //
314 #endif
recursive_configurable::set_environment
void set_environment(std::string name, const void *value)
Set the pointer to an environmental value associated with an input name.
Definition: configurable.h:247
recursive_configurable::recursive_initialize
virtual void recursive_initialize(const configurable::environment_map &environment=configurable::environment_map())
Initialize the program itself and relay the same to its children. Used to get things ready for actual...
Definition: configurable.h:166
configurable::setup_now
virtual void setup_now(configuration &config=get_global_configuration())
Run load - configure - initialize processes.
Definition: configurable.h:95
recursive_configurable::recursive_configurable
recursive_configurable()=default
Default constructor.
recursive_configurable::setup_now
virtual void setup_now(configuration &config=get_global_configuration()) override
Run recursive_load - recursive_configure - recursive_initialize processes.
Definition: configurable.h:227
configurable::initialize
virtual void initialize(const environment_map &environment)
Initialize the program. Used to get things ready for actual use.
Definition: configurable.h:67
configurable::set_global_configuration
static configuration & set_global_configuration(const configuration &config)
Assign the global settings of the program.
configurable::get_env
static const T & get_env(const environment_map &environment, std::string key)
Extract an specified type of pointer from the input environment.
Definition: configurable.h:88
configurable
Class for managing the workflow of load - configure - initialize.
Definition: configurable.h:40
recursive_configurable::is_ready
virtual bool is_ready() const
Get if the instance is initialized.
Definition: configurable.h:182
configurable::load
virtual void load(configuration &config)
Load the program. Used to load files and libraries into memory.
Definition: configurable.h:53
recursive_configurable::recursive_load
virtual void recursive_load(configuration &config)
Load the program itself and relay the same to its children. Used to load files and libraries into mem...
Definition: configurable.h:139
SHKZ_BEGIN_NAMESPACE
#define SHKZ_BEGIN_NAMESPACE
Name space beggining definition for shiokaze.
Definition: common.h:39
configurable::not_recursive
virtual bool not_recursive()
Check if this instance is not derived from recursive_configurable.
Definition: configurable.h:107
configurable::get_global_configuration
static configuration & get_global_configuration()
Get the global settings of the program.
recursive_configurable::remove_child
virtual void remove_child(recursive_configurable *child)
Remove a child instance.
Definition: configurable.h:220
recursive_configurable::environment_setter
Class for setting environemt.
Definition: configurable.h:255
recursive_configurable::remove_child
virtual void remove_child(configurable *child)
Remove a child instance.
Definition: configurable.h:210
recursive_configurable
Extended configurable class that holds multiple children of configurable.
Definition: configurable.h:126
configurable::check_set
bool check_set(const environment_map &environment, std::vector< std::string > names)
Check if the values for a variable keys exist.
Definition: configurable.h:115
recursive_configurable::recursive_configure
virtual void recursive_configure(configuration &config)
Configure the program itself and relay the same to its children. Used to load and set parameters.
Definition: configurable.h:152
recursive_configurable::environment_setter::environment_setter
environment_setter(recursive_configurable *instance)
Constructor for environment_setter.
Definition: configurable.h:263
configuration.h
configurable::configure
virtual void configure(configuration &config)
Configure the program. Used to load and set parameters.
Definition: configurable.h:60
configurable::environment_map
std::map< std::string, const void * > environment_map
Type for environment_map.
Definition: configurable.h:46
configuration
Class that controls the settings of the program.
Definition: configuration.h:39
SHKZ_END_NAMESPACE
#define SHKZ_END_NAMESPACE
Name space end definition for shiokaze.
Definition: common.h:44
recursive_configurable::add_child
virtual void add_child(recursive_configurable *child)
Add a child instance.
Definition: configurable.h:201
recursive_configurable::environment_setter::environment_setter
environment_setter(recursive_configurable *instance, std::string name, const void *value)
Constructor for environment_setter.
Definition: configurable.h:276
recursive_configurable::add_child
virtual void add_child(configurable *child)
Add a child instance.
Definition: configurable.h:191
recursive_configurable::environment_setter::environment_setter
environment_setter(recursive_configurable *instance, const configurable::environment_map &env)
Constructor for environment_setter.
Definition: configurable.h:287
recursive_configurable::not_recursive
virtual bool not_recursive() override
Check if this instance is not derived from recursive_configurable.
Definition: configurable.h:238