From 361f147fd16f16db227899be45551951933191f0 Mon Sep 17 00:00:00 2001 From: m-holger Date: Fri, 10 Oct 2025 21:01:52 +0100 Subject: [PATCH] Refactor `Pages` interface: replace `.all()` with iterator-based access, add `begin`/`end` methods, update calls across codebase, and streamline page handling logic. --- libqpdf/QPDFJob.cc | 16 ++++++++-------- libqpdf/QPDFPageDocumentHelper.cc | 7 +------ libqpdf/QPDFWriter.cc | 6 +++--- libqpdf/QPDF_linearization.cc | 2 +- libqpdf/QPDF_optimization.cc | 2 +- libqpdf/QPDF_pages.cc | 4 ++-- libqpdf/qpdf/QPDF_private.hh | 14 ++++++++++++++ 7 files changed, 30 insertions(+), 21 deletions(-) diff --git a/libqpdf/QPDFJob.cc b/libqpdf/QPDFJob.cc index 137501a..287bfee 100644 --- a/libqpdf/QPDFJob.cc +++ b/libqpdf/QPDFJob.cc @@ -855,7 +855,7 @@ QPDFJob::doShowPages(QPDF& pdf) { int pageno = 0; auto& cout = *m->log->getInfo(); - for (auto& page: pdf.doc().pages().all()) { + for (auto& page: pdf.doc().pages()) { QPDFPageObjectHelper ph(page); ++pageno; @@ -1050,7 +1050,7 @@ QPDFJob::doJSONPages(Pipeline* p, bool& first, QPDF& pdf) auto& pldh = doc.page_labels(); auto& odh = doc.outlines(); int pageno = -1; - for (auto& page: doc.pages().all()) { + for (auto& page: doc.pages()) { ++pageno; JSON j_page = JSON::makeDictionary(); QPDFPageObjectHelper ph(page); @@ -1112,7 +1112,7 @@ QPDFJob::doJSONPageLabels(Pipeline* p, bool& first, QPDF& pdf) auto& doc = pdf.doc(); JSON j_labels = JSON::makeArray(); auto& pldh = doc.page_labels(); - long long npages = QIntC::to_longlong(doc.pages().all().size()); + long long npages = QIntC::to_longlong(doc.pages().size()); if (pldh.hasPageLabels()) { std::vector labels; pldh.getLabelsForPageRange(0, npages - 1, 0, labels); @@ -1161,7 +1161,7 @@ QPDFJob::doJSONOutlines(Pipeline* p, bool& first, QPDF& pdf) auto& doc = pdf.doc(); std::map page_numbers; int n = 0; - for (auto const& oh: doc.pages().all()) { + for (auto const& oh: doc.pages()) { page_numbers[oh] = ++n; } @@ -1180,7 +1180,7 @@ QPDFJob::doJSONAcroform(Pipeline* p, bool& first, QPDF& pdf) j_acroform.addDictionaryMember("needappearances", JSON::makeBool(afdh.getNeedAppearances())); JSON j_fields = j_acroform.addDictionaryMember("fields", JSON::makeArray()); int pagepos1 = 0; - for (auto const& page: doc.pages().all()) { + for (auto const& page: doc.pages()) { ++pagepos1; for (auto& aoh: afdh.getWidgetAnnotationsForPage({page})) { QPDFFormFieldObjectHelper ffh = afdh.getFieldForAnnotation(aoh); @@ -1858,8 +1858,8 @@ QPDFJob::validateUnderOverlay(QPDF& pdf, UnderOverlay* uo) { processFile(uo->pdf, uo->filename.data(), uo->password.data(), true, false); try { - uo->to_pagenos = QUtil::parse_numrange( - uo->to_nr.data(), static_cast(pdf.doc().pages().all().size())); + uo->to_pagenos = + QUtil::parse_numrange(uo->to_nr.data(), static_cast(pdf.doc().pages().size())); } catch (std::runtime_error& e) { throw std::runtime_error( "parsing numeric range for " + uo->which + " \"to\" pages: " + e.what()); @@ -2355,8 +2355,8 @@ void QPDFJob::Input::initialize(Inputs& in, QPDF* a_qpdf) { qpdf = a_qpdf ? a_qpdf : qpdf_p.get(); - auto& doc = qpdf->doc(); if (qpdf) { + auto& doc = qpdf->doc(); orig_pages = doc.pages().all(); n_pages = static_cast(orig_pages.size()); copied_pages = std::vector(orig_pages.size(), false); diff --git a/libqpdf/QPDFPageDocumentHelper.cc b/libqpdf/QPDFPageDocumentHelper.cc index f0b4c33..2a6faee 100644 --- a/libqpdf/QPDFPageDocumentHelper.cc +++ b/libqpdf/QPDFPageDocumentHelper.cc @@ -30,12 +30,7 @@ std::vector QPDFPageDocumentHelper::getAllPages() { auto& pp = qpdf.doc().pages(); - std::vector pages; - pages.reserve(pp.size()); - for (auto const& iter: pp.all()) { - pages.emplace_back(iter); - } - return pages; + return {pp.begin(), pp.end()}; } void diff --git a/libqpdf/QPDFWriter.cc b/libqpdf/QPDFWriter.cc index deabeff..3977bb4 100644 --- a/libqpdf/QPDFWriter.cc +++ b/libqpdf/QPDFWriter.cc @@ -2128,7 +2128,7 @@ QPDFWriter::Members::initializeSpecialStreams() { // Mark all page content streams in case we are filtering or normalizing. int num = 0; - for (auto& page: pages.all()) { + for (auto& page: pages) { page_object_to_seq[page.getObjGen()] = ++num; QPDFObjectHandle contents = page.getKey("/Contents"); std::vector contents_objects; @@ -2380,7 +2380,7 @@ QPDFWriter::Members::doWriteSetup() if (!obj.streams_empty) { if (linearized) { // Page dictionaries are not allowed to be compressed objects. - for (auto& page: qpdf.doc().pages().all()) { + for (auto& page: pages) { if (obj[page].object_stream > 0) { obj[page].object_stream = 0; } @@ -3133,7 +3133,7 @@ QPDFWriter::Members::enqueueObjectsPCLm() std::string image_transform_content = "q /image Do Q\n"; // enqueue all pages first - for (auto& page: pages.all()) { + for (auto& page: pages) { // enqueue page enqueueObject(page); diff --git a/libqpdf/QPDF_linearization.cc b/libqpdf/QPDF_linearization.cc index b5b9772..b549b37 100644 --- a/libqpdf/QPDF_linearization.cc +++ b/libqpdf/QPDF_linearization.cc @@ -1108,7 +1108,7 @@ Lin::calculateLinearizationData(T const& object_stream_data) { // local scope // Map all page objects to the containing object stream. This should be a no-op in a // properly linearized file. - for (auto oh: pages.all()) { + for (auto oh: pages) { uc_pages.emplace_back(getUncompressedObject(oh, object_stream_data)); } } diff --git a/libqpdf/QPDF_optimization.cc b/libqpdf/QPDF_optimization.cc index 89d52de..b9c8bd7 100644 --- a/libqpdf/QPDF_optimization.cc +++ b/libqpdf/QPDF_optimization.cc @@ -99,7 +99,7 @@ Lin::optimize_internal( // Traverse pages size_t n = 0; - for (auto const& page: m->pages.all()) { + for (auto const& page: m->pages) { updateObjectMaps(ObjUser(ObjUser::ou_page, n), page, skip_stream_parameters); ++n; } diff --git a/libqpdf/QPDF_pages.cc b/libqpdf/QPDF_pages.cc index fa0ea63..f537d77 100644 --- a/libqpdf/QPDF_pages.cc +++ b/libqpdf/QPDF_pages.cc @@ -494,7 +494,7 @@ QPDF::removePage(QPDFObjectHandle page) } void -Pages ::erase(QPDFObjectHandle& page) +Pages::erase(QPDFObjectHandle& page) { int pos = qpdf.findPage(page); // also ensures flat /Pages QTC::TC( @@ -551,7 +551,7 @@ QPDF::findPage(QPDFObjGen og) } int -Pages ::find(QPDFObjGen og) +Pages::find(QPDFObjGen og) { flattenPagesTree(); auto it = pageobj_to_pages_pos.find(og); diff --git a/libqpdf/qpdf/QPDF_private.hh b/libqpdf/qpdf/QPDF_private.hh index c56c6b3..c4cf664 100644 --- a/libqpdf/qpdf/QPDF_private.hh +++ b/libqpdf/qpdf/QPDF_private.hh @@ -853,6 +853,8 @@ class QPDF::Doc::Objects: Common class QPDF::Doc::Pages: Common { public: + using iterator = std::vector::const_iterator; + Pages() = delete; Pages(Pages const&) = delete; Pages(Pages&&) = delete; @@ -883,6 +885,18 @@ class QPDF::Doc::Pages: Common return all().size(); } + iterator + begin() + { + return all().cbegin(); + } + + iterator + end() + { + return all().cend(); + } + int find(QPDFObjGen og); void erase(QPDFObjectHandle& page); void update_cache(); -- libgit2 0.21.4