00001 #ifndef DataFormats_Provenance_FileIndex_h
00002 #define DataFormats_Provenance_FileIndex_h
00003
00004
00005
00006
00007
00008
00009
00010 #include <vector>
00011 #include <cassert>
00012 #include "DataFormats/Provenance/interface/RunID.h"
00013 #include "DataFormats/Provenance/interface/EventID.h"
00014 #include "DataFormats/Provenance/interface/Transient.h"
00015
00016 #include <iosfwd>
00017
00018 namespace edm {
00019
00020 class FileIndex {
00021
00022 public:
00023 typedef long long EntryNumber_t;
00024
00025 FileIndex();
00026 ~FileIndex() {}
00027
00028 void addEntry(RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event, EntryNumber_t entry);
00029
00030 enum EntryType {kRun, kLumi, kEvent, kEnd};
00031
00032 class Element {
00033 public:
00034 static EntryNumber_t const invalidEntry = -1LL;
00035 Element() : run_(0U), lumi_(0U), event_(0U), entry_(invalidEntry) {
00036 }
00037 Element(RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event, long long entry) :
00038 run_(run), lumi_(lumi),
00039 event_(event), entry_(entry) {
00040 assert(lumi_ != 0U || event_ == 0U);
00041 }
00042 Element(RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event) :
00043 run_(run), lumi_(lumi), event_(event), entry_(invalidEntry) {}
00044 EntryType getEntryType() const {
00045 return lumi_ == 0U ? kRun : (event_ == 0U ? kLumi : kEvent);
00046 }
00047 RunNumber_t run_;
00048 LuminosityBlockNumber_t lumi_;
00049 EventNumber_t event_;
00050 EntryNumber_t entry_;
00051 };
00052
00053 typedef std::vector<Element>::const_iterator const_iterator;
00054
00055 typedef std::vector<Element>::iterator iterator;
00056
00057 void sortBy_Run_Lumi_Event();
00058 void sortBy_Run_Lumi_EventEntry();
00059
00060 const_iterator
00061 findPosition(RunNumber_t run, LuminosityBlockNumber_t lumi = 0U, EventNumber_t event = 0U) const;
00062
00063 const_iterator
00064 findEventPosition(RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event) const;
00065
00066 const_iterator
00067 findEventEntryPosition(RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event, EntryNumber_t entry) const;
00068
00069 const_iterator
00070 findLumiPosition(RunNumber_t run, LuminosityBlockNumber_t lumi) const;
00071
00072 const_iterator
00073 findRunPosition(RunNumber_t run) const;
00074
00075 const_iterator
00076 findLumiOrRunPosition(RunNumber_t run, LuminosityBlockNumber_t lumi) const;
00077
00078 bool
00079 containsItem(RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event) const {
00080 return event ? containsEvent(run, lumi, event) : (lumi ? containsLumi(run, lumi) : containsRun(run));
00081 }
00082
00083 bool
00084 containsEvent(RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event) const {
00085 return findEventPosition(run, lumi, event) != entries_.end();
00086 }
00087
00088 bool
00089 containsLumi(RunNumber_t run, LuminosityBlockNumber_t lumi) const {
00090 return findLumiPosition(run, lumi) != entries_.end();
00091 }
00092
00093 bool
00094 containsRun(RunNumber_t run) const {
00095 return findRunPosition(run) != entries_.end();
00096 }
00097
00098 const_iterator begin() const {return entries_.begin();}
00099
00100 const_iterator end() const {return entries_.end();}
00101
00102 iterator begin() {return entries_.begin();}
00103
00104 iterator end() {return entries_.end();}
00105
00106 iterator erase(iterator pos) {return entries_.erase(pos);}
00107
00108 iterator erase(iterator begin, iterator end) {return entries_.erase(begin, end);}
00109
00110 std::vector<Element>::size_type size() const {return entries_.size();}
00111
00112 bool empty() const {return entries_.empty();}
00113
00114 bool allEventsInEntryOrder() const;
00115
00116 enum SortState {kNotSorted, kSorted_Run_Lumi_Event, kSorted_Run_Lumi_EventEntry};
00117
00118 struct Transients {
00119 Transients();
00120 bool allInEntryOrder_;
00121 bool resultCached_;
00122 SortState sortState_;
00123 };
00124
00125 private:
00126
00127 bool& allInEntryOrder() const {return transients_.get().allInEntryOrder_;}
00128 bool& resultCached() const {return transients_.get().resultCached_;}
00129 SortState& sortState() const {return transients_.get().sortState_;}
00130
00131 std::vector<Element> entries_;
00132 mutable Transient<Transients> transients_;
00133 };
00134
00135 bool operator<(FileIndex::Element const& lh, FileIndex::Element const& rh);
00136
00137 inline
00138 bool operator>(FileIndex::Element const& lh, FileIndex::Element const& rh) {return rh < lh;}
00139
00140 inline
00141 bool operator>=(FileIndex::Element const& lh, FileIndex::Element const& rh) {return !(lh < rh);}
00142
00143 inline
00144 bool operator<=(FileIndex::Element const& lh, FileIndex::Element const& rh) {return !(rh < lh);}
00145
00146 inline
00147 bool operator==(FileIndex::Element const& lh, FileIndex::Element const& rh) {return !(lh < rh || rh < lh);}
00148
00149 inline
00150 bool operator!=(FileIndex::Element const& lh, FileIndex::Element const& rh) {return lh < rh || rh < lh;}
00151
00152 class Compare_Run_Lumi_EventEntry {
00153 public:
00154 bool operator()(FileIndex::Element const& lh, FileIndex::Element const& rh);
00155 };
00156
00157 std::ostream&
00158 operator<<(std::ostream& os, FileIndex const& fileIndex);
00159 }
00160
00161 #endif