Back to home page

EIC code displayed by LXR

 
 

    


Warning, /include/Geant4/tools/sg/field_desc is written in an unsupported language. File is not indexed.

0001 // Copyright (C) 2010, Guy Barrand. All rights reserved.
0002 // See the file tools.license for terms.
0003 
0004 #ifndef tools_sg_field_desc
0005 #define tools_sg_field_desc
0006 
0007 #include <string>
0008 #include <cstddef> //ptrdiff_t
0009 
0010 #include <vector>
0011 
0012 namespace tools {
0013 namespace sg {
0014 
0015 class field_desc {
0016 public:
0017   typedef ptrdiff_t offset_t;
0018 public:
0019   field_desc():m_offset(0){ //touchy
0020   }
0021   field_desc(const std::string& a_name,
0022              const std::string& a_class,
0023              offset_t a_offset,
0024              bool a_editable)
0025   :m_name(a_name)
0026   ,m_class(a_class)
0027   ,m_offset(a_offset)
0028   ,m_editable(a_editable)
0029   {
0030   }
0031   virtual ~field_desc(){
0032   }
0033 public:
0034   field_desc(const field_desc& a_from)
0035   :m_name(a_from.m_name)
0036   ,m_class(a_from.m_class)
0037   ,m_offset(a_from.m_offset)
0038   ,m_editable(a_from.m_editable)
0039   ,m_enums(a_from.m_enums)
0040   ,m_opts(a_from.m_opts)
0041   {}
0042   field_desc& operator=(const field_desc& a_from){
0043     m_name = a_from.m_name;
0044     m_class = a_from.m_class;
0045     m_offset = a_from.m_offset;
0046     m_editable = a_from.m_editable;
0047     m_enums = a_from.m_enums;
0048     m_opts = a_from.m_opts;
0049     return *this;
0050   }
0051 public:
0052   const std::string& name() const {return m_name;}
0053   const std::string& cls() const {return m_class;}
0054   offset_t offset() const {return m_offset;}
0055 
0056   void add_enum(const std::string& a_key,int a_value) {m_enums.push_back(enum_t(a_key,a_value));}
0057   typedef std::pair<std::string,int> enum_t;
0058   const std::vector<enum_t>& enums() const {return m_enums;}
0059 
0060   void add_opt(const std::string& a_value) {m_opts.push_back(a_value);}
0061   const std::vector<std::string>& opts() const {return m_opts;}
0062 
0063   bool editable() const {return m_editable;}
0064 protected:
0065   std::string m_name;
0066   std::string m_class;
0067   offset_t m_offset;
0068   bool m_editable;
0069   std::vector<enum_t> m_enums;
0070   std::vector<std::string> m_opts;
0071 };
0072 
0073 }}
0074 
0075 #include <cstdarg>
0076 
0077 namespace tools {
0078 namespace sg {
0079 
0080 class field_desc_enums : public field_desc {
0081   typedef field_desc parent;
0082 public:
0083   field_desc_enums(const std::string& a_name,const std::string& a_class,offset_t a_offset,bool a_editable,size_t a_num,...)
0084   :parent(a_name,a_class,a_offset,a_editable)
0085   {
0086     va_list args;
0087     va_start(args,a_num);
0088     for(size_t index=0;index<a_num;index++) {
0089       char* _key = va_arg(args,char*);
0090       int _value = va_arg(args,int);
0091       m_enums.push_back(enum_t(_key,_value));
0092     }
0093     va_end(args);
0094   }
0095   virtual ~field_desc_enums() {}
0096 public:
0097   field_desc_enums(const field_desc_enums& a_from):parent(a_from) {}
0098   field_desc_enums& operator=(const field_desc_enums& a_from){parent::operator=(a_from);return *this;}
0099 };
0100 
0101 class field_desc_opts : public field_desc {
0102   typedef field_desc parent;
0103 public:
0104   field_desc_opts(const std::string& a_name,const std::string& a_class,offset_t a_offset,bool a_editable,size_t a_num,...)
0105   :parent(a_name,a_class,a_offset,a_editable)
0106   {
0107     va_list args;
0108     va_start(args,a_num);
0109     for(size_t index=0;index<a_num;index++) {
0110       char* _value = va_arg(args,char*);
0111       m_opts.push_back(_value);
0112     }
0113     va_end(args);
0114   }
0115   virtual ~field_desc_opts() {}
0116 public:
0117   field_desc_opts(const field_desc_opts& a_from):parent(a_from) {}
0118   field_desc_opts& operator=(const field_desc_opts& a_from){parent::operator=(a_from);return *this;}
0119 };
0120 
0121 }}
0122 
0123 #include <ostream>
0124 #include "../forit"
0125 
0126 namespace tools {
0127 namespace sg {
0128 
0129 class desc_fields : public std::vector<field_desc> {
0130   typedef std::vector<field_desc> parent;
0131 public:
0132   desc_fields(){}
0133   desc_fields(const desc_fields& a_parent,size_t a_num,...){
0134     parent::operator=(a_parent);
0135     va_list args;
0136     va_start(args,a_num);
0137     for(size_t index=0;index<a_num;index++) {
0138       field_desc* _fd = va_arg(args,field_desc*); //we get ownership.
0139       parent::push_back(*_fd);
0140       delete _fd;
0141     }
0142     va_end(args);
0143   }
0144   virtual ~desc_fields() {}
0145 public:
0146   desc_fields(const desc_fields& a_from):parent(a_from) {}
0147   desc_fields& operator=(const desc_fields& a_from){parent::operator=(a_from);return *this;}
0148 public:
0149   void dump(std::ostream& a_out) const {
0150     a_out << "num fields " << parent::size() << " :" << std::endl;
0151     tools_vforcit(field_desc,*this,it) {
0152       const field_desc& _fd = *it;
0153       a_out << "name " << _fd.name() << std::endl;
0154       a_out << "class " << _fd.cls() << std::endl;
0155       a_out << "offset " << _fd.offset() << std::endl;
0156       a_out << "editable " << (_fd.editable()?"yes":"no") << std::endl;
0157      {const std::vector<field_desc::enum_t>& _enums = _fd.enums();
0158       if(_enums.size()) {
0159         a_out << "num enums " << _enums.size() << " :" << std::endl;
0160         tools_vforcit(field_desc::enum_t,_enums,eit) {
0161           a_out << "key " << (*eit).first << ", value " << (*eit).second << std::endl;
0162         }
0163       }}
0164      {const std::vector<std::string>& _opts = _fd.opts();
0165       if(_opts.size()) {
0166         a_out << "num options " << _opts.size() << " :" << std::endl;
0167         tools_vforcit(std::string,_opts,oit) {
0168           a_out << " " << (*oit) << std::endl;
0169         }
0170       }}
0171     }
0172   }
0173 };
0174 
0175 }}
0176 
0177 #endif