12 #ifndef ROOT_TBranchProxy
13 #define ROOT_TBranchProxy
30 class TStreamerElement;
48 class TBranchProxyHelper {
51 TBranchProxyHelper(
const char *left,
const char *right = 0) :
55 if (left[0]&&right && fName[fName.Length()-1]!=
'.') fName +=
".";
61 operator const char*() {
return fName.Data(); };
64 class TTreeReaderValueBase;
71 Internal::TBranchProxyDirector *fDirector;
73 Bool_t fInitialized : 1;
74 const Bool_t fIsMember : 1;
76 Bool_t fIsaPointer : 1;
77 Bool_t fHasLeafCount : 1;
79 const TString fBranchName;
80 TBranchProxy *fParent;
82 const TString fDataMember;
87 TStreamerElement *fElement;
94 TBranch *fBranchCount;
98 TNotifyLink<TBranchProxy> fNotify;
103 TVirtualCollectionProxy *fCollection;
106 virtual void Print();
109 TBranchProxy(Internal::TBranchProxyDirector* boss,
const char* top,
const char* name = 0);
110 TBranchProxy(Internal::TBranchProxyDirector* boss,
const char *top,
const char *name,
const char *membername);
111 TBranchProxy(Internal::TBranchProxyDirector* boss, TBranchProxy *parent,
const char* membername,
const char* top = 0,
const char* name = 0);
112 TBranchProxy(Internal::TBranchProxyDirector* boss, TBranch* branch,
const char* membername);
113 TBranchProxy(Internal::TBranchProxyDirector* boss,
const char* branchname, TBranch* branch,
const char* membername);
114 virtual ~TBranchProxy();
116 TBranchProxy* GetProxy() {
return this; }
117 const char* GetBranchName()
const {
return fBranchName; }
128 Bool_t IsInitialized() {
133 Bool_t IsaPointer()
const {
138 if (R__unlikely(fDirector==0))
return false;
140 auto treeEntry = fDirector->GetReadEntry();
141 if (treeEntry != fRead) {
142 if (!IsInitialized()) {
144 ::Error(
"TBranchProxy::Read",
"%s",Form(
"Unable to initialize %s\n",fBranchName.Data()));
148 Bool_t result = kTRUE;
150 result = fParent->Read();
153 result &= (-1 != fBranchCount->GetEntry(treeEntry));
155 result &= (-1 != fBranch->GetEntry(treeEntry));
158 if (R__unlikely(fCollection)) {
159 fCollection->PopProxy();
161 fCollection->PushProxy( *(
void**)fWhere );
163 fCollection->PushProxy( fWhere );
168 return IsInitialized();
173 friend class ROOT::Internal::TTreeReaderValueBase;
175 enum class EReadType {
178 kReadParentNoCollection,
179 kReadParentCollectionNoPointer,
180 kReadParentCollectionPointer,
181 kReadNoParentNoBranchCountCollectionPointer,
182 kReadNoParentNoBranchCountCollectionNoPointer,
183 kReadNoParentNoBranchCountNoCollection,
184 kReadNoParentBranchCountCollectionPointer,
185 kReadNoParentBranchCountCollectionNoPointer,
186 kReadNoParentBranchCountNoCollection
189 EReadType GetReadType() {
192 return EReadType::kReadParentNoCollection;
195 return EReadType::kReadParentCollectionPointer;
197 return EReadType::kReadParentCollectionNoPointer;
204 return EReadType::kReadNoParentBranchCountCollectionPointer;
206 return EReadType::kReadNoParentBranchCountCollectionNoPointer;
209 return EReadType::kReadNoParentBranchCountNoCollection;
215 return EReadType::kReadNoParentNoBranchCountCollectionPointer;
217 return EReadType::kReadNoParentNoBranchCountCollectionNoPointer;
220 return EReadType::kReadNoParentNoBranchCountNoCollection;
224 return EReadType::kDefault;
227 Bool_t ReadNoDirector() {
231 Bool_t ReadParentNoCollection() {
232 auto treeEntry = fDirector->GetReadEntry();
233 if (treeEntry != fRead) {
234 const Bool_t result = fParent->Read();
238 return IsInitialized();
242 Bool_t ReadParentCollectionNoPointer() {
243 auto treeEntry = fDirector->GetReadEntry();
244 if (treeEntry != fRead) {
245 const Bool_t result = fParent->Read();
247 fCollection->PopProxy();
248 fCollection->PushProxy( fWhere );
251 return IsInitialized();
255 Bool_t ReadParentCollectionPointer() {
256 auto treeEntry = fDirector->GetReadEntry();
257 if (treeEntry != fRead) {
258 const Bool_t result = fParent->Read();
260 fCollection->PopProxy();
261 fCollection->PushProxy( *(
void**)fWhere );
264 return IsInitialized();
268 Bool_t ReadNoParentNoBranchCountCollectionPointer() {
269 auto treeEntry = fDirector->GetReadEntry();
270 if (treeEntry != fRead) {
271 Bool_t result = (-1 != fBranch->GetEntry(treeEntry));
273 fCollection->PopProxy();
274 fCollection->PushProxy( *(
void**)fWhere );
277 return IsInitialized();
281 Bool_t ReadNoParentNoBranchCountCollectionNoPointer() {
282 auto treeEntry = fDirector->GetReadEntry();
283 if (treeEntry != fRead) {
284 Bool_t result = (-1 != fBranch->GetEntry(treeEntry));
286 fCollection->PopProxy();
287 fCollection->PushProxy( fWhere );
290 return IsInitialized();
294 Bool_t ReadNoParentNoBranchCountNoCollection() {
295 auto treeEntry = fDirector->GetReadEntry();
296 if (treeEntry != fRead) {
297 Bool_t result = (-1 != fBranch->GetEntry(treeEntry));
301 return IsInitialized();
305 Bool_t ReadNoParentBranchCountCollectionPointer() {
306 auto treeEntry = fDirector->GetReadEntry();
307 if (treeEntry != fRead) {
308 Bool_t result = (-1 != fBranchCount->GetEntry(treeEntry));
309 result &= (-1 != fBranch->GetEntry(treeEntry));
311 fCollection->PopProxy();
312 fCollection->PushProxy( *(
void**)fWhere );
315 return IsInitialized();
319 Bool_t ReadNoParentBranchCountCollectionNoPointer() {
320 auto treeEntry = fDirector->GetReadEntry();
321 if (treeEntry != fRead) {
322 Bool_t result = (-1 != fBranchCount->GetEntry(treeEntry));
323 result &= (-1 != fBranch->GetEntry(treeEntry));
325 fCollection->PopProxy();
326 fCollection->PushProxy( fWhere );
329 return IsInitialized();
333 Bool_t ReadNoParentBranchCountNoCollection() {
334 auto treeEntry = fDirector->GetReadEntry();
335 if (treeEntry != fRead) {
336 Bool_t result = (-1 != fBranchCount->GetEntry(treeEntry));
337 result &= (-1 != fBranch->GetEntry(treeEntry));
341 return IsInitialized();
347 Bool_t ReadEntries() {
348 if (R__unlikely(fDirector==0))
return false;
350 auto treeEntry = fDirector->GetReadEntry();
351 if (treeEntry != fRead) {
352 if (!IsInitialized()) {
354 ::Error(
"TBranchProxy::ReadEntries",
"%s",Form(
"Unable to initialize %s\n",fBranchName.Data()));
358 if (fParent) fParent->ReadEntries();
361 fBranchCount->TBranch::GetEntry(treeEntry);
363 fBranch->TBranch::GetEntry(treeEntry);
368 return IsInitialized();
371 virtual Int_t GetEntries() {
372 if (!ReadEntries())
return 0;
373 if (!fHasLeafCount) {
374 return *(Int_t*)fLeafCount->GetValuePointer();
380 virtual Int_t GetArrayLength() {
385 if (fDirector==0)
return 0;
387 if (fDirector->GetReadEntry() != fRead) {
388 if (!IsInitialized()) {
397 void* GetWhere()
const {
return fWhere; }
401 virtual void *GetAddressOfElement(UInt_t ) {
405 TVirtualCollectionProxy *GetCollection() {
return fCollection; }
408 virtual void *GetStart(UInt_t =0) {
413 fWhere = ((
unsigned char*)fParent->GetStart()) + fMemberOffset;
416 if (fWhere)
return *(
void**)fWhere;
423 void *GetClaStart(UInt_t i=0) {
433 tca = (TClonesArray*)GetStart();
435 if (!tca || tca->GetLast()<(Int_t)i)
return 0;
437 location = (
char*)tca->At(i);
441 }
else if (fParent) {
444 location = (
char*)fParent->GetClaStart(i);
451 tca = (TClonesArray*)tcaloc;
453 if (tca->GetLast()<(Int_t)i)
return 0;
455 location = (
char*)tca->At(i);
458 if (location) location += fOffset;
462 return *(
void**)(location);
469 void *GetStlStart(UInt_t i=0) {
478 if (fCollection->Size()<i)
return 0;
480 location = (
char*)fCollection->At(i);
484 }
else if (fParent) {
487 location = (
char*)fParent->GetStlStart(i);
502 if (location) location += fOffset;
506 return *(
void**)(location);
513 Int_t GetOffset() {
return fOffset; }
521 class TArrayCharProxy :
public Detail::TBranchProxy {
523 void Print()
override {
524 TBranchProxy::Print();
525 std::cout <<
"fWhere " << fWhere << std::endl;
526 if (fWhere) std::cout <<
"value? " << *(
unsigned char*)GetStart() << std::endl;
529 using TBranchProxy::TBranchProxy;
530 TArrayCharProxy() =
default;
531 ~TArrayCharProxy()
override =
default;
533 void *GetAddressOfElement(UInt_t i)
final {
534 if (!Read())
return nullptr;
535 unsigned char* str = (
unsigned char*)GetStart();
539 unsigned char At(UInt_t i) {
540 static unsigned char default_val = {};
541 if (
unsigned char* elAddr = (
unsigned char*)GetAddressOfElement(i)) {
548 unsigned char operator [](Int_t i) {
552 unsigned char operator [](UInt_t i) {
556 operator const char*() {
557 if (!Read())
return "";
558 return (
const char*)GetStart();
562 if (!Read())
return "";
563 return (
const char*)GetStart();
566 const char* c_str() {
567 if (!Read())
return "";
568 return (
const char*)GetStart();
571 operator std::string() {
572 if (!Read())
return "";
573 return std::string((
const char*)GetStart());
580 class TClaProxy :
public Detail::TBranchProxy {
582 void Print()
override {
583 TBranchProxy::Print();
584 std::cout <<
"fWhere " << fWhere << std::endl;
587 std::cout <<
"location " << *(TClonesArray**)fWhere << std::endl;
589 std::cout <<
"location " << fWhere << std::endl;
594 using TBranchProxy::TBranchProxy;
595 TClaProxy() =
default;
596 ~TClaProxy()
override =
default;
598 const TClonesArray* GetPtr() {
599 if (!Read())
return 0;
600 return (TClonesArray*)GetStart();
603 Int_t GetEntries()
override {
604 if (!ReadEntries())
return 0;
605 TClonesArray *arr = (TClonesArray*)GetStart();
606 if (arr)
return arr->GetEntries();
610 void *GetAddressOfElement(UInt_t i)
final {
611 if (!Read())
return nullptr;
612 if (fWhere==0)
return nullptr;
613 return GetClaStart(i);
616 const TClonesArray* operator->() {
return GetPtr(); }
622 class TStlProxy :
public Detail::TBranchProxy {
624 void Print()
override {
625 TBranchProxy::Print();
626 std::cout <<
"fWhere " << fWhere << std::endl;
629 std::cout <<
"location " << *(TClonesArray**)fWhere << std::endl;
631 std::cout <<
"location " << fWhere << std::endl;
636 using TBranchProxy::TBranchProxy;
637 TStlProxy() =
default;
638 ~TStlProxy()
override =
default;
640 const TVirtualCollectionProxy* GetPtr() {
641 if (!Read())
return 0;
642 return GetCollection();
645 Int_t GetEntries()
override {
646 if (!ReadEntries())
return 0;
647 return GetPtr()->Size();
650 void *GetAddressOfElement(UInt_t i)
final {
651 if (!Read())
return nullptr;
652 if (fWhere==0)
return nullptr;
653 return GetStlStart(i);
656 const TVirtualCollectionProxy* operator->() {
return GetPtr(); }
663 class TImpProxy :
public Detail::TBranchProxy {
665 void Print()
override {
666 TBranchProxy::Print();
667 std::cout <<
"fWhere " << fWhere << std::endl;
668 if (fWhere) std::cout <<
"value? " << *(T*)GetStart() << std::endl;
671 using TBranchProxy::TBranchProxy;
672 TImpProxy() =
default;
673 ~TImpProxy()
override =
default;
676 if (!Read())
return 0;
677 return *(T*)GetStart();
681 TImpProxy(T) =
delete;
682 TImpProxy &operator=(T) =
delete;
689 template <
class T,
int d = 0>
struct TArrayType {
691 typedef T array_t[d];
692 static constexpr
int gSize = d;
696 template <
class T>
struct TArrayType<T,0> {
699 static constexpr
int gSize = 0;
703 template <
class T,
int d>
struct TMultiArrayType {
704 typedef typename T::type_t type_t;
705 typedef typename T::array_t array_t[d];
706 static constexpr
int gSize = d;
712 class TArrayProxy :
public Detail::TBranchProxy {
714 using TBranchProxy::TBranchProxy;
715 TArrayProxy() =
default;
716 ~TArrayProxy()
override =
default;
718 typedef typename T::array_t array_t;
719 typedef typename T::type_t type_t;
721 void Print()
override {
722 TBranchProxy::Print();
723 std::cout <<
"fWhere " << GetWhere() << std::endl;
724 if (GetWhere()) std::cout <<
"value? " << *(type_t*)GetWhere() << std::endl;
727 Int_t GetEntries()
override {
731 void *GetAddressOfElement(UInt_t i)
final {
732 if (!Read())
return nullptr;
733 if (array_t *arr = (array_t*)((type_t*)(GetStart())))
738 const array_t &At(UInt_t i) {
739 static array_t default_val;
741 if (array_t *arr = (array_t*)GetAddressOfElement(i))
746 const array_t &operator [](Int_t i) {
return At(i); }
747 const array_t &operator [](UInt_t i) {
return At(i); }
753 class TClaImpProxy :
public TClaProxy {
760 using TClaProxy::TClaProxy;
761 TClaImpProxy() =
default;
762 ~TClaImpProxy()
override =
default;
764 const T& At(UInt_t i) {
765 static T default_val;
766 if (
void* addr = GetAddressOfElement(i))
771 const T& operator [](Int_t i) {
return At(i); }
772 const T& operator [](UInt_t i) {
return At(i); }
775 TClaImpProxy(T) =
delete;
776 TClaImpProxy &operator=(T) =
delete;
783 class TStlImpProxy :
public TStlProxy {
790 using TStlProxy::TStlProxy;
791 TStlImpProxy() =
default;
792 ~TStlImpProxy()
override =
default;
794 const T& At(UInt_t i) {
795 static T default_val;
796 if (
void* addr = GetAddressOfElement(i))
801 const T& operator [](Int_t i) {
return At(i); }
802 const T& operator [](UInt_t i) {
return At(i); }
805 TStlImpProxy(T) =
delete;
806 TStlImpProxy &operator=(T) =
delete;
813 class TClaArrayProxy :
public TClaProxy {
815 typedef typename T::array_t array_t;
816 typedef typename T::type_t type_t;
822 using TClaProxy::TClaProxy;
823 TClaArrayProxy() =
default;
824 ~TClaArrayProxy()
override =
default;
826 array_t *At(UInt_t i) {
827 static array_t default_val;
828 if (array_t* ptr = (array_t*)GetAddressOfElement(i))
834 array_t *operator [](Int_t i) {
return At(i); }
835 array_t *operator [](UInt_t i) {
return At(i); }
842 class TStlArrayProxy :
public TStlProxy {
844 typedef typename T::array_t array_t;
845 typedef typename T::type_t type_t;
851 using TStlProxy::TStlProxy;
852 TStlArrayProxy() =
default;
853 ~TStlArrayProxy()
override =
default;
855 array_t *At(UInt_t i) {
856 static array_t default_val;
857 if (array_t* ptr = (array_t*)GetAddressOfElement(i))
862 array_t *operator [](Int_t i) {
return At(i); }
863 array_t *operator [](UInt_t i) {
return At(i); }
867 typedef TImpProxy<Double_t> TDoubleProxy;
868 typedef TImpProxy<Double32_t> TDouble32Proxy;
869 typedef TImpProxy<Float_t> TFloatProxy;
870 typedef TImpProxy<Float16_t> TFloat16Proxy;
871 typedef TImpProxy<UInt_t> TUIntProxy;
872 typedef TImpProxy<ULong_t> TULongProxy;
873 typedef TImpProxy<ULong64_t> TULong64Proxy;
874 typedef TImpProxy<UShort_t> TUShortProxy;
875 typedef TImpProxy<UChar_t> TUCharProxy;
876 typedef TImpProxy<Int_t> TIntProxy;
877 typedef TImpProxy<Long_t> TLongProxy;
878 typedef TImpProxy<Long64_t> TLong64Proxy;
879 typedef TImpProxy<Short_t> TShortProxy;
880 typedef TImpProxy<Char_t> TCharProxy;
881 typedef TImpProxy<Bool_t> TBoolProxy;
883 typedef TArrayProxy<TArrayType<Double_t> > TArrayDoubleProxy;
884 typedef TArrayProxy<TArrayType<Double32_t> > TArrayDouble32Proxy;
885 typedef TArrayProxy<TArrayType<Float_t> > TArrayFloatProxy;
886 typedef TArrayProxy<TArrayType<Float16_t> > TArrayFloat16Proxy;
887 typedef TArrayProxy<TArrayType<UInt_t> > TArrayUIntProxy;
888 typedef TArrayProxy<TArrayType<ULong_t> > TArrayULongProxy;
889 typedef TArrayProxy<TArrayType<ULong64_t> > TArrayULong64Proxy;
890 typedef TArrayProxy<TArrayType<UShort_t> > TArrayUShortProxy;
891 typedef TArrayProxy<TArrayType<UChar_t> > TArrayUCharProxy;
892 typedef TArrayProxy<TArrayType<Int_t> > TArrayIntProxy;
893 typedef TArrayProxy<TArrayType<Long_t> > TArrayLongProxy;
894 typedef TArrayProxy<TArrayType<Long64_t> > TArrayLong64Proxy;
895 typedef TArrayProxy<TArrayType<UShort_t> > TArrayShortProxy;
897 typedef TArrayProxy<TArrayType<Bool_t> > TArrayBoolProxy;
899 typedef TClaImpProxy<Double_t> TClaDoubleProxy;
900 typedef TClaImpProxy<Double32_t> TClaDouble32Proxy;
901 typedef TClaImpProxy<Float_t> TClaFloatProxy;
902 typedef TClaImpProxy<Float16_t> TClaFloat16Proxy;
903 typedef TClaImpProxy<UInt_t> TClaUIntProxy;
904 typedef TClaImpProxy<ULong_t> TClaULongProxy;
905 typedef TClaImpProxy<ULong64_t> TClaULong64Proxy;
906 typedef TClaImpProxy<UShort_t> TClaUShortProxy;
907 typedef TClaImpProxy<UChar_t> TClaUCharProxy;
908 typedef TClaImpProxy<Int_t> TClaIntProxy;
909 typedef TClaImpProxy<Long_t> TClaLongProxy;
910 typedef TClaImpProxy<Long64_t> TClaLong64Proxy;
911 typedef TClaImpProxy<Short_t> TClaShortProxy;
912 typedef TClaImpProxy<Char_t> TClaCharProxy;
913 typedef TClaImpProxy<Bool_t> TClaBoolProxy;
915 typedef TClaArrayProxy<TArrayType<Double_t> > TClaArrayDoubleProxy;
916 typedef TClaArrayProxy<TArrayType<Double32_t> > TClaArrayDouble32Proxy;
917 typedef TClaArrayProxy<TArrayType<Float_t> > TClaArrayFloatProxy;
918 typedef TClaArrayProxy<TArrayType<Float16_t> > TClaArrayFloat16Proxy;
919 typedef TClaArrayProxy<TArrayType<UInt_t> > TClaArrayUIntProxy;
920 typedef TClaArrayProxy<TArrayType<ULong_t> > TClaArrayULongProxy;
921 typedef TClaArrayProxy<TArrayType<ULong64_t> > TClaArrayULong64Proxy;
922 typedef TClaArrayProxy<TArrayType<UShort_t> > TClaArrayUShortProxy;
923 typedef TClaArrayProxy<TArrayType<UChar_t> > TClaArrayUCharProxy;
924 typedef TClaArrayProxy<TArrayType<Int_t> > TClaArrayIntProxy;
925 typedef TClaArrayProxy<TArrayType<Long_t> > TClaArrayLongProxy;
926 typedef TClaArrayProxy<TArrayType<Long64_t> > TClaArrayLong64Proxy;
927 typedef TClaArrayProxy<TArrayType<UShort_t> > TClaArrayShortProxy;
928 typedef TClaArrayProxy<TArrayType<Char_t> > TClaArrayCharProxy;
929 typedef TClaArrayProxy<TArrayType<Bool_t> > TClaArrayBoolProxy;
932 typedef TStlImpProxy<Double_t> TStlDoubleProxy;
933 typedef TStlImpProxy<Double32_t> TStlDouble32Proxy;
934 typedef TStlImpProxy<Float_t> TStlFloatProxy;
935 typedef TStlImpProxy<Float16_t> TStlFloat16Proxy;
936 typedef TStlImpProxy<UInt_t> TStlUIntProxy;
937 typedef TStlImpProxy<ULong_t> TStlULongProxy;
938 typedef TStlImpProxy<ULong64_t> TStlULong64Proxy;
939 typedef TStlImpProxy<UShort_t> TStlUShortProxy;
940 typedef TStlImpProxy<UChar_t> TStlUCharProxy;
941 typedef TStlImpProxy<Int_t> TStlIntProxy;
942 typedef TStlImpProxy<Long_t> TStlLongProxy;
943 typedef TStlImpProxy<Long64_t> TStlLong64Proxy;
944 typedef TStlImpProxy<Short_t> TStlShortProxy;
945 typedef TStlImpProxy<Char_t> TStlCharProxy;
946 typedef TStlImpProxy<Bool_t> TStlBoolProxy;
948 typedef TStlArrayProxy<TArrayType<Double_t> > TStlArrayDoubleProxy;
949 typedef TStlArrayProxy<TArrayType<Double32_t> > TStlArrayDouble32Proxy;
950 typedef TStlArrayProxy<TArrayType<Float_t> > TStlArrayFloatProxy;
951 typedef TStlArrayProxy<TArrayType<Float16_t> > TStlArrayFloat16Proxy;
952 typedef TStlArrayProxy<TArrayType<UInt_t> > TStlArrayUIntProxy;
953 typedef TStlArrayProxy<TArrayType<ULong_t> > TStlArrayULongProxy;
954 typedef TStlArrayProxy<TArrayType<ULong64_t> > TStlArrayULong64Proxy;
955 typedef TStlArrayProxy<TArrayType<UShort_t> > TStlArrayUShortProxy;
956 typedef TStlArrayProxy<TArrayType<UChar_t> > TStlArrayUCharProxy;
957 typedef TStlArrayProxy<TArrayType<Int_t> > TStlArrayIntProxy;
958 typedef TStlArrayProxy<TArrayType<Long_t> > TStlArrayLongProxy;
959 typedef TStlArrayProxy<TArrayType<Long64_t> > TStlArrayLong64Proxy;
960 typedef TStlArrayProxy<TArrayType<UShort_t> > TStlArrayShortProxy;
961 typedef TStlArrayProxy<TArrayType<Char_t> > TStlArrayCharProxy;
962 typedef TStlArrayProxy<TArrayType<Bool_t> > TStlArrayBoolProxy;
967 using Detail::TBranchProxy;