From 55a6e92e263c8630e8369bd9164fb74999fef47f Mon Sep 17 00:00:00 2001 From: tmadlener Date: Thu, 6 Jun 2024 16:29:38 +0200 Subject: [PATCH 1/3] Fix const correctness and accessibility for I/O interfaces --- include/podio/Reader.h | 25 ++++++++++++++++++++----- include/podio/Writer.h | 6 ++++-- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/include/podio/Reader.h b/include/podio/Reader.h index e644a8238..b7dcc8dea 100644 --- a/include/podio/Reader.h +++ b/include/podio/Reader.h @@ -8,24 +8,30 @@ namespace podio { class Reader { public: + // ROOT dictionary generation needs this to be public for some reason 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 +49,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 +73,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 +97,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..b11ce6fc1 100644 --- a/include/podio/Writer.h +++ b/include/podio/Writer.h @@ -2,12 +2,12 @@ #define PODIO_WRITER_H #include "podio/Frame.h" -#include "podio/podioVersion.h" namespace podio { class Writer { public: + // ROOT dictionary generation needs this to be public for some reason struct WriterConcept { virtual ~WriterConcept() = default; @@ -19,8 +19,9 @@ class Writer { 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; @@ -51,6 +52,7 @@ class Writer { std::unique_ptr m_self{nullptr}; +public: template Writer(std::unique_ptr reader) : m_self(std::make_unique>(std::move(reader))) { } From a97795687187e8672baf8e96f40a8e003cde3eed Mon Sep 17 00:00:00 2001 From: tmadlener Date: Thu, 6 Jun 2024 16:30:33 +0200 Subject: [PATCH 2/3] Remove unnecessary and unused concept API --- include/podio/Writer.h | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/include/podio/Writer.h b/include/podio/Writer.h index b11ce6fc1..792da9336 100644 --- a/include/podio/Writer.h +++ b/include/podio/Writer.h @@ -11,11 +11,8 @@ class Writer { 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; }; @@ -31,19 +28,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(); } @@ -65,16 +53,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(); From faaa03ad72e248529177718a372a431252db8dcd Mon Sep 17 00:00:00 2001 From: tmadlener Date: Tue, 11 Jun 2024 14:44:08 +0200 Subject: [PATCH 3/3] Remove unnecessary dictionary generation for I/O interfaces --- include/podio/Reader.h | 3 +-- include/podio/Writer.h | 3 +-- src/CMakeLists.txt | 8 +++++--- src/io_selection.xml | 6 ------ 4 files changed, 7 insertions(+), 13 deletions(-) delete mode 100644 src/io_selection.xml diff --git a/include/podio/Reader.h b/include/podio/Reader.h index b7dcc8dea..ebce75a3e 100644 --- a/include/podio/Reader.h +++ b/include/podio/Reader.h @@ -7,8 +7,7 @@ namespace podio { class Reader { -public: - // ROOT dictionary generation needs this to be public for some reason +private: struct ReaderConcept { virtual ~ReaderConcept() = default; diff --git a/include/podio/Writer.h b/include/podio/Writer.h index 792da9336..ca5b5d4c6 100644 --- a/include/podio/Writer.h +++ b/include/podio/Writer.h @@ -6,8 +6,7 @@ namespace podio { class Writer { -public: - // ROOT dictionary generation needs this to be public for some reason +private: struct WriterConcept { virtual ~WriterConcept() = default; 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 @@ - - - - - -