diff --git a/include/podio/Reader.h b/include/podio/Reader.h index e644a8238..ebce75a3e 100644 --- a/include/podio/Reader.h +++ b/include/podio/Reader.h @@ -7,25 +7,30 @@ namespace podio { class Reader { -public: +private: struct ReaderConcept { virtual ~ReaderConcept() = default; virtual podio::Frame readNextFrame(const std::string& name) = 0; virtual podio::Frame readFrame(const std::string& name, size_t index) = 0; - virtual size_t getEntries(const std::string& name) = 0; + virtual size_t getEntries(const std::string& name) const = 0; virtual podio::version::Version currentFileVersion() const = 0; virtual std::vector getAvailableCategories() const = 0; virtual const std::string_view getDatamodelDefinition(const std::string& name) const = 0; virtual std::vector getAvailableDatamodels() const = 0; }; +private: template - struct ReaderModel final : public ReaderConcept { + struct ReaderModel final : ReaderConcept { ReaderModel(std::unique_ptr reader) : m_reader(std::move(reader)) { } ReaderModel(const ReaderModel&) = delete; ReaderModel& operator=(const ReaderModel&) = delete; + ReaderModel(ReaderModel&&) = default; + ReaderModel& operator=(ReaderModel&&) = default; + + ~ReaderModel() = default; podio::Frame readNextFrame(const std::string& name) override { auto maybeFrame = m_reader->readNextEntry(name); @@ -43,7 +48,7 @@ class Reader { throw std::runtime_error("Failed reading category " + name + " at frame " + std::to_string(index) + " (reading beyond bounds?)"); } - size_t getEntries(const std::string& name) override { + size_t getEntries(const std::string& name) const override { return m_reader->getEntries(name); } podio::version::Version currentFileVersion() const override { @@ -67,9 +72,18 @@ class Reader { std::unique_ptr m_self{nullptr}; +public: template Reader(std::unique_ptr); + Reader(const Reader&) = delete; + Reader& operator=(const Reader&) = delete; + + Reader(Reader&&) = default; + Reader& operator=(Reader&&) = default; + + ~Reader() = default; + podio::Frame readNextFrame(const std::string& name) { return m_self->readNextFrame(name); } @@ -82,10 +96,10 @@ class Reader { podio::Frame readEvent(size_t index) { return readFrame(podio::Category::Event, index); } - size_t getEntries(const std::string& name) { + size_t getEntries(const std::string& name) const { return m_self->getEntries(name); } - size_t getEvents() { + size_t getEvents() const { return getEntries(podio::Category::Event); } podio::version::Version currentFileVersion() const { diff --git a/include/podio/Writer.h b/include/podio/Writer.h index 74c02025d..ca5b5d4c6 100644 --- a/include/podio/Writer.h +++ b/include/podio/Writer.h @@ -2,25 +2,22 @@ #define PODIO_WRITER_H #include "podio/Frame.h" -#include "podio/podioVersion.h" namespace podio { class Writer { -public: +private: struct WriterConcept { virtual ~WriterConcept() = default; - virtual void writeFrame(const podio::Frame& frame, const std::string& category) = 0; virtual void writeFrame(const podio::Frame& frame, const std::string& category, const std::vector& collections) = 0; - virtual void writeEvent(const podio::Frame& frame) = 0; - virtual void writeEvent(const podio::Frame& frame, const std::vector& collections) = 0; virtual void finish() = 0; }; +private: template - struct WriterModel final : public WriterConcept { + struct WriterModel final : WriterConcept { WriterModel(std::unique_ptr writer) : m_writer(std::move(writer)) { } WriterModel(const WriterModel&) = delete; @@ -30,19 +27,10 @@ class Writer { ~WriterModel() = default; - void writeFrame(const podio::Frame& frame, const std::string& category) override { - return m_writer->writeFrame(frame, category); - } void writeFrame(const podio::Frame& frame, const std::string& category, const std::vector& collections) override { return m_writer->writeFrame(frame, category, collections); } - void writeEvent(const podio::Frame& frame) override { - return writeFrame(frame, podio::Category::Event); - } - void writeEvent(const podio::Frame& frame, const std::vector& collections) override { - return writeFrame(frame, podio::Category::Event, collections); - } void finish() override { return m_writer->finish(); } @@ -51,6 +39,7 @@ class Writer { std::unique_ptr m_self{nullptr}; +public: template Writer(std::unique_ptr reader) : m_self(std::make_unique>(std::move(reader))) { } @@ -63,16 +52,16 @@ class Writer { ~Writer() = default; void writeFrame(const podio::Frame& frame, const std::string& category) { - return m_self->writeFrame(frame, category); + return m_self->writeFrame(frame, category, frame.getAvailableCollections()); } void writeFrame(const podio::Frame& frame, const std::string& category, const std::vector& collections) { return m_self->writeFrame(frame, category, collections); } void writeEvent(const podio::Frame& frame) { - return writeFrame(frame, podio::Category::Event); + writeFrame(frame, podio::Category::Event, frame.getAvailableCollections()); } void writeEvent(const podio::Frame& frame, const std::vector& collections) { - return writeFrame(frame, podio::Category::Event, collections); + writeFrame(frame, podio::Category::Event, collections); } void finish() { return m_self->finish(); diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2e67cf5ba..393e93383 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -148,7 +148,11 @@ set(io_headers ${PROJECT_SOURCE_DIR}/include/podio/Reader.h ) -PODIO_ADD_LIB_AND_DICT(podioIO "${io_headers}" "${io_sources}" io_selection.xml) +add_library(podioIO SHARED ${io_sources}) +add_library(podio::podioIO ALIAS podioIO) +target_include_directories(podioIO PUBLIC + $ + $) target_link_libraries(podioIO PUBLIC podio::podio podio::podioRootIO) if(ENABLE_SIO) target_link_libraries(podioIO PUBLIC podio::podioSioIO) @@ -172,8 +176,6 @@ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpodioDict_rdict.pcm ${CMAKE_CURRENT_BINARY_DIR}/podioRootIODictDict.rootmap ${CMAKE_CURRENT_BINARY_DIR}/libpodioRootIODict_rdict.pcm - ${CMAKE_CURRENT_BINARY_DIR}/podioIODictDict.rootmap - ${CMAKE_CURRENT_BINARY_DIR}/libpodioIODict_rdict.pcm DESTINATION "${CMAKE_INSTALL_LIBDIR}") if (ENABLE_SIO) diff --git a/src/io_selection.xml b/src/io_selection.xml deleted file mode 100644 index ffeeb5eef..000000000 --- a/src/io_selection.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - -