// @(#)root/treeplayer:$Id$ // Author: Philippe Canal 01/06/2004 /************************************************************************* * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers and al. * * All rights reserved. * * * * For the licensing terms see $ROOTSYS/LICENSE. * * For the list of contributors see $ROOTSYS/README/CREDITS. * *************************************************************************/ #ifndef ROOT_TBranchProxy #define ROOT_TBranchProxy #include "TBranchProxyDirector.h" #include "TTree.h" #include "TBranchElement.h" #include "TLeaf.h" #include "TClonesArray.h" #include "TString.h" #include "TError.h" #include "TVirtualCollectionProxy.h" #include "TNotifyLink.h" #include #include #include class TBranch; class TStreamerElement; // Note we could protect the arrays more by introducing a class TArrayWrapper which somehow knows // its internal dimensions and check for them ... // template TArrayWrapper { // public: // TArrayWrapper(void *where, int dim1); // const T operator[](int i) { // if (i>=dim1) return 0; // return where[i]; // }; // }; // 2D array would actually be a wrapper of a wrapper i.e. has a method TArrayWrapper operator[](int i); namespace ROOT { namespace Internal { //////////////////////////////////////////////////////////////////////////////// /// String builder to be used in the constructors. class TBranchProxyHelper { public: TString fName; TBranchProxyHelper(const char *left, const char *right = nullptr) : fName() { if (left) { fName = left; if (left[0]&&right && fName[fName.Length()-1]!='.') fName += "."; } if (right) { fName += right; } } operator const char*() { return fName.Data(); } }; class TTreeReaderValueBase; } // namespace Internal // prevent access violation when executing the df017_vecOpsHEP.C tutorial with ROOT built in release mode // TODO: to be reviewed when updating Visual Studio or LLVM #if defined(_MSC_VER) && !defined(__clang__) #pragma optimize("", off) #endif namespace Detail { class TBranchProxy { protected: Internal::TBranchProxyDirector *fDirector; // contain pointer to TTree and entry to be read Bool_t fInitialized : 1; const Bool_t fIsMember : 1; // true if we proxy an unsplit data member Bool_t fIsClone : 1; // true if we proxy the inside of a TClonesArray Bool_t fIsaPointer : 1; // true if we proxy a data member of pointer type Bool_t fHasLeafCount : 1;// true if we proxy a variable size leaf of a leaflist const TString fBranchName; // name of the branch to read TBranchProxy *fParent; // Proxy to a parent object const TString fDataMember; // name of the (eventual) data member being proxied TString fClassName; // class name of the object pointed to by the branch TClass *fClass; // class name of the object pointed to by the branch TStreamerElement *fElement; Int_t fMemberOffset; Int_t fOffset; // Offset inside the object Int_t fArrayLength; // Number of element if the data is an array TBranch *fBranch; // branch to read union { TBranchElement *fBranchCount; // eventual auxiliary branch (for example holding the size) TLeaf *fLeafCount; // eventual auxiliary leaf (for example holding the size) }; TNotifyLink fNotify; // Callback object used by the TChain to update this proxy Long64_t fRead; // Last entry read void *fWhere; // memory location of the data TVirtualCollectionProxy *fCollection; // Handle to the collection containing the data chunk. public: virtual void Print(); TBranchProxy(); TBranchProxy(Internal::TBranchProxyDirector* boss, const char* top, const char* name = nullptr); TBranchProxy(Internal::TBranchProxyDirector* boss, const char *top, const char *name, const char *membername); TBranchProxy(Internal::TBranchProxyDirector* boss, TBranchProxy *parent, const char* membername, const char* top = nullptr, const char* name = nullptr); TBranchProxy(Internal::TBranchProxyDirector* boss, TBranch* branch, const char* membername); TBranchProxy(Internal::TBranchProxyDirector* boss, const char* branchname, TBranch* branch, const char* membername); virtual ~TBranchProxy(); TBranchProxy* GetProxy() { return this; } const char* GetBranchName() const { return fBranchName; } void Reset(); Bool_t Notify() { fRead = -1; return Setup(); } Bool_t Setup(); Bool_t IsInitialized() { return fInitialized; // return fLastTree && fCurrentTreeNumber == fDirector->GetTree()->GetTreeNumber() && fLastTree == fDirector->GetTree(); } Bool_t IsaPointer() const { return fIsaPointer; } Bool_t Read() { if (R__unlikely(fDirector == nullptr)) return false; auto treeEntry = fDirector->GetReadEntry(); if (treeEntry != fRead) { if (!IsInitialized()) { if (!Setup()) { ::Error("TBranchProxy::Read","%s",Form("Unable to initialize %s\n",fBranchName.Data())); return kFALSE; } } Bool_t result = kTRUE; if (fParent) { result = fParent->Read(); } else { if (fHasLeafCount) { if (fBranch != fLeafCount->GetBranch()) result &= (-1 != fLeafCount->GetBranch()->GetEntry(treeEntry)); } else if (fBranchCount) { result &= (-1 != fBranchCount->GetEntry(treeEntry)); } result &= (-1 != fBranch->GetEntry(treeEntry)); } fRead = treeEntry; if (R__unlikely(fCollection)) { fCollection->PopProxy(); // works even if no proxy env object was set. if (IsaPointer()) { fCollection->PushProxy( *(void**)fWhere ); } else { fCollection->PushProxy( fWhere ); } } return result; } else { return IsInitialized(); } } private: friend class ROOT::Internal::TTreeReaderValueBase; enum class EReadType { kDefault, kNoDirector, kReadParentNoCollection, kReadParentCollectionNoPointer, kReadParentCollectionPointer, kReadNoParentNoBranchCountCollectionPointer, kReadNoParentNoBranchCountCollectionNoPointer, kReadNoParentNoBranchCountNoCollection, kReadNoParentBranchCountCollectionPointer, kReadNoParentBranchCountCollectionNoPointer, kReadNoParentBranchCountNoCollection }; EReadType GetReadType() { if (fParent) { if (!fCollection) { return EReadType::kReadParentNoCollection; } else { if (IsaPointer()) { return EReadType::kReadParentCollectionPointer; } else { return EReadType::kReadParentCollectionNoPointer; } } } if (fHasLeafCount) { return EReadType::kDefault; } else { if (fBranchCount) { if (fCollection) { if (IsaPointer()) { return EReadType::kReadNoParentBranchCountCollectionPointer; } else { return EReadType::kReadNoParentBranchCountCollectionNoPointer; } } else { return EReadType::kReadNoParentBranchCountNoCollection; } } else { if (fCollection) { if (IsaPointer()) { return EReadType::kReadNoParentNoBranchCountCollectionPointer; } else { return EReadType::kReadNoParentNoBranchCountCollectionNoPointer; } } else { return EReadType::kReadNoParentNoBranchCountNoCollection; } } } return EReadType::kDefault; } Bool_t ReadNoDirector() { return false; } Bool_t ReadParentNoCollection() { auto treeEntry = fDirector->GetReadEntry(); if (treeEntry != fRead) { const Bool_t result = fParent->Read(); fRead = treeEntry; return result; } else { return IsInitialized(); } } Bool_t ReadParentCollectionNoPointer() { auto treeEntry = fDirector->GetReadEntry(); if (treeEntry != fRead) { const Bool_t result = fParent->Read(); fRead = treeEntry; fCollection->PopProxy(); // works even if no proxy env object was set. fCollection->PushProxy( fWhere ); return result; } else { return IsInitialized(); } } Bool_t ReadParentCollectionPointer() { auto treeEntry = fDirector->GetReadEntry(); if (treeEntry != fRead) { const Bool_t result = fParent->Read(); fRead = treeEntry; fCollection->PopProxy(); // works even if no proxy env object was set. fCollection->PushProxy( *(void**)fWhere ); return result; } else { return IsInitialized(); } } Bool_t ReadNoParentNoBranchCountCollectionPointer() { auto treeEntry = fDirector->GetReadEntry(); if (treeEntry != fRead) { Bool_t result = (-1 != fBranch->GetEntry(treeEntry)); fRead = treeEntry; fCollection->PopProxy(); // works even if no proxy env object was set. fCollection->PushProxy( *(void**)fWhere ); return result; } else { return IsInitialized(); } } Bool_t ReadNoParentNoBranchCountCollectionNoPointer() { auto treeEntry = fDirector->GetReadEntry(); if (treeEntry != fRead) { Bool_t result = (-1 != fBranch->GetEntry(treeEntry)); fRead = treeEntry; fCollection->PopProxy(); // works even if no proxy env object was set. fCollection->PushProxy( fWhere ); return result; } else { return IsInitialized(); } } Bool_t ReadNoParentNoBranchCountNoCollection() { auto treeEntry = fDirector->GetReadEntry(); if (treeEntry != fRead) { Bool_t result = (-1 != fBranch->GetEntry(treeEntry)); fRead = treeEntry; return result; } else { return IsInitialized(); } } Bool_t ReadNoParentBranchCountCollectionPointer() { auto treeEntry = fDirector->GetReadEntry(); if (treeEntry != fRead) { Bool_t result = (-1 != fBranchCount->GetEntry(treeEntry)); result &= (-1 != fBranch->GetEntry(treeEntry)); fRead = treeEntry; fCollection->PopProxy(); // works even if no proxy env object was set. fCollection->PushProxy( *(void**)fWhere ); return result; } else { return IsInitialized(); } } Bool_t ReadNoParentBranchCountCollectionNoPointer() { auto treeEntry = fDirector->GetReadEntry(); if (treeEntry != fRead) { Bool_t result = (-1 != fBranchCount->GetEntry(treeEntry)); result &= (-1 != fBranch->GetEntry(treeEntry)); fRead = treeEntry; fCollection->PopProxy(); // works even if no proxy env object was set. fCollection->PushProxy( fWhere ); return result; } else { return IsInitialized(); } } Bool_t ReadNoParentBranchCountNoCollection() { auto treeEntry = fDirector->GetReadEntry(); if (treeEntry != fRead) { Bool_t result = (-1 != fBranchCount->GetEntry(treeEntry)); result &= (-1 != fBranch->GetEntry(treeEntry)); fRead = treeEntry; return result; } else { return IsInitialized(); } } public: Bool_t ReadEntries() { if (R__unlikely(fDirector == nullptr)) return false; auto treeEntry = fDirector->GetReadEntry(); if (treeEntry != fRead) { if (!IsInitialized()) { if (!Setup()) { ::Error("TBranchProxy::ReadEntries","%s",Form("Unable to initialize %s\n",fBranchName.Data())); return false; } } if (fParent) fParent->ReadEntries(); else { if (fBranchCount) { fBranchCount->TBranch::GetEntry(treeEntry); } fBranch->TBranch::GetEntry(treeEntry); } // NO - we only read the entries, not the contained objects! // fRead = treeEntry; } return IsInitialized(); } virtual Int_t GetEntries() { if (!ReadEntries()) return 0; if (fHasLeafCount) { return *(Int_t*)fLeafCount->GetValuePointer(); } else if (fBranchCount) { return fBranchCount->GetNdata(); } else { return 1; } } virtual Int_t GetArrayLength() { return fArrayLength; } TClass *GetClass() { if (!fDirector) return nullptr; if (fDirector->GetReadEntry() != fRead) { if (!IsInitialized()) { if (!Setup()) { return nullptr; } } } return fClass; } void* GetWhere() const { return fWhere; } // intentionally non-virtual /// Return the address of the element number i. Returns `nullptr` for non-collections. It assumed that Setip() has /// been called. virtual void *GetAddressOfElement(UInt_t /*i*/) { return nullptr; } TVirtualCollectionProxy *GetCollection() { return fCollection; } // protected: virtual void *GetStart(UInt_t /*i*/=0) { // return the address of the start of the object being proxied. Assumes // that Setup() has been called. if (fParent) { fWhere = ((unsigned char*)fParent->GetStart()) + fMemberOffset; } if (IsaPointer()) { if (fWhere) return *(void**)fWhere; else return nullptr; } else { return fWhere; } } void *GetClaStart(UInt_t i=0) { // return the address of the start of the object being proxied. Assumes // that Setup() has been called. Assumes the object containing this data // member is held in TClonesArray. char *location; if (fIsClone) { TClonesArray *tca; tca = (TClonesArray*)GetStart(); if (!tca || tca->GetLast()<(Int_t)i) return nullptr; location = (char*)tca->At(i); return location; } else if (fParent) { //tcaloc = ((unsigned char*)fParent->GetStart()); location = (char*)fParent->GetClaStart(i); } else { void *tcaloc; tcaloc = fWhere; TClonesArray *tca; tca = (TClonesArray*)tcaloc; if (tca->GetLast()<(Int_t)i) return nullptr; location = (char*)tca->At(i); } if (location) location += fOffset; else return nullptr; if (IsaPointer()) { return *(void**)(location); } else { return location; } } void *GetStlStart(UInt_t i=0) { // return the address of the start of the object being proxied. Assumes // that Setup() has been called. Assumes the object containing this data // member is held in STL Collection. char *location = nullptr; if (fCollection) { if (fCollection->Size()At(i); // return location; } else if (fParent) { //tcaloc = ((unsigned char*)fParent->GetStart()); location = (char*)fParent->GetStlStart(i); } else { R__ASSERT(0); //void *tcaloc; //tcaloc = fWhere; //TClonesArray *tca; //tca = (TClonesArray*)tcaloc; //if (tca->GetLast()At(i); } if (location) location += fOffset; else return nullptr; if (IsaPointer()) { return *(void**)(location); } else { return location; } } Int_t GetOffset() { return fOffset; } }; } // namespace Detail #if defined(_MSC_VER) && !defined(__clang__) #pragma optimize("", on) #endif namespace Internal { //////////////////////////////////////////////////////////////////////////////// /// Concrete Implementation of the branch proxy around the data members which are array of char class TArrayCharProxy : public Detail::TBranchProxy { public: void Print() override { TBranchProxy::Print(); std::cout << "fWhere " << fWhere << std::endl; if (fWhere) std::cout << "value? " << *(unsigned char*)GetStart() << std::endl; } using TBranchProxy::TBranchProxy; TArrayCharProxy() = default; // work around bug in GCC < 7 ~TArrayCharProxy() override = default; void *GetAddressOfElement(UInt_t i) final { if (!Read()) return nullptr; unsigned char* str = (unsigned char*)GetStart(); return str + i; } unsigned char At(UInt_t i) { static unsigned char default_val = {}; if (unsigned char* elAddr = (unsigned char*)GetAddressOfElement(i)) { // should add out-of bound test return *elAddr; } return default_val; } unsigned char operator [](Int_t i) { return At(i); } unsigned char operator [](UInt_t i) { return At(i); } operator const char*() { if (!Read()) return ""; return (const char*)GetStart(); } const char* Data() { if (!Read()) return ""; return (const char*)GetStart(); } const char* c_str() { if (!Read()) return ""; return (const char*)GetStart(); } operator std::string() { if (!Read()) return ""; return std::string((const char*)GetStart()); } }; //////////////////////////////////////////////////////////////////////////////// /// Base class for the proxy around object in TClonesArray. class TClaProxy : public Detail::TBranchProxy { public: void Print() override { TBranchProxy::Print(); std::cout << "fWhere " << fWhere << std::endl; if (fWhere) { if (IsaPointer()) { std::cout << "location " << *(TClonesArray**)fWhere << std::endl; } else { std::cout << "location " << fWhere << std::endl; } } } using TBranchProxy::TBranchProxy; TClaProxy() = default; // work around bug in GCC < 7 ~TClaProxy() override = default; const TClonesArray* GetPtr() { if (!Read()) return nullptr; return (TClonesArray*)GetStart(); } Int_t GetEntries() override { if (!ReadEntries()) return 0; TClonesArray *arr = (TClonesArray*)GetStart(); if (arr) return arr->GetEntries(); return 0; } void *GetAddressOfElement(UInt_t i) final { if (!Read()) return nullptr; if (!fWhere) return nullptr; return GetClaStart(i); } const TClonesArray* operator->() { return GetPtr(); } }; //////////////////////////////////////////////////////////////////////////////// /// Base class for the proxy around STL containers. class TStlProxy : public Detail::TBranchProxy { public: void Print() override { TBranchProxy::Print(); std::cout << "fWhere " << fWhere << std::endl; if (fWhere) { if (IsaPointer()) { std::cout << "location " << *(TClonesArray**)fWhere << std::endl; } else { std::cout << "location " << fWhere << std::endl; } } } using TBranchProxy::TBranchProxy; TStlProxy() = default; // work around bug in GCC < 7 ~TStlProxy() override = default; TVirtualCollectionProxy* GetPtr() { if (!Read()) return nullptr; return GetCollection(); } Int_t GetEntries() override { if (!ReadEntries()) return 0; return GetPtr()->Size(); } void *GetAddressOfElement(UInt_t i) final { if (!Read()) return nullptr; if (!fWhere) return nullptr; return GetStlStart(i); } const TVirtualCollectionProxy* operator->() { return GetPtr(); } }; //////////////////////////////////////////////////////////////////////////////// /// Template of the proxy around objects. template class TImpProxy : public Detail::TBranchProxy { public: void Print() override { TBranchProxy::Print(); std::cout << "fWhere " << fWhere << std::endl; if (fWhere) std::cout << "value? " << *(T*)GetStart() << std::endl; } using TBranchProxy::TBranchProxy; TImpProxy() = default; // work around bug in GCC < 7 ~TImpProxy() override = default; operator T() { if (!Read()) return 0; return *(T*)GetStart(); } // For now explicitly disable copying into the value (i.e. the proxy is read-only). TImpProxy(T) = delete; TImpProxy &operator=(T) = delete; }; //////////////////////////////////////////////////////////////////////////////// /// Helper template to be able to determine and /// use array dimensions. template struct TArrayType { typedef T type_t; typedef T array_t[d]; static constexpr int gSize = d; }; //////////////////////////////////////////////////////////////////////////////// /// Helper class for proxy around multi dimension array template struct TArrayType { typedef T type_t; typedef T array_t; static constexpr int gSize = 0; }; //////////////////////////////////////////////////////////////////////////////// /// Helper class for proxy around multi dimension array template struct TMultiArrayType { typedef typename T::type_t type_t; typedef typename T::array_t array_t[d]; static constexpr int gSize = d; }; //////////////////////////////////////////////////////////////////////////////// /// Template for concrete implementation of proxy around array of T template class TArrayProxy : public Detail::TBranchProxy { public: using TBranchProxy::TBranchProxy; TArrayProxy() = default; // work around bug in GCC < 7 ~TArrayProxy() override = default; typedef typename T::array_t array_t; typedef typename T::type_t type_t; void Print() override { TBranchProxy::Print(); std::cout << "fWhere " << GetWhere() << std::endl; if (GetWhere()) std::cout << "value? " << *(type_t*)GetWhere() << std::endl; } Int_t GetEntries() override { return T::gSize; } void *GetAddressOfElement(UInt_t i) final { if (!Read()) return nullptr; if (array_t *arr = (array_t*)((type_t*)(GetStart()))) return &arr[i]; return nullptr; } const array_t &At(UInt_t i) { static array_t default_val; // should add out-of bound test if (array_t *arr = (array_t*)GetAddressOfElement(i)) return *arr; return default_val; } const array_t &operator [](Int_t i) { return At(i); } const array_t &operator [](UInt_t i) { return At(i); } }; //////////////////////////////////////////////////////////////////////////////// /// Template of the Concrete Implementation of the branch proxy around TClonesArray of T template class TClaImpProxy : public TClaProxy { public: // void Print() override { // TClaProxy::Print(); // } using TClaProxy::TClaProxy; TClaImpProxy() = default; // work around bug in GCC < 7 ~TClaImpProxy() override = default; const T& At(UInt_t i) { static T default_val; if (void* addr = GetAddressOfElement(i)) return *(T*)addr; return default_val; } const T& operator [](Int_t i) { return At(i); } const T& operator [](UInt_t i) { return At(i); } // For now explicitly disable copying into the value (i.e. the proxy is read-only). TClaImpProxy(T) = delete; TClaImpProxy &operator=(T) = delete; }; //////////////////////////////////////////////////////////////////////////////// /// Template of the Concrete Implementation of the branch proxy around an stl container of T template class TStlImpProxy : public TStlProxy { public: // void Print() override { // TBranchProxy::Print(); // } using TStlProxy::TStlProxy; TStlImpProxy() = default; // work around bug in GCC < 7 ~TStlImpProxy() override = default; const T& At(UInt_t i) { static T default_val; if (void* addr = GetAddressOfElement(i)) return *(T*)addr; return default_val; } const T& operator [](Int_t i) { return At(i); } const T& operator [](UInt_t i) { return At(i); } // For now explicitly disable copying into the value (i.e. the proxy is read-only). TStlImpProxy(T) = delete; TStlImpProxy &operator=(T) = delete; }; //////////////////////////////////////////////////////////////////////////////// /// Template of the Concrete Implementation of the branch proxy around an TClonesArray of array of T template class TClaArrayProxy : public TClaProxy { public: typedef typename T::array_t array_t; typedef typename T::type_t type_t; // void Print() override { // TClaProxy::Print(); // } using TClaProxy::TClaProxy; TClaArrayProxy() = default; // work around bug in GCC < 7 ~TClaArrayProxy() override = default; /* const */ array_t *At(UInt_t i) { static array_t default_val; if (array_t* ptr = (array_t*)GetAddressOfElement(i)) return ptr; // no de-ref! return &default_val; } /* const */ array_t *operator [](Int_t i) { return At(i); } /* const */ array_t *operator [](UInt_t i) { return At(i); } }; //////////////////////////////////////////////////////////////////////////////// /// Template of the Concrete Implementation of the branch proxy around an stl container of array of T template class TStlArrayProxy : public TStlProxy { public: typedef typename T::array_t array_t; typedef typename T::type_t type_t; // void Print() override { // TBranchProxy::Print(); // } using TStlProxy::TStlProxy; TStlArrayProxy() = default; // work around bug in GCC < 7 ~TStlArrayProxy() override = default; /* const */ array_t *At(UInt_t i) { static array_t default_val; if (array_t* ptr = (array_t*)GetAddressOfElement(i)) return ptr; // no de-ref! return &default_val; } /* const */ array_t *operator [](Int_t i) { return At(i); } /* const */ array_t *operator [](UInt_t i) { return At(i); } }; //TImpProxy d; typedef TImpProxy TDoubleProxy; // Concrete Implementation of the branch proxy around the data members which are double typedef TImpProxy TDouble32Proxy; // Concrete Implementation of the branch proxy around the data members which are double32 typedef TImpProxy TFloatProxy; // Concrete Implementation of the branch proxy around the data members which are float typedef TImpProxy TFloat16Proxy; // Concrete Implementation of the branch proxy around the data members which are float16 typedef TImpProxy TUIntProxy; // Concrete Implementation of the branch proxy around the data members which are unsigned int typedef TImpProxy TULongProxy; // Concrete Implementation of the branch proxy around the data members which are unsigned long typedef TImpProxy TULong64Proxy; // Concrete Implementation of the branch proxy around the data members which are unsigned long long typedef TImpProxy TUShortProxy; // Concrete Implementation of the branch proxy around the data members which are unsigned short typedef TImpProxy TUCharProxy; // Concrete Implementation of the branch proxy around the data members which are unsigned char typedef TImpProxy TIntProxy; // Concrete Implementation of the branch proxy around the data members which are int typedef TImpProxy TLongProxy; // Concrete Implementation of the branch proxy around the data members which are long typedef TImpProxy TLong64Proxy; // Concrete Implementation of the branch proxy around the data members which are long long typedef TImpProxy TShortProxy; // Concrete Implementation of the branch proxy around the data members which are short typedef TImpProxy TCharProxy; // Concrete Implementation of the branch proxy around the data members which are char typedef TImpProxy TBoolProxy; // Concrete Implementation of the branch proxy around the data members which are bool typedef TArrayProxy > TArrayDoubleProxy; // Concrete Implementation of the branch proxy around the data members which are array of double typedef TArrayProxy > TArrayDouble32Proxy; // Concrete Implementation of the branch proxy around the data members which are array of double32 typedef TArrayProxy > TArrayFloatProxy; // Concrete Implementation of the branch proxy around the data members which are array of float typedef TArrayProxy > TArrayFloat16Proxy; // Concrete Implementation of the branch proxy around the data members which are array of float16 typedef TArrayProxy > TArrayUIntProxy; // Concrete Implementation of the branch proxy around the data members which are array of unsigned int typedef TArrayProxy > TArrayULongProxy; // Concrete Implementation of the branch proxy around the data members which are array of unsigned long typedef TArrayProxy > TArrayULong64Proxy; // Concrete Implementation of the branch proxy around the data members which are array of unsigned long long typedef TArrayProxy > TArrayUShortProxy; // Concrete Implementation of the branch proxy around the data members which are array of unsigned short typedef TArrayProxy > TArrayUCharProxy; // Concrete Implementation of the branch proxy around the data members which are array of unsigned char typedef TArrayProxy > TArrayIntProxy; // Concrete Implementation of the branch proxy around the data members which are array of int typedef TArrayProxy > TArrayLongProxy; // Concrete Implementation of the branch proxy around the data members which are array of long typedef TArrayProxy > TArrayLong64Proxy; // Concrete Implementation of the branch proxy around the data members which are array of long long typedef TArrayProxy > TArrayShortProxy; // Concrete Implementation of the branch proxy around the data members which are array of short //specialized ! typedef TArrayProxy > TArrayCharProxy; // Concrete Implementation of the branch proxy around the data members which are array of char typedef TArrayProxy > TArrayBoolProxy; // Concrete Implementation of the branch proxy around the data members which are array of bool typedef TClaImpProxy TClaDoubleProxy; // Concrete Implementation of the branch proxy around the data members of object in TClonesArray which are double typedef TClaImpProxy TClaDouble32Proxy; // Concrete Implementation of the branch proxy around the data members of object in TClonesArray which are double32 typedef TClaImpProxy TClaFloatProxy; // Concrete Implementation of the branch proxy around the data members of object in TClonesArray which are float typedef TClaImpProxy TClaFloat16Proxy; // Concrete Implementation of the branch proxy around the data members of object in TClonesArray which are float16 typedef TClaImpProxy TClaUIntProxy; // Concrete Implementation of the branch proxy around the data members of object in TClonesArray which are unsigned int typedef TClaImpProxy TClaULongProxy; // Concrete Implementation of the branch proxy around the data members of object in TClonesArray which are unsigned long typedef TClaImpProxy TClaULong64Proxy; // Concrete Implementation of the branch proxy around the data members of object in TClonesArray which are unsigned long long typedef TClaImpProxy TClaUShortProxy; // Concrete Implementation of the branch proxy around the data members of object in TClonesArray which are unsigned short typedef TClaImpProxy TClaUCharProxy; // Concrete Implementation of the branch proxy around the data members of object in TClonesArray which are unsigned char typedef TClaImpProxy TClaIntProxy; // Concrete Implementation of the branch proxy around the data members of object in TClonesArray which are int typedef TClaImpProxy TClaLongProxy; // Concrete Implementation of the branch proxy around the data members of object in TClonesArray which are long typedef TClaImpProxy TClaLong64Proxy; // Concrete Implementation of the branch proxy around the data members of object in TClonesArray which are long long typedef TClaImpProxy TClaShortProxy; // Concrete Implementation of the branch proxy around the data members of object in TClonesArray which are short typedef TClaImpProxy TClaCharProxy; // Concrete Implementation of the branch proxy around the data members of object in TClonesArray which are char typedef TClaImpProxy TClaBoolProxy; // Concrete Implementation of the branch proxy around the data members of object in TClonesArray which are bool typedef TClaArrayProxy > TClaArrayDoubleProxy; // Concrete Implementation of the branch proxy around the data members of object in TClonesArray which are array of double typedef TClaArrayProxy > TClaArrayDouble32Proxy; // Concrete Implementation of the branch proxy around the data members of object in TClonesArray which are array of double32 typedef TClaArrayProxy > TClaArrayFloatProxy; // Concrete Implementation of the branch proxy around the data members of object in TClonesArray which are array of float typedef TClaArrayProxy > TClaArrayFloat16Proxy; // Concrete Implementation of the branch proxy around the data members of object in TClonesArray which are array of float16 typedef TClaArrayProxy > TClaArrayUIntProxy; // Concrete Implementation of the branch proxy around the data members of object in TClonesArray which are array of unsigned int typedef TClaArrayProxy > TClaArrayULongProxy; // Concrete Implementation of the branch proxy around the data members of object in TClonesArray which are array of unsigned long typedef TClaArrayProxy > TClaArrayULong64Proxy; // Concrete Implementation of the branch proxy around the data members of object in TClonesArray which are array of unsigned long long typedef TClaArrayProxy > TClaArrayUShortProxy; // Concrete Implementation of the branch proxy around the data members of object in TClonesArray which are array of unsigned short typedef TClaArrayProxy > TClaArrayUCharProxy; // Concrete Implementation of the branch proxy around the data members of object in TClonesArray which are array of unsigned char typedef TClaArrayProxy > TClaArrayIntProxy; // Concrete Implementation of the branch proxy around the data members of object in TClonesArray which are array of int typedef TClaArrayProxy > TClaArrayLongProxy; // Concrete Implementation of the branch proxy around the data members of object in TClonesArray which are array of long typedef TClaArrayProxy > TClaArrayLong64Proxy; // Concrete Implementation of the branch proxy around the data members of object in TClonesArray which are array of long long typedef TClaArrayProxy > TClaArrayShortProxy; // Concrete Implementation of the branch proxy around the data members of object in TClonesArray which are array of short typedef TClaArrayProxy > TClaArrayCharProxy; // Concrete Implementation of the branch proxy around the data members of object in TClonesArray which are array of char typedef TClaArrayProxy > TClaArrayBoolProxy; // Concrete Implementation of the branch proxy around the data members of object in TClonesArray which are array of bool //specialized ! typedef TClaArrayProxy > TClaArrayCharProxy; typedef TStlImpProxy TStlDoubleProxy; // Concrete Implementation of the branch proxy around an stl container of double typedef TStlImpProxy TStlDouble32Proxy; // Concrete Implementation of the branch proxy around an stl container of double32 typedef TStlImpProxy TStlFloatProxy; // Concrete Implementation of the branch proxy around an stl container of float typedef TStlImpProxy TStlFloat16Proxy; // Concrete Implementation of the branch proxy around an stl container of float16_t typedef TStlImpProxy TStlUIntProxy; // Concrete Implementation of the branch proxy around an stl container of unsigned int typedef TStlImpProxy TStlULongProxy; // Concrete Implementation of the branch proxy around an stl container of unsigned long typedef TStlImpProxy TStlULong64Proxy; // Concrete Implementation of the branch proxy around an stl container of unsigned long long typedef TStlImpProxy TStlUShortProxy; // Concrete Implementation of the branch proxy around an stl container of unsigned short typedef TStlImpProxy TStlUCharProxy; // Concrete Implementation of the branch proxy around an stl container of unsigned char typedef TStlImpProxy TStlIntProxy; // Concrete Implementation of the branch proxy around an stl container of int typedef TStlImpProxy TStlLongProxy; // Concrete Implementation of the branch proxy around an stl container of long typedef TStlImpProxy TStlLong64Proxy; // Concrete Implementation of the branch proxy around an stl container of long long typedef TStlImpProxy TStlShortProxy; // Concrete Implementation of the branch proxy around an stl container of short typedef TStlImpProxy TStlCharProxy; // Concrete Implementation of the branch proxy around an stl container of char typedef TStlImpProxy TStlBoolProxy; // Concrete Implementation of the branch proxy around an stl container of bool typedef TStlArrayProxy > TStlArrayDoubleProxy; // Concrete Implementation of the branch proxy around an stl container of double typedef TStlArrayProxy > TStlArrayDouble32Proxy; // Concrete Implementation of the branch proxy around an stl container of double32 typedef TStlArrayProxy > TStlArrayFloatProxy; // Concrete Implementation of the branch proxy around an stl container of float typedef TStlArrayProxy > TStlArrayFloat16Proxy; // Concrete Implementation of the branch proxy around an stl container of float16_t typedef TStlArrayProxy > TStlArrayUIntProxy; // Concrete Implementation of the branch proxy around an stl container of unsigned int typedef TStlArrayProxy > TStlArrayULongProxy; // Concrete Implementation of the branch proxy around an stl container of unsigned long typedef TStlArrayProxy > TStlArrayULong64Proxy; // Concrete Implementation of the branch proxy around an stl contained of unsigned long long typedef TStlArrayProxy > TStlArrayUShortProxy; // Concrete Implementation of the branch proxy around an stl container of unsigned short typedef TStlArrayProxy > TStlArrayUCharProxy; // Concrete Implementation of the branch proxy around an stl container of unsigned char typedef TStlArrayProxy > TStlArrayIntProxy; // Concrete Implementation of the branch proxy around an stl container of int typedef TStlArrayProxy > TStlArrayLongProxy; // Concrete Implementation of the branch proxy around an stl container of long typedef TStlArrayProxy > TStlArrayLong64Proxy; // Concrete Implementation of the branch proxy around an stl container of long long typedef TStlArrayProxy > TStlArrayShortProxy; // Concrete Implementation of the branch proxy around an stl container of UShort_t typedef TStlArrayProxy > TStlArrayCharProxy; // Concrete Implementation of the branch proxy around an stl container of char typedef TStlArrayProxy > TStlArrayBoolProxy; // Concrete Implementation of the branch proxy around an stl container of bool } // namespace Internal // Reasonably backward compatible. using Detail::TBranchProxy; } // namespace ROOT #endif