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