12 #ifndef ROOT_TTreeReaderFast
13 #define ROOT_TTreeReaderFast
32 namespace Experimental {
34 class TTreeReaderValueFast;
35 class TTreeReaderValueFastBase;
38 class TTreeReaderFast:
public TObject {
46 public std::iterator<std::input_iterator_tag, const Long64_t, Long64_t> {
51 TTreeReaderFast *fReader{
nullptr};
54 bool IsValid()
const {
return fEntry >= 0; }
62 Iterator_t(TTreeReaderFast& reader, Long64_t first):
63 fIdx(&(reader.fEvtIndex)), fEntry(first), fReader(&reader)
66 fCount = fReader->GetNextRange(fEntry);
71 bool operator==(
const Iterator_t& lhs)
const {
73 if (R__unlikely(!IsValid() && !lhs.IsValid())) {
return true;}
74 return R__unlikely(fEntry == lhs.fEntry && fReader == lhs.fReader);
78 bool operator!=(
const Iterator_t& lhs)
const {
79 return !(*
this == lhs);
83 Iterator_t operator++(
int) {
84 Iterator_t ret = *
this;
90 Iterator_t& operator++() {
92 if (R__unlikely(*fIdx == fCount)) {
96 fCount = fReader->GetNextRange(fEntry);
98 if (R__unlikely(!fCount || (fCount < 0))) {
100 fReader->fEntryStatus = TTreeReader::kEntryBadReader;
107 Long64_t operator*() {
108 return fEntry + *fIdx;
111 Long64_t operator*()
const {
112 return **
const_cast<Iterator_t*
>(
this);
116 typedef Iterator_t iterator;
120 fEntryStatus(TTreeReader::kEntryNoTree),
124 TTreeReaderFast(TTree* tree);
125 TTreeReaderFast(
const char* keyname, TDirectory* dir = NULL );
129 TTreeReader::EEntryStatus SetEntriesRange(Long64_t first, Long64_t last);
131 TTreeReader::EEntryStatus GetEntryStatus()
const {
return fEntryStatus; }
133 TTree* GetTree()
const {
return fTree; }
135 TTreeReader::EEntryStatus SetEntry(Long64_t);
139 return Iterator_t(*
this, 0);
141 Iterator_t end()
const {
return Iterator_t(); }
146 Int_t &GetIndexRef() {
return fEvtIndex;}
148 void RegisterValueReader(ROOT::Experimental::Internal::TTreeReaderValueFastBase* reader);
149 void DeregisterValueReader(ROOT::Experimental::Internal::TTreeReaderValueFastBase* reader);
153 Int_t GetNextRange(Int_t);
156 TTree* fTree{
nullptr};
157 TDirectory* fDirectory{
nullptr};
158 ROOT::Internal::TBranchProxyDirector* fDirector{
nullptr};
159 TTreeReader::EEntryStatus fEntryStatus{TTreeReader::kEntryNotLoaded};
160 std::deque<ROOT::Experimental::Internal::TTreeReaderValueFastBase*> fValues;
163 Long64_t fBaseEvent{-1};
164 Long64_t fLastEntry{-1};
166 friend class ROOT::Experimental::Internal::TTreeReaderValueFastBase;
168 ClassDef(TTreeReaderFast, 0);
173 #endif // defined TTreeReaderFast