// Copyright (C) 2010, Guy Barrand. All rights reserved. // See the file tools.license for terms. #ifndef tools_rntuple #define tools_rntuple // interfaces to read ntuple. #include "scast" #include "cids" #include #include namespace tools { namespace read { class icol { public: virtual ~icol(){} public: virtual void* cast(cid) const = 0; virtual cid id_cls() const = 0; public: virtual const std::string& name() const = 0; public: virtual void stop() {} virtual bool fetch_entry() const {return false;} //for binded column API. }; template class icolumn : public virtual icol { public: static cid id_class() { static const T s_v = T(); //do that for T = std::string. return _cid(s_v); } public: //icol virtual void* cast(cid a_class) const { if(void* p = cmp_cast(this,a_class)) return p; return 0; } virtual cid id_cls() const {return id_class();} public: virtual ~icolumn(){} public: virtual bool get_entry(T&) const = 0; }; class intuple { public: virtual ~intuple(){} public: virtual void start() = 0; virtual bool next() = 0; virtual icol* find_icol(const std::string&) = 0; virtual const std::vector& columns() const = 0; public: virtual void stop() {} public: template icolumn* find_column(const std::string& a_name){ read::icol* col = find_icol(a_name); if(!col) return 0; return id_cast >(*col); } }; }} #endif