21 #ifndef DD4HEP_DDCORE_BASICGRAMMAR_INL_H
22 #define DD4HEP_DDCORE_BASICGRAMMAR_INL_H
28 #ifdef DD4HEP_USE_BOOST
29 #if defined(DD4HEP_PARSER_HEADER)
31 #define DD4HEP_NEED_EVALUATOR
34 #include DD4HEP_PARSER_HEADER
72 virtual const std::type_info&
type()
const;
74 virtual const std::string&
type_name()
const;
76 virtual size_t sizeOf()
const;
78 virtual std::string
str(
const void* ptr)
const;
80 virtual bool fromString(
void* ptr,
const std::string& value)
const;
82 virtual int evaluate(
void* ptr,
const std::string& value)
const;
118 #ifdef DD4HEP_USE_BOOST
121 if ( !sc ) sc = evaluate(&temp,string_val);
123 std::cout <<
"Sc=" << sc <<
" Converting value: " << string_val
124 <<
" to type " <<
typeid(TYPE).name()
131 #ifndef DD4HEP_USE_BOOST
132 throw std::runtime_error(
"This version of DD4HEP is not compiled to use boost::spirit.\n"
133 "To enable elaborated property handling set DD4HEP_USE_BOOST=ON\n"
134 "and BOOST_INCLUDE_DIR=<boost include path>");
143 #ifdef DD4HEP_USE_BOOST
144 std::stringstream string_rep;
146 return string_rep.str();
150 throw std::runtime_error(
"This version of DD4HEP is not compiled to use boost::spirit.\n"
151 "To enable elaborated property handling set DD4HEP_USE_BOOST=ON\n"
152 "and BOOST_INCLUDE_DIR=<boost include path>");
158 std::string res =
"";
160 for(
const char* c = in.c_str(); *c; ++c) {
163 return "Bad object representation";
185 template <
typename TYPE>
static int fill_data(std::vector<TYPE>* p,
const std::vector<std::string>& temp) {
188 for(std::vector<std::string>::const_iterator i=temp.begin(); i != temp.end(); ++i) {
197 template <
typename TYPE>
static int fill_data(std::list<TYPE>* p,
const std::vector<std::string>& temp) {
200 for(std::vector<std::string>::const_iterator i=temp.begin(); i != temp.end(); ++i) {
209 template <
typename TYPE>
static int fill_data(std::set<TYPE>* p,
const std::vector<std::string>& temp) {
212 for(std::vector<std::string>::const_iterator i=temp.begin(); i != temp.end(); ++i) {
221 template <
typename TYPE>
static int fill_data(std::deque<TYPE>* p,
const std::vector<std::string>& temp) {
224 for(std::vector<std::string>::const_iterator i=temp.begin(); i != temp.end(); ++i) {
233 template <
typename KEY,
typename TYPE>
static int fill_data(std::map<KEY,TYPE>* p,
const std::vector<std::string>& temp) {
234 const BasicGrammar&
g = BasicGrammar::instance<std::pair<KEY,TYPE> >();
235 std::pair<KEY,TYPE> val;
236 for(std::vector<std::string>::const_iterator i=temp.begin(); i != temp.end(); ++i) {
245 template <
typename TYPE>
static int eval_container(TYPE* p,
const std::string& str) {
246 #ifdef DD4HEP_USE_BOOST
247 std::vector<std::string> buff;
267 if ( p && str.empty() )
return 0;
274 size_t idx = s.find(
"(int)");
275 if (idx != std::string::npos)
279 #ifdef DD4HEP_USE_BOOST
280 double result = s__eval.evaluate(s.c_str());
292 template <>
inline int eval_item<std::string>(std::string* p, std::string
s) {
298 template <
typename T,
typename Q>
inline int eval_pair(std::pair<T,Q>* p, std::string
s) {
299 const BasicGrammar&
g = BasicGrammar::instance<std::pair<T,Q> >();
305 template<
typename T>
inline int eval_obj(
T* p,
const std::string& str) {
306 return BasicGrammar::instance<T>().fromString(p,
pre_parse_obj(str));
311 template<
typename T>
inline int eval_none(
T*,
const std::string&) {
314 template <
typename T>
inline int parse_none(
T&,
const std::string&) {
322 #define DD4HEP_DEFINE_PARSER_GRAMMAR_TYPE(x) \
324 template<> const BasicGrammar& BasicGrammar::instance<x>() { static Grammar<x> s; return s;}}
326 #define DD4HEP_DEFINE_PARSER_GRAMMAR_EVAL(x,func) \
328 template<> int Grammar<x >::evaluate(void* p, const std::string& v) const { return func ((x*)p,v); }}
330 #define DD4HEP_DEFINE_PARSER_GRAMMAR(x,func) \
331 DD4HEP_DEFINE_PARSER_GRAMMAR_TYPE(x) \
332 DD4HEP_DEFINE_PARSER_GRAMMAR_EVAL(x,func)
334 #if defined(DD4HEP_HAVE_ALL_PARSERS)
335 #define DD4HEP_DEFINE_PARSER_GRAMMAR_CONT(x,eval_func) \
336 DD4HEP_DEFINE_PARSER_GRAMMAR(x,eval_func) \
337 DD4HEP_DEFINE_PARSER_GRAMMAR(std::vector<x>, eval_container) \
338 DD4HEP_DEFINE_PARSER_GRAMMAR(std::list<x>, eval_container) \
339 DD4HEP_DEFINE_PARSER_GRAMMAR(std::set<x>, eval_container) \
340 DD4HEP_DEFINE_PARSER_GRAMMAR(std::deque<x>, eval_container) \
341 DD4HEP_DEFINE_PARSER_GRAMMAR(DD4hep::Primitive<x>::int_map_t, eval_container) \
342 DD4HEP_DEFINE_PARSER_GRAMMAR(DD4hep::Primitive<x>::ulong_map_t, eval_container) \
343 DD4HEP_DEFINE_PARSER_GRAMMAR(DD4hep::Primitive<x>::string_map_t, eval_container) \
344 DD4HEP_DEFINE_PARSER_GRAMMAR(DD4hep::Primitive<x>::int_pair_t, eval_pair) \
345 DD4HEP_DEFINE_PARSER_GRAMMAR(DD4hep::Primitive<x>::ulong_pair_t, eval_pair) \
346 DD4HEP_DEFINE_PARSER_GRAMMAR(DD4hep::Primitive<x>::string_pair_t, eval_pair)
348 #define DD4HEP_DEFINE_PARSER_GRAMMAR_CONT_VL(x,eval_func) \
349 DD4HEP_DEFINE_PARSER_GRAMMAR(x,eval_func) \
350 DD4HEP_DEFINE_PARSER_GRAMMAR(std::vector<x>,eval_container) \
351 DD4HEP_DEFINE_PARSER_GRAMMAR(std::list<x>,eval_container)
353 #define DD4HEP_DEFINE_PARSER_GRAMMAR_U_CONT(x) \
354 DD4HEP_DEFINE_PARSER_GRAMMAR_CONT(x,eval_item) \
355 DD4HEP_DEFINE_PARSER_GRAMMAR_CONT(unsigned x,eval_item)
359 #define DD4HEP_DEFINE_PARSER_GRAMMAR_CONT(x,eval_func) \
360 DD4HEP_DEFINE_PARSER_GRAMMAR(x,eval_func) \
361 DD4HEP_DEFINE_PARSER_GRAMMAR(std::vector<x>, eval_container) \
362 DD4HEP_DEFINE_PARSER_GRAMMAR(std::list<x>, eval_container) \
363 DD4HEP_DEFINE_PARSER_GRAMMAR(std::set<x>, eval_container) \
364 DD4HEP_DEFINE_PARSER_GRAMMAR(DD4hep::Primitive<x>::int_map_t, eval_container) \
365 DD4HEP_DEFINE_PARSER_GRAMMAR(DD4hep::Primitive<x>::string_map_t, eval_container) \
366 DD4HEP_DEFINE_PARSER_GRAMMAR(DD4hep::Primitive<x>::int_pair_t, eval_pair) \
367 DD4HEP_DEFINE_PARSER_GRAMMAR(DD4hep::Primitive<x>::string_pair_t, eval_pair)
369 #define DD4HEP_DEFINE_PARSER_GRAMMAR_CONT_VL(x,eval_func) \
370 DD4HEP_DEFINE_PARSER_GRAMMAR(x,eval_func) \
371 DD4HEP_DEFINE_PARSER_GRAMMAR(std::vector<x>,eval_container) \
372 DD4HEP_DEFINE_PARSER_GRAMMAR(std::list<x>,eval_container)
374 #define DD4HEP_DEFINE_PARSER_GRAMMAR_U_CONT(x) \
375 DD4HEP_DEFINE_PARSER_GRAMMAR_CONT(x,eval_item)
virtual std::string str(const void *ptr) const
PropertyGrammar overload: Serialize a property to a string.
Grammar()
Standarsd constructor.
virtual ~Grammar()
Default destructor.
static std::string pre_parse_obj(const std::string &in)
Helper function to parse data type.
Base class describing string evaluation to C++ objects using boost::spirit.
std::string typeName(const std::type_info &type)
ABI information about type names.
static void invalidConversion(const std::type_info &from, const std::type_info &to)
Error callback on invalid conversion.
std::string m_typeName
Cached type information name.
virtual size_t sizeOf() const
Access the object size (sizeof operator)
int eval_obj(T *p, const std::string &str)
Object evaluator.
int eval_item(T *p, std::string s)
Item evaluator.
virtual const std::type_info & type() const
PropertyGrammar overload: Access to the type information.
static int eval_container(TYPE *p, const std::string &str)
Container evaluator.
XmlTools::Evaluator & g4Evaluator()
Concrete type dependent grammar definition.
static int fill_data(std::vector< TYPE > *p, const std::vector< std::string > &temp)
Insertion function for std vectors.
virtual int evaluate(void *ptr, const std::string &value) const
Evaluate string value if possible before calling boost::spirit.
virtual bool fromString(void *ptr, const std::string &value) const =0
Set value from serialized string. On successful data conversion TRUE is returned. ...
std::ostream & toStream(const Property &result, std::ostream &os)
int parse(Property &result, const std::string &input)
int eval_pair(std::pair< T, Q > *p, std::string s)
Item evaluator.
virtual bool fromString(void *ptr, const std::string &value) const
PropertyGrammar overload: Retrieve value from string.
int parse_none(T &, const std::string &)
int eval_none(T *, const std::string &)
virtual const std::string & type_name() const
Access to the type information name.