26#include <unordered_map>
51 bool NameExists(
const std::string& name)
const {
return allNames.count(name) > 0;}
56 void publish(
const std::string& name, T C::*mp);
60 void set(C* instance,
const std::string& name,
double value);
63 void set(C* instance,
const std::string& name,
const T& value);
67 void set(C* instance,
const C* instance2,
const std::string& name);
71 using AttributeMap =
typename std::unordered_map<std::string, T C::*>;
79 T
get(
const C* instance,
const std::string& name)
const;
84 T C::*
member(
const std::string& name)
const;
96 attribute_map<T>()[name] = mp;
109 double C::* mp = member<double>(name);
110 (instance)->*mp = value;
112 catch (
const std::runtime_error&)
116 int C::* mp = member<int>(name);
117 (instance)->*mp = std::round(value);
119 catch (
const std::runtime_error&)
123 bool C::* mp = member<bool>(name);
124 (instance)->*mp = value;
126 catch (
const std::runtime_error&)
130 long C::* mp = member<long>(name);
131 (instance)->*mp = value;
133 catch (
const std::runtime_error&)
136 throw std::runtime_error(
"Unknown member " + name);
149 T C::* mp = member<T>(name);
150 (instance)->*mp = value;
152 catch (
const std::runtime_error&)
153 {
throw std::runtime_error(
"Unknown member " + name);}
161 std::list<double> valueNew = value->GetDataList();
162 std::list<double> C::* mp = member<std::list<double>>(name);
163 (instance)->*mp = valueNew;
165 catch (
const std::runtime_error&)
169 std::list<std::string> valueNew = value->GetSymbolsList();
170 std::list<std::string> C::* mp = member<std::list<std::string>>(name);
171 (instance)->*mp = valueNew;
173 catch (
const std::runtime_error &)
176 throw std::runtime_error(
"Unknown member " + name);
188 double C::* mp = member<double>(name);
190 (instance)->*mp = (instance2)->*mp;
192 catch (
const std::runtime_error&)
196 int C::* mp = member<int>(name);
197 (instance)->*mp = (instance2)->*mp;
199 catch (
const std::runtime_error&)
203 bool C::* mp = member<bool>(name);
204 (instance)->*mp = (instance2)->*mp;
206 catch (
const std::runtime_error&)
210 std::string C::* mp = member<std::string>(name);
211 (instance)->*mp = (instance2)->*mp;
213 catch (
const std::runtime_error&)
217 std::list<std::string> C::* mp = member<std::list<std::string>>(name);
218 (instance)->*mp = (instance2)->*mp;
220 catch (
const std::runtime_error&)
224 std::list<int> C::* mp = member<std::list<int>>(name);
225 (instance)->*mp = (instance2)->*mp;
227 catch (
const std::runtime_error&)
231 std::list<double> C::* mp = member<std::list<double>>(name);
232 (instance)->*mp = (instance2)->*mp;
234 catch (
const std::runtime_error&)
238 long C::* mp = member<long>(name);
239 (instance)->*mp = (instance2)->*mp;
241 catch (
const std::runtime_error&)
244 throw std::runtime_error(
"Unknown member " + name);
260 T C::* mp = member<T>(name);
261 return (instance)->*mp;
273 throw std::runtime_error(
"Unknown member " + name);
286 static AttributeMap<T> m;
Representation of arrays used in tokens.
Class that provides introspection to its members.
void set(C *instance, const std::string &name, GMAD::Array *const &value)
typename std::unordered_map< std::string, T C::* > AttributeMap
Define AttributeMap of string and class member pointer.
void set(C *instance, const C *instance2, const std::string &name)
Set member with name of class instance to value of second instance.
AttributeMap< T > & attribute_map() const
Access method to static map for type T and class C.
void publish(const std::string &name, T C::*mp)
Make pointer to member from class C and type T with accessible with a name.
void set(C *instance, const std::string &name, const T &value)
std::set< std::string > allNames
A cache of all names defined through publish().
T C::* member(const std::string &name) const
Access to member pointer.
void set(C *instance, const std::string &name, double value)
T get(const C *instance, const std::string &name) const
Get method for class C.
Parser namespace for GMAD language. Combination of Geant4 and MAD.