From 8486b9deabdab182bdf2646bd4ee5ca391c0a565 Mon Sep 17 00:00:00 2001 From: m-holger Date: Mon, 13 Oct 2025 12:10:28 +0100 Subject: [PATCH] Refactor `Doc::Objects`: extend `Common` inheritance, streamline constructors, and improve encapsulation. --- libqpdf/QPDF_Stream.cc | 10 +++++----- libqpdf/qpdf/QPDF_private.hh | 36 ++++++++++++++---------------------- 2 files changed, 19 insertions(+), 27 deletions(-) diff --git a/libqpdf/QPDF_Stream.cc b/libqpdf/QPDF_Stream.cc index e47fe59..153852d 100644 --- a/libqpdf/QPDF_Stream.cc +++ b/libqpdf/QPDF_Stream.cc @@ -30,7 +30,7 @@ using Streams = QPDF::Doc::Objects::Streams; bool Streams::immediate_copy_from() const { - return qpdf_.m->immediate_copy_from; + return qpdf.m->immediate_copy_from; } class Streams::Copier final: public QPDFObjectHandle::StreamDataProvider @@ -83,10 +83,10 @@ class Streams::Copier final: public QPDFObjectHandle::StreamDataProvider if (data != copied_data.end()) { auto& fd = data->second; QTC::TC("qpdf", "QPDF pipe foreign encrypted stream", fd.encp->encrypted ? 0 : 1); - if (streams.qpdf().pipeStreamData( + if (streams.qpdf.pipeStreamData( fd.encp, fd.file, - streams.qpdf(), + streams.qpdf, fd.source_og, fd.offset, fd.length, @@ -128,8 +128,8 @@ class Streams::Copier final: public QPDFObjectHandle::StreamDataProvider std::map copied_data; }; -Streams::Streams(QPDF& qpdf) : - qpdf_(qpdf), +Streams::Streams(Common& common) : + Common(common), copier_(std::make_shared(*this)) { } diff --git a/libqpdf/qpdf/QPDF_private.hh b/libqpdf/qpdf/QPDF_private.hh index 8dc9e50..35699da 100644 --- a/libqpdf/qpdf/QPDF_private.hh +++ b/libqpdf/qpdf/QPDF_private.hh @@ -624,15 +624,12 @@ class QPDF::Doc::Linearization: Common class QPDF::Doc::Objects: Common { public: - class Foreign + class Foreign: Common { - class Copier + class Copier: Common { public: - Copier(QPDF& qpdf) : - qpdf(qpdf) - { - } + inline Copier(QPDF& qpdf); QPDFObjectHandle copied(QPDFObjectHandle const& foreign); @@ -641,15 +638,14 @@ class QPDF::Doc::Objects: Common replace_indirect_object(QPDFObjectHandle const& foreign, bool top = false); void reserve_objects(QPDFObjectHandle const& foreign, bool top = false); - QPDF& qpdf; std::map object_map; std::vector to_copy; QPDFObjGen::set visiting; }; public: - Foreign(QPDF& qpdf) : - qpdf(qpdf) + Foreign(Common& common) : + Common(common) { } @@ -670,18 +666,17 @@ class QPDF::Doc::Objects: Common private: Copier& copier(QPDFObjectHandle const& foreign); - QPDF& qpdf; std::map copiers; }; // class QPDF::Doc::Objects::Foreign - class Streams + class Streams: Common { // Copier manages the copying of streams into this PDF. It is used both for copying // local and foreign streams. class Copier; public: - Streams(QPDF& qpdf); + Streams(Common& common); Streams() = delete; Streams(Streams const&) = delete; @@ -714,12 +709,6 @@ class QPDF::Doc::Objects: Common will_retry); } - QPDF& - qpdf() const - { - return qpdf_; - } - std::shared_ptr& copier() { @@ -729,8 +718,6 @@ class QPDF::Doc::Objects: Common bool immediate_copy_from() const; private: - QPDF& qpdf_; - std::shared_ptr copier_; }; // class QPDF::Doc::Objects::Streams @@ -744,8 +731,8 @@ class QPDF::Doc::Objects: Common Objects(Doc& doc) : Common(doc.qpdf, doc.m), - foreign_(doc.qpdf), - streams_(doc.qpdf) + foreign_(*this), + streams_(*this) { } @@ -997,6 +984,11 @@ QPDF::doc() return *m; } +inline QPDF::Doc::Objects::Foreign::Copier::Copier(QPDF& qpdf) : + Common(qpdf, qpdf.doc().m) +{ +} + // Throw a generic exception for unusual error conditions that do not be covered during CI testing. inline void QPDF::no_ci_stop_if(bool condition, std::string const& message, std::string const& context) -- libgit2 0.21.4