12 #ifndef ROOT_TTreeReaderValueFast
13 #define ROOT_TTreeReaderValueFast
30 #include <type_traits>
35 namespace Experimental {
40 class TTreeReaderValueFastBase {
42 TTreeReaderValueFastBase(
const TTreeReaderValueFastBase&) =
delete;
44 ROOT::Internal::TTreeReaderValueBase::ESetupStatus GetSetupStatus()
const {
return fSetupStatus; }
45 virtual ROOT::Internal::TTreeReaderValueBase::EReadStatus GetReadStatus()
const {
return fReadStatus; }
49 TTreeReaderValueFastBase(TTreeReaderFast* reader,
const std::string &branchName) :
50 fBranchName(branchName),
51 fLeafName(branchName),
53 fBuffer(TBuffer::kWrite, 32*1024),
54 fEvtIndex(reader->GetIndexRef())
56 if (fTreeReader) fTreeReader->RegisterValueReader(
this);
59 Int_t GetEvents(Long64_t eventNum) {
61 if (fEventBase >= 0 && (fRemaining + fEventBase > eventNum)) {
62 Int_t adjust = (eventNum - fEventBase);
63 if (R__unlikely(Adjust(adjust) < 0)) {
69 fRemaining = fBranch->GetBulkRead().GetEntriesSerialized(eventNum, fBuffer);
70 if (R__unlikely(fRemaining < 0)) {
71 fReadStatus = ROOT::Internal::TTreeReaderValueBase::kReadError;
76 fEventBase = eventNum;
78 fReadStatus = ROOT::Internal::TTreeReaderValueBase::kReadSuccess;
82 virtual const char *GetTypeName() {
return "{UNDETERMINED}";}
88 virtual Int_t Adjust(Int_t eventCount) {
89 Int_t bufOffset = fBuffer.Length();
90 fBuffer.SetBufferOffset(bufOffset + eventCount*GetSize());
93 virtual UInt_t GetSize() = 0;
95 void MarkTreeReaderUnavailable() {
96 fTreeReader =
nullptr;
104 virtual ~TTreeReaderValueFastBase();
108 virtual const char *BranchTypeName() = 0;
110 std::string fBranchName;
111 std::string fLeafName;
112 TTreeReaderFast *fTreeReader{
nullptr};
113 TBranch * fBranch{
nullptr};
114 TLeaf * fLeaf{
nullptr};
118 Long64_t fLastChainOffset{-1};
119 Long64_t fEventBase{-1};
121 ROOT::Internal::TTreeReaderValueBase::ESetupStatus fSetupStatus{ROOT::Internal::TTreeReaderValueBase::kSetupNotSetup};
122 ROOT::Internal::TTreeReaderValueBase::EReadStatus fReadStatus{ROOT::Internal::TTreeReaderValueBase::kReadNothingYet};
124 friend class ROOT::Experimental::TTreeReaderFast;
129 template <
typename T>
130 class TTreeReaderValueFast final :
public ROOT::Experimental::Internal::TTreeReaderValueFastBase {
133 TTreeReaderValueFast(TTreeReaderFast* reader,
const std::string &branchname) : ROOT::Experimental::Internal::TTreeReaderValueFastBase(reader, branchname) {}
136 return Deserialize(reinterpret_cast<char *>(reinterpret_cast<T*>(fBuffer.GetCurrent()) + fEvtIndex));
138 T* operator->() {
return Get(); }
139 T& operator*() {
return *Get(); }
142 T* Deserialize(
char *) {
return nullptr;}
144 virtual const char *GetTypeName()
override {
return "{INCOMPLETE}";}
145 virtual UInt_t GetSize()
override {
return sizeof(T);}
149 class TTreeReaderValueFast<float> final :
public ROOT::Experimental::Internal::TTreeReaderValueFastBase {
153 TTreeReaderValueFast(TTreeReaderFast& tr,
const std::string &branchname) :
154 TTreeReaderValueFastBase(&tr, branchname) {}
157 return Deserialize(reinterpret_cast<char *>(reinterpret_cast<float*>(fBuffer.GetCurrent()) + fEvtIndex));
159 float* operator->() {
return Get(); }
160 float& operator*() {
return *Get(); }
163 virtual const char *GetTypeName()
override {
return "float";}
164 virtual const char *BranchTypeName()
override {
return "float";}
165 virtual UInt_t GetSize()
override {
return sizeof(float);}
166 float * Deserialize(
char *input) {frombuf(input, &fTmp);
return &fTmp;}
172 class TTreeReaderValueFast<double> final :
public ROOT::Experimental::Internal::TTreeReaderValueFastBase {
176 TTreeReaderValueFast(TTreeReaderFast& tr,
const std::string &branchname) :
177 TTreeReaderValueFastBase(&tr, branchname) {}
182 return Deserialize(reinterpret_cast<char *>(reinterpret_cast<double*>(fBuffer.GetCurrent()) + fEvtIndex));
184 double* operator->() {
return Get(); }
185 double& operator*() {
return *Get(); }
188 virtual const char *GetTypeName()
override {
return "double";}
189 virtual const char *BranchTypeName()
override {
return "double";}
190 virtual UInt_t GetSize()
override {
return sizeof(double);}
191 double* Deserialize(
char *input) {frombuf(input, &fTmp);
return &fTmp;}
197 class TTreeReaderValueFast<Int_t> final :
public ROOT::Experimental::Internal::TTreeReaderValueFastBase {
201 TTreeReaderValueFast(TTreeReaderFast& tr,
const std::string &branchname) :
202 TTreeReaderValueFastBase(&tr, branchname) {}
205 return Deserialize(reinterpret_cast<char *>(reinterpret_cast<Int_t*>(fBuffer.GetCurrent()) + fEvtIndex));
207 Int_t* operator->() {
return Get(); }
208 Int_t& operator*() {
return *Get(); }
211 virtual const char *GetTypeName()
override {
return "integer";}
212 virtual const char *BranchTypeName()
override {
return "integer";}
213 virtual UInt_t GetSize()
override {
return sizeof(Int_t);}
214 Int_t* Deserialize(
char *input) {frombuf(input, &fTmp);
return &fTmp;}
220 class TTreeReaderValueFast<UInt_t> final :
public ROOT::Experimental::Internal::TTreeReaderValueFastBase {
224 TTreeReaderValueFast(TTreeReaderFast& tr,
const std::string &branchname) :
225 TTreeReaderValueFastBase(&tr, branchname) {}
228 return Deserialize(reinterpret_cast<char *>(reinterpret_cast<UInt_t*>(fBuffer.GetCurrent()) + fEvtIndex));
230 UInt_t* operator->() {
return Get(); }
231 UInt_t& operator*() {
return *Get(); }
234 virtual const char *GetTypeName()
override {
return "unsigned integer";}
235 virtual const char *BranchTypeName()
override {
return "unsigned integer";}
236 virtual UInt_t GetSize()
override {
return sizeof(UInt_t);}
237 UInt_t* Deserialize(
char *input) {frombuf(input, &fTmp);
return &fTmp;}
243 class TTreeReaderValueFast<Bool_t> final :
public ROOT::Experimental::Internal::TTreeReaderValueFastBase {
247 TTreeReaderValueFast(TTreeReaderFast& tr,
const std::string &branchname) :
248 TTreeReaderValueFastBase(&tr, branchname) {}
251 return Deserialize(reinterpret_cast<char *>(reinterpret_cast<Bool_t*>(fBuffer.GetCurrent()) + fEvtIndex));
253 Bool_t* operator->() {
return Get(); }
254 Bool_t& operator*() {
return *Get(); }
257 virtual const char *GetTypeName()
override {
return "unsigned integer";}
258 virtual const char *BranchTypeName()
override {
return "unsigned integer";}
259 virtual UInt_t GetSize()
override {
return sizeof(Bool_t);}
260 Bool_t* Deserialize(
char *input) {frombuf(input, &fTmp);
return &fTmp;}
268 #endif // ROOT_TTreeReaderValueFast