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