Back to home page

EIC code displayed by LXR

 
 

    


Warning, /include/Geant4/tools/rntuple 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_rntuple
0005 #define tools_rntuple
0006 
0007 // interfaces to read ntuple.
0008 
0009 #include "scast"
0010 #include "cids"
0011 #include "touplow"
0012 #include "forit"
0013 
0014 #include <string>
0015 #include <vector>
0016 
0017 namespace tools {
0018 namespace read {
0019 
0020 class icol {
0021 public:
0022   virtual ~icol(){}
0023 public:
0024   virtual void* cast(cid) const = 0;
0025   virtual cid id_cls() const = 0;
0026 public:
0027   virtual const std::string& name() const = 0;
0028 public:
0029   virtual void stop() {}
0030   virtual bool fetch_entry() const {return false;} //for binded column API.
0031 };
0032 
0033 template <class T>
0034 class icolumn : public virtual icol {
0035 public:
0036   typedef T entry_t;
0037 public:
0038   static cid id_class() {
0039     static const T s_v = T(); //do that for T = std::string.
0040     return _cid(s_v);
0041   }
0042 public: //icol
0043   virtual void* cast(cid a_class) const {
0044     if(void* p = cmp_cast<icolumn>(this,a_class)) return p;
0045     return 0;
0046   }
0047   virtual cid id_cls() const {return id_class();}
0048 public:
0049   virtual ~icolumn(){}
0050 public:
0051   virtual bool get_entry(T&) const = 0;
0052 };
0053 
0054 class intuple {
0055 public:
0056   static const std::string& s_class() {
0057     static const std::string s_v("tools::read::intuple");
0058     return s_v;
0059   }
0060 public:
0061   virtual ~intuple(){}
0062 public:
0063   virtual void start() = 0;
0064   virtual bool next() = 0;
0065   virtual icol* find_icol(const std::string&) = 0;
0066   virtual const std::vector<icol*>& columns() const = 0;
0067   virtual const std::string& title() const = 0;
0068   virtual bool number_of_entries(uint64&) const = 0;
0069 public:
0070   virtual void stop() {}
0071 public:
0072   icol* find_icol_case_insensitive(const std::string& a_name) { //for gopaw and exlib::evaluator.
0073     std::string low_a_name = a_name;
0074     tolowercase(low_a_name);
0075     std::string low_name;
0076     const std::vector<icol*>& _cols = columns();
0077     tools_vforcit(icol*,_cols,it) {
0078       low_name = (*it)->name();
0079       tolowercase(low_name);
0080       if(low_name==low_a_name) return *it;
0081     }
0082     return 0;
0083   }
0084 
0085   template <class T>
0086   icolumn<T>* find_column(const std::string& a_name){
0087     icol* col = find_icol(a_name);
0088     if(!col) return 0;
0089     return id_cast<icol, icolumn<T> >(*col);
0090   }
0091 
0092   template <class T>
0093   bool find_column(const std::string& a_name,icolumn<T>*& a_col,bool a_case_sensitive = true) { //for gopaw and exlib::evaluator.
0094     icol* col = a_case_sensitive ? find_icol(a_name) : find_icol_case_insensitive(a_name);
0095     if(!col) {a_col = 0;return false;}
0096     a_col = id_cast<icol, icolumn<T> >(*col);
0097     return a_col?true:false;
0098   }
0099 
0100 };
0101 
0102 }}
0103 
0104 #endif