25#include <unordered_map>
50 bool NameExists(
const std::string& name)
const {
return allNames.count(name) > 0;}
51 std::set<std::string> AllNames() {
return allNames;}
54 T
get(
const C* instance,
const std::string& name)
const;
59 void publish(
const std::string& name, T C::*mp);
63 void set(C* instance,
const std::string& name,
double value);
66 void set(C* instance,
const std::string& name,
const T& value);
70 void set(C* instance,
const C* instance2,
const std::string& name);
74 using AttributeMap =
typename std::unordered_map<std::string, T C::*>;
83 T C::*
member(
const std::string& name)
const;
95 attribute_map<T>()[name] = mp;
108 double C::* mp = member<double>(name);
109 (instance)->*mp = value;
111 catch (
const std::runtime_error&)
115 int C::* mp = member<int>(name);
116 (instance)->*mp = std::round(value);
118 catch (
const std::runtime_error&)
122 bool C::* mp = member<bool>(name);
123 (instance)->*mp = value;
125 catch (
const std::runtime_error&)
129 long C::* mp = member<long>(name);
130 (instance)->*mp = value;
132 catch (
const std::runtime_error&)
135 throw std::runtime_error(
"Unknown member " + name);
148 T C::* mp = member<T>(name);
149 (instance)->*mp = value;
151 catch (
const std::runtime_error&)
152 {
throw std::runtime_error(
"Unknown member " + name);}
160 std::list<double> valueNew = value->GetDataList();
161 std::list<double> C::* mp = member<std::list<double>>(name);
162 (instance)->*mp = valueNew;
164 catch (
const std::runtime_error&)
168 std::list<std::string> valueNew = value->GetSymbolsList();
169 std::list<std::string> C::* mp = member<std::list<std::string>>(name);
170 (instance)->*mp = valueNew;
172 catch (
const std::runtime_error &)
175 throw std::runtime_error(
"Unknown member " + name);
187 double C::* mp = member<double>(name);
189 (instance)->*mp = (instance2)->*mp;
191 catch (
const std::runtime_error&)
195 int C::* mp = member<int>(name);
196 (instance)->*mp = (instance2)->*mp;
198 catch (
const std::runtime_error&)
202 bool C::* mp = member<bool>(name);
203 (instance)->*mp = (instance2)->*mp;
205 catch (
const std::runtime_error&)
209 std::string C::* mp = member<std::string>(name);
210 (instance)->*mp = (instance2)->*mp;
212 catch (
const std::runtime_error&)
216 std::list<std::string> C::* mp = member<std::list<std::string>>(name);
217 (instance)->*mp = (instance2)->*mp;
219 catch (
const std::runtime_error&)
223 std::list<int> C::* mp = member<std::list<int>>(name);
224 (instance)->*mp = (instance2)->*mp;
226 catch (
const std::runtime_error&)
230 std::list<double> C::* mp = member<std::list<double>>(name);
231 (instance)->*mp = (instance2)->*mp;
233 catch (
const std::runtime_error&)
237 long C::* mp = member<long>(name);
238 (instance)->*mp = (instance2)->*mp;
240 catch (
const std::runtime_error&)
243 throw std::runtime_error(
"Unknown member " + name);
259 T C::* mp = member<T>(name);
260 return (instance)->*mp;
272 throw std::runtime_error(
"Unknown member " + name);
285 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.