26#include <unordered_map>
49 bool NameExists(
const std::string& name)
const {
return allNames.count(name) > 0;}
54 void publish(
const std::string& name, T C::*mp);
58 void set(C* instance,
const std::string& name,
double value);
61 void set(C* instance,
const std::string& name,
const T& value);
65 void set(C* instance,
const C* instance2,
const std::string& name);
69 using AttributeMap =
typename std::unordered_map<std::string, T C::*>;
77 T
get(
const C* instance,
const std::string& name)
const;
82 T C::*
member(
const std::string& name)
const;
94 attribute_map<T>()[name] = mp;
95 allNames.insert(name);
106 double C::* mp = member<double>(name);
107 (instance)->*mp = value;
109 catch (
const std::runtime_error&) {
111 int C::* mp = member<int>(name);
112 (instance)->*mp = value;
114 catch (
const std::runtime_error&) {
116 bool C::* mp = member<bool>(name);
117 (instance)->*mp = value;
119 catch (
const std::runtime_error&) {
121 long C::* mp = member<long>(name);
122 (instance)->*mp = value;
124 catch (
const std::runtime_error&) {
126 throw std::runtime_error(
"Unknown member " + name);
139 T C::* mp = member<T>(name);
140 (instance)->*mp = value;
142 catch (
const std::runtime_error&)
143 {
throw std::runtime_error(
"Unknown member " + name);}
151 std::list<double> valueNew = value->GetDataList();
152 std::list<double> C::* mp = member<std::list<double>>(name);
153 (instance)->*mp = valueNew;
155 catch (
const std::runtime_error&)
159 std::list<std::string> valueNew = value->GetSymbolsList();
160 std::list<std::string> C::* mp = member<std::list<std::string>>(name);
161 (instance)->*mp = valueNew;
163 catch (
const std::runtime_error &)
166 throw std::runtime_error(
"Unknown member " + name);
177 double C::* mp = member<double>(name);
179 (instance)->*mp = (instance2)->*mp;
181 catch (
const std::runtime_error&) {
183 int C::* mp = member<int>(name);
184 (instance)->*mp = (instance2)->*mp;
186 catch (
const std::runtime_error&) {
188 bool C::* mp = member<bool>(name);
189 (instance)->*mp = (instance2)->*mp;
191 catch (
const std::runtime_error&) {
193 std::string C::* mp = member<std::string>(name);
194 (instance)->*mp = (instance2)->*mp;
196 catch (
const std::runtime_error&) {
198 std::list<std::string> C::* mp = member<std::list<std::string>>(name);
199 (instance)->*mp = (instance2)->*mp;
201 catch (
const std::runtime_error&) {
203 std::list<int> C::* mp = member<std::list<int>>(name);
204 (instance)->*mp = (instance2)->*mp;
206 catch (
const std::runtime_error&) {
208 std::list<double> C::* mp = member<std::list<double>>(name);
209 (instance)->*mp = (instance2)->*mp;
211 catch (
const std::runtime_error&) {
213 long C::* mp = member<long>(name);
214 (instance)->*mp = (instance2)->*mp;
216 catch (
const std::runtime_error&) {
218 throw std::runtime_error(
"Unknown member " + name);
229 template <
typename C>
230 template <
typename T>
234 T C::* mp = member<T>(name);
235 return (instance)->*mp;
246 throw std::runtime_error(
"Unknown member " + name);
257 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.