#ifndef TSimpleBranch_h #define TSimpleBranch_h #include "TTree.h" #include "TClonesArray.h" class TBaseBranch { public: class OverFlow{}; TBaseBranch() : fSize(0), fMaxSize(0), fData(0) {} ~TBaseBranch() { if(fData) delete fData; } void Clear() { fSize = 0; if(fData) fData->Clear(); } protected: Int_t fSize, fMaxSize; TClonesArray *fData; }; //------------------------------------------------------------------------------ template class TSimpleBranch: public TBaseBranch { public: TSimpleBranch(const TString &name, Int_t maxsize, TTree *tree) { fMaxSize = maxsize; if(fMaxSize > 1) { tree->Branch(name + "_size", &fSize, name + "_size/I"); } else { fMaxSize = 1; } T::Class()->IgnoreTObjectStreamer(); fData = new TClonesArray(T::Class(), maxsize); fData->ExpandCreateFast(maxsize); tree->Branch(name, &fData, 64000, 2); } T *NewEntry() { if(fSize >= fMaxSize) throw OverFlow(); return fData ? static_cast(fData->AddrAt(fSize++)) : 0; } }; #endif /* TSimpleBranch */