File indexing completed on 2025-01-18 10:06:09
0001 #ifndef PODIO_READER_H
0002 #define PODIO_READER_H
0003
0004 #include "podio/Frame.h"
0005 #include "podio/podioVersion.h"
0006
0007 namespace podio {
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020 class Reader {
0021 private:
0022 struct ReaderConcept {
0023 virtual ~ReaderConcept() = default;
0024
0025 virtual podio::Frame readNextFrame(const std::string& name) = 0;
0026 virtual podio::Frame readFrame(const std::string& name, size_t index) = 0;
0027 virtual size_t getEntries(const std::string& name) const = 0;
0028 virtual podio::version::Version currentFileVersion() const = 0;
0029 virtual std::optional<podio::version::Version> currentFileVersion(const std::string& name) const = 0;
0030 virtual std::vector<std::string_view> getAvailableCategories() const = 0;
0031 virtual const std::string_view getDatamodelDefinition(const std::string& name) const = 0;
0032 virtual std::vector<std::string> getAvailableDatamodels() const = 0;
0033 };
0034
0035 private:
0036 template <typename T>
0037 struct ReaderModel final : ReaderConcept {
0038 ReaderModel(std::unique_ptr<T> reader) : m_reader(std::move(reader)) {
0039 }
0040 ReaderModel(const ReaderModel&) = delete;
0041 ReaderModel& operator=(const ReaderModel&) = delete;
0042 ReaderModel(ReaderModel&&) = default;
0043 ReaderModel& operator=(ReaderModel&&) = default;
0044
0045 ~ReaderModel() = default;
0046
0047 podio::Frame readNextFrame(const std::string& name) override {
0048 auto maybeFrame = m_reader->readNextEntry(name);
0049 if (maybeFrame) {
0050 return maybeFrame;
0051 }
0052 throw std::runtime_error("Failed reading category " + name + " (reading beyond bounds?)");
0053 }
0054
0055 podio::Frame readFrame(const std::string& name, size_t index) override {
0056 auto maybeFrame = m_reader->readEntry(name, index);
0057 if (maybeFrame) {
0058 return maybeFrame;
0059 }
0060 throw std::runtime_error("Failed reading category " + name + " at frame " + std::to_string(index) +
0061 " (reading beyond bounds?)");
0062 }
0063 size_t getEntries(const std::string& name) const override {
0064 return m_reader->getEntries(name);
0065 }
0066 podio::version::Version currentFileVersion() const override {
0067 return m_reader->currentFileVersion();
0068 }
0069
0070 std::optional<podio::version::Version> currentFileVersion(const std::string& name) const override {
0071 return m_reader->currentFileVersion(name);
0072 }
0073
0074 std::vector<std::string_view> getAvailableCategories() const override {
0075 return m_reader->getAvailableCategories();
0076 }
0077
0078 const std::string_view getDatamodelDefinition(const std::string& name) const override {
0079 return m_reader->getDatamodelDefinition(name);
0080 }
0081
0082 std::vector<std::string> getAvailableDatamodels() const override {
0083 return m_reader->getAvailableDatamodels();
0084 }
0085
0086 std::unique_ptr<T> m_reader;
0087 };
0088
0089 std::unique_ptr<ReaderConcept> m_self{nullptr};
0090
0091 public:
0092
0093
0094
0095
0096 template <typename T>
0097 Reader(std::unique_ptr<T> actualReader);
0098
0099 Reader(const Reader&) = delete;
0100 Reader& operator=(const Reader&) = delete;
0101 Reader(Reader&&) = default;
0102 Reader& operator=(Reader&&) = default;
0103 ~Reader() = default;
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113 podio::Frame readNextFrame(const std::string& name) {
0114 return m_self->readNextFrame(name);
0115 }
0116
0117
0118
0119
0120
0121
0122 podio::Frame readNextEvent() {
0123 return readNextFrame(podio::Category::Event);
0124 }
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135 podio::Frame readFrame(const std::string& name, size_t index) {
0136 return m_self->readFrame(name, index);
0137 }
0138
0139
0140
0141
0142
0143
0144
0145
0146 podio::Frame readEvent(size_t index) {
0147 return readFrame(podio::Category::Event, index);
0148 }
0149
0150
0151
0152
0153
0154
0155 size_t getEntries(const std::string& name) const {
0156 return m_self->getEntries(name);
0157 }
0158
0159
0160
0161
0162 size_t getEvents() const {
0163 return getEntries(podio::Category::Event);
0164 }
0165
0166
0167
0168
0169
0170 podio::version::Version currentFileVersion() const {
0171 return m_self->currentFileVersion();
0172 }
0173
0174
0175
0176
0177
0178
0179
0180
0181 std::optional<podio::version::Version> currentFileVersion(const std::string& name) const {
0182 return m_self->currentFileVersion(name);
0183 }
0184
0185
0186
0187
0188 std::vector<std::string_view> getAvailableCategories() const {
0189 return m_self->getAvailableCategories();
0190 }
0191
0192
0193
0194
0195
0196
0197 const std::string_view getDatamodelDefinition(const std::string& name) const {
0198 return m_self->getDatamodelDefinition(name);
0199 }
0200
0201
0202
0203
0204 std::vector<std::string> getAvailableDatamodels() const {
0205 return m_self->getAvailableDatamodels();
0206 }
0207 };
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218 Reader makeReader(const std::string& filename);
0219
0220
0221
0222
0223
0224
0225
0226
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237 Reader makeReader(const std::vector<std::string>& filenames);
0238
0239 }
0240
0241 #endif