TBranchProxyTemplate.h

Go to the documentation of this file.
00001 // @(#)root/treeplayer:$Id: TBranchProxyTemplate.h 36449 2010-10-28 20:52:17Z pcanal $
00002 // Author: Philippe Canal 01/06/2004
00003 
00004 /*************************************************************************
00005  * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers and al.        *
00006  * All rights reserved.                                                  *
00007  *                                                                       *
00008  * For the licensing terms see $ROOTSYS/LICENSE.                         *
00009  * For the list of contributors see $ROOTSYS/README/CREDITS.             *
00010  *************************************************************************/
00011 
00012 #ifndef ROOT_TBranchProxyTemplate
00013 #define ROOT_TBranchProxyTemplate
00014 
00015 #if !defined(__CINT__) || defined(__MAKECINT__)
00016 #include "TBranchProxy.h"
00017 #endif
00018 
00019 #define InjecTBranchProxyInterface()                     \
00020    TBranchProxy *GetProxy() { return obj.GetProxy(); }   \
00021    void Reset() { obj.Reset(); }                         \
00022    bool Setup() { return obj.Setup(); }                  \
00023    bool IsInitialized() { return obj.IsInitialized(); }  \
00024    bool IsaPointer() const { return obj.IsaPointer(); }  \
00025    bool Read() { return obj.Read(); }
00026 
00027 namespace ROOT {
00028    template <class T>
00029    class TObjProxy {
00030       TBranchProxy obj;
00031    public:
00032       InjecTBranchProxyInterface();
00033 
00034       TObjProxy() : obj() {};
00035       TObjProxy(TBranchProxyDirector *director, const char *name) : obj(director,name) {};
00036       TObjProxy(TBranchProxyDirector *director, const char *top, const char *name) :
00037          obj(director,top,name) {};
00038       TObjProxy(TBranchProxyDirector *director, const char *top, const char *name, const char *data) :
00039          obj(director,top,name,data) {};
00040       TObjProxy(TBranchProxyDirector *director, TBranchProxy *parent, const char *name, const char* top = 0, const char* mid = 0) : 
00041          obj(director,parent, name, top, mid) {};
00042       ~TObjProxy() {};
00043 
00044       Int_t GetOffset() { return obj.GetOffset(); }
00045 
00046       void Print() {
00047          obj.Print();
00048          cout << "fWhere " << obj.GetWhere() << endl;
00049          if (obj.GetWhere()) cout << "address? " << (T*)obj.GetWhere() << endl;
00050       }
00051 
00052       T* GetPtr() {
00053          //static T default_val;
00054          if (!obj.Read()) return 0; // &default_val;
00055          T *temp = (T*)obj.GetStart();
00056          // if (temp==0) return &default_val;
00057          return temp;
00058       }
00059 
00060       T* operator->() { return GetPtr(); }
00061       operator T*() { return GetPtr(); }
00062       // operator T&() { return *GetPtr(); }
00063 
00064    };
00065 
00066    template <class T>
00067    class TClaObjProxy  {
00068       TClaProxy obj;
00069    public:
00070       InjecTBranchProxyInterface();
00071 
00072       void Print() {
00073          obj.Print();
00074          cout << "obj.GetWhere() " << obj.GetWhere() << endl;
00075          //if (obj.GetWhere()) cout << "value? " << *(T*)obj.GetWhere() << endl;
00076       }
00077 
00078       TClaObjProxy() : obj() {};
00079       TClaObjProxy(TBranchProxyDirector *director, const char *name) : obj(director,name) {};
00080       TClaObjProxy(TBranchProxyDirector *director,  const char *top, const char *name) :
00081          obj(director,top,name) {};
00082       TClaObjProxy(TBranchProxyDirector *director,  const char *top, const char *name, const char *data) :
00083          obj(director,top,name,data) {};
00084       TClaObjProxy(TBranchProxyDirector *director, TBranchProxy *parent, const char *name, const char* top = 0, const char* mid = 0) : 
00085          obj(director,parent, name, top, mid) {};
00086       ~TClaObjProxy() {};
00087 
00088       const TClonesArray* GetPtr() { return obj.GetPtr(); }
00089 
00090       Int_t GetEntries() { return obj.GetEntries(); }
00091 
00092       const T* At(UInt_t i) {
00093          static T default_val;
00094          if (!obj.Read()) return &default_val;
00095          if (obj.GetWhere()==0) return &default_val;
00096 
00097          T* temp = (T*)obj.GetClaStart(i);
00098          if (temp) return temp;
00099          else return &default_val;
00100       }
00101 
00102       const T* operator [](Int_t i) { return At(i); }
00103       const T* operator [](UInt_t i) { return At(i); }
00104 
00105    };
00106 
00107    template <class T>
00108    class TStlObjProxy  {
00109       TStlProxy obj;
00110       typedef T value_t;
00111    public:
00112       InjecTBranchProxyInterface();
00113 
00114       void Print() {
00115          obj.Print();
00116          cout << "obj.GetWhere() " << obj.GetWhere() << endl;
00117          //if (obj.GetWhere()) cout << "value? " << *(T*)obj.GetWhere() << endl;
00118       }
00119 
00120       TStlObjProxy() : obj() {};
00121       TStlObjProxy(TBranchProxyDirector *director, const char *name) : obj(director,name) {};
00122       TStlObjProxy(TBranchProxyDirector *director,  const char *top, const char *name) :
00123          obj(director,top,name) {};
00124       TStlObjProxy(TBranchProxyDirector *director,  const char *top, const char *name, const char *data) :
00125          obj(director,top,name,data) {};
00126       TStlObjProxy(TBranchProxyDirector *director, TBranchProxy *parent, const char *name, const char* top = 0, const char* mid = 0) : 
00127          obj(director,parent, name, top, mid) {};
00128       ~TStlObjProxy() {};
00129       
00130       TVirtualCollectionProxy* GetCollection() { 
00131          return obj.GetPtr();
00132       }
00133 
00134       Int_t GetEntries() { return obj.GetEntries(); }
00135 
00136       const value_t& At(UInt_t i) {
00137          static const value_t default_val;
00138          if (!obj.Read()) return default_val;
00139          if (obj.GetWhere()==0) return default_val;
00140 
00141          value_t *temp = (value_t*)obj.GetStlStart(i);
00142          if (temp) return *temp;
00143          else return default_val;
00144       }
00145 
00146       const value_t& operator [](Int_t i) { return At(i); }
00147       const value_t& operator [](UInt_t i) { return At(i); }
00148 
00149    };
00150 
00151 
00152    template <class T>
00153    class TStlSimpleProxy : TObjProxy<T> {
00154       // Intended to compiled non-split collection
00155 
00156       TVirtualCollectionProxy *fCollection;
00157       typedef typename T::value_type value_t;
00158    public:
00159 
00160       TStlSimpleProxy() : ROOT::TObjProxy<T>(),fCollection(0) {};
00161       TStlSimpleProxy(TBranchProxyDirector *director, const char *name) : ROOT::TObjProxy<T>(director,name),fCollection(0) {};
00162       TStlSimpleProxy(TBranchProxyDirector *director,  const char *top, const char *name) :
00163          ROOT::TObjProxy<T>(director,top,name),fCollection(0) {};
00164       TStlSimpleProxy(TBranchProxyDirector *director,  const char *top, const char *name, const char *data) :
00165          ROOT::TObjProxy<T>(director,top,name,data),fCollection(0) {};
00166       TStlSimpleProxy(TBranchProxyDirector *director, TBranchProxy *parent, const char *name, const char* top = 0, const char* mid = 0) : 
00167          ROOT::TObjProxy<T>(director,parent, name, top, mid),fCollection(0) {};
00168       ~TStlSimpleProxy() { delete fCollection; };
00169 
00170       TVirtualCollectionProxy* GetCollection() { 
00171          if (fCollection==0) {
00172             TClass *cl = TClass::GetClass(typeid(T));
00173             if (cl && cl->GetCollectionProxy()) {
00174                fCollection =  cl->GetCollectionProxy()->Generate();
00175             }
00176          }
00177          return fCollection;
00178       }
00179 
00180       Int_t GetEntries() { 
00181          T *temp =  ROOT::TObjProxy<T>::GetPtr();
00182          if (temp) {
00183             GetCollection();
00184             if (!fCollection) return 0;
00185             TVirtualCollectionProxy::TPushPop helper( fCollection, temp );
00186             return fCollection->Size();
00187          }
00188          return 0;
00189       }
00190 
00191       const value_t At(UInt_t i) {
00192          static value_t default_val;
00193          T *temp = ROOT::TObjProxy<T>::GetPtr();
00194          if (temp) {
00195             GetCollection();
00196             if (!fCollection) return 0;
00197             TVirtualCollectionProxy::TPushPop helper( fCollection, temp );
00198             return *(value_t*)(fCollection->At(i));
00199          }
00200          else return default_val;
00201       }
00202 
00203       const value_t operator [](Int_t i) { return At(i); }
00204       const value_t operator [](UInt_t i) { return At(i); }
00205 
00206       T* operator->() { return ROOT::TObjProxy<T>::GetPtr(); }
00207       operator T*() { return ROOT::TObjProxy<T>::GetPtr(); }
00208       // operator T&() { return *GetPtr(); }
00209 
00210    };
00211 
00212 }
00213 
00214 #endif

Generated on Tue Jul 5 14:26:35 2011 for ROOT_528-00b_version by  doxygen 1.5.1