EventAnalysis  1.3.1
Configurable.h
Go to the documentation of this file.
1 /*
2  * Configurable.h
3  *
4  * Created on: 06 Feb 2017
5  * Author: Nicola Mori
6  */
7 
10 #ifndef CONFIGURABLE_H_
11 #define CONFIGURABLE_H_
12 
13 // EventAnalysis headers
14 #include "core/ObjectMap.h"
15 
16 // C/C++ headers
17 #include <functional>
18 
19 namespace EA {
20 
33 class Configurable {
34 public:
36  Configurable();
37 
47  template <typename T> bool SetParameter(const std::string &name, const T &value);
48 
59  bool SetParameter(const std::string &name, const char *value);
60 
68  std::vector<std::string> GetParameters();
69 
79 
80 protected:
93  template <typename T> bool DefineParameter(const std::string &name, T &variable, std::function<bool()> callBack = {});
94 
96  friend class Configurable;
98  std::unordered_map<std::string, std::function<bool()>> callBackMap;
99  std::vector<observer_ptr<Configurable>> subConfigurables;
100  };
101 
102  Configurable(const std::shared_ptr<Representation> &impl) : _repr{impl} {}
103  std::shared_ptr<Representation> &GetRepresentation() { return _repr; }
104 
105 private:
106  std::shared_ptr<Representation> _repr;
107 };
108 
109 #include <typeinfo>
110 
111 template <typename T> bool Configurable::SetParameter(const std::string &name, const T &value) {
112  ObjPtr<T> parameter;
113  if (!((parameter = _repr->paramsMap.GetObject<T>(name)).GetRetrievalResult() == RetrievalResult::SUCCESS)) {
114  for (auto &subConf : _repr->subConfigurables) {
115  if ((parameter = subConf->_repr->paramsMap.GetObject<T>(name)).GetRetrievalResult() == RetrievalResult::SUCCESS) {
116  *parameter = value;
117  auto callBackIter = _repr->callBackMap.find(name);
118  if (callBackIter != _repr->callBackMap.end()) {
119  return (callBackIter->second)();
120  } else {
121  return true;
122  }
123  }
124  }
125  } else {
126  *parameter = value;
127  auto callBackIter = _repr->callBackMap.find(name);
128  if (callBackIter != _repr->callBackMap.end()) {
129  return (callBackIter->second)();
130  } else {
131  return true;
132  }
133  }
134 
135  return false;
136 }
137 
138 template <typename T>
139 bool Configurable::DefineParameter(const std::string &name, T &variable, std::function<bool()> callBack) {
140 
141  static_assert(!(std::is_array<T>::value), "Can't use array as parameter");
142  static_assert(!(std::is_same<T, const char *>::value), "Can't use const char * as parameter; use std::string");
143 
144  for (auto &subConf : _repr->subConfigurables) {
145  if ((subConf->_repr->paramsMap.GetObject<T>(name)).GetRetrievalResult() == RetrievalResult::SUCCESS) {
146  return false;
147  }
148  }
149  if (_repr->paramsMap.AddObject(name, observer_ptr<T>(&variable)) == InsertionResult::SUCCESS) {
150  if (callBack) {
151  _repr->callBackMap.emplace(name, callBack);
152  }
153  return true;
154  }
155 
156  return false;
157 }
158 
159 } // namespace EA
160 
161 #endif /* CONFIGURABLE_H_ */
Configurable(const std::shared_ptr< Representation > &impl)
Definition: Configurable.h:102
Class describing a pointer to an object retrieved from an ObjectMap.
Definition: ObjPtr.h:31
bool SetParameter(const std::string &name, const T &value)
Set the value of a parameter and then calls a callback function.
Definition: Configurable.h:111
std::shared_ptr< Representation > _repr
Definition: Configurable.h:106
bool DefineParameter(const std::string &name, T &variable, std::function< bool()> callBack={})
Set a parameter.
Definition: Configurable.h:139
A smart pointer not owning the wrapped object.
Definition: ObserverPtr.h:28
std::unordered_map< std::string, std::function< bool()> > callBackMap
Definition: Configurable.h:98
IncludeFileExc.h IncludeFileExc class declaration.
Definition: Algorithm.h:21
Definition: Configurable.h:95
A map between strings and objects of ObjectWrapper kind.
Definition: ObjectMap.h:32
Configurable()
Constructor.
Definition: Configurable.cpp:14
std::vector< observer_ptr< Configurable > > subConfigurables
Definition: Configurable.h:99
bool AddSubConfigurable(EA::observer_ptr< Configurable > subConfigurable)
Adds a sub-configurable.
Definition: Configurable.cpp:57
std::vector< std::string > GetParameters()
Get the names of the parameters.
Definition: Configurable.cpp:44
ObjectMap paramsMap
Definition: Configurable.h:97
Interface for a configurable class.
Definition: Configurable.h:33
std::shared_ptr< Representation > & GetRepresentation()
Definition: Configurable.h:103