File indexing completed on 2025-09-18 09:25: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, const std::vector<std::string>&) = 0;
0026 virtual podio::Frame readFrame(const std::string& name, size_t index, const std::vector<std::string>&) = 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, const std::vector<std::string>& collsToRead) override {
0048 auto maybeFrame = m_reader->readNextEntry(name, collsToRead);
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,
0056 const std::vector<std::string>& collsToRead) override {
0057 auto maybeFrame = m_reader->readEntry(name, index, collsToRead);
0058 if (maybeFrame) {
0059 return maybeFrame;
0060 }
0061 throw std::runtime_error("Failed reading category " + name + " at frame " + std::to_string(index) +
0062 " (reading beyond bounds?)");
0063 }
0064 size_t getEntries(const std::string& name) const override {
0065 return m_reader->getEntries(name);
0066 }
0067 podio::version::Version currentFileVersion() const override {
0068 return m_reader->currentFileVersion();
0069 }
0070
0071 std::optional<podio::version::Version> currentFileVersion(const std::string& name) const override {
0072 return m_reader->currentFileVersion(name);
0073 }
0074
0075 std::vector<std::string_view> getAvailableCategories() const override {
0076 return m_reader->getAvailableCategories();
0077 }
0078
0079 const std::string_view getDatamodelDefinition(const std::string& name) const override {
0080 return m_reader->getDatamodelDefinition(name);
0081 }
0082
0083 std::vector<std::string> getAvailableDatamodels() const override {
0084 return m_reader->getAvailableDatamodels();
0085 }
0086
0087 std::unique_ptr<T> m_reader;
0088 };
0089
0090 std::unique_ptr<ReaderConcept> m_self{nullptr};
0091
0092 public:
0093
0094
0095
0096
0097 template <typename T>
0098 Reader(std::unique_ptr<T> actualReader);
0099
0100 Reader(const Reader&) = delete;
0101 Reader& operator=(const Reader&) = delete;
0102 Reader(Reader&&) = default;
0103 Reader& operator=(Reader&&) = default;
0104 ~Reader() = default;
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116 podio::Frame readNextFrame(const std::string& name, const std::vector<std::string>& collsToRead = {}) {
0117 return m_self->readNextFrame(name, collsToRead);
0118 }
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128 podio::Frame readNextEvent(const std::vector<std::string>& collsToRead = {}) {
0129 return readNextFrame(podio::Category::Event, collsToRead);
0130 }
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143 podio::Frame readFrame(const std::string& name, size_t index, const std::vector<std::string>& collsToRead = {}) {
0144 return m_self->readFrame(name, index, collsToRead);
0145 }
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156 podio::Frame readEvent(size_t index, const std::vector<std::string>& collsToRead = {}) {
0157 return readFrame(podio::Category::Event, index, collsToRead);
0158 }
0159
0160
0161
0162
0163
0164
0165 size_t getEntries(const std::string& name) const {
0166 return m_self->getEntries(name);
0167 }
0168
0169
0170
0171
0172 size_t getEvents() const {
0173 return getEntries(podio::Category::Event);
0174 }
0175
0176
0177
0178
0179
0180 podio::version::Version currentFileVersion() const {
0181 return m_self->currentFileVersion();
0182 }
0183
0184
0185
0186
0187
0188
0189
0190
0191 std::optional<podio::version::Version> currentFileVersion(const std::string& name) const {
0192 return m_self->currentFileVersion(name);
0193 }
0194
0195
0196
0197
0198 std::vector<std::string_view> getAvailableCategories() const {
0199 return m_self->getAvailableCategories();
0200 }
0201
0202
0203
0204
0205
0206
0207 const std::string_view getDatamodelDefinition(const std::string& name) const {
0208 return m_self->getDatamodelDefinition(name);
0209 }
0210
0211
0212
0213
0214 std::vector<std::string> getAvailableDatamodels() const {
0215 return m_self->getAvailableDatamodels();
0216 }
0217 };
0218
0219
0220
0221
0222
0223
0224
0225
0226
0227
0228
0229 Reader makeReader(const std::string& filename);
0230
0231
0232
0233
0234
0235
0236
0237
0238
0239
0240
0241
0242
0243
0244
0245
0246
0247
0248 Reader makeReader(const std::vector<std::string>& filenames);
0249
0250 }
0251
0252 #endif