Commit 361f147fd16f16db227899be45551951933191f0

Authored by m-holger
1 parent 92d076ed

Refactor `Pages` interface: replace `.all()` with iterator-based access, add `be…

…gin`/`end` methods, update calls across codebase, and streamline page handling logic.
libqpdf/QPDFJob.cc
... ... @@ -855,7 +855,7 @@ QPDFJob::doShowPages(QPDF& pdf)
855 855 {
856 856 int pageno = 0;
857 857 auto& cout = *m->log->getInfo();
858   - for (auto& page: pdf.doc().pages().all()) {
  858 + for (auto& page: pdf.doc().pages()) {
859 859 QPDFPageObjectHelper ph(page);
860 860 ++pageno;
861 861  
... ... @@ -1050,7 +1050,7 @@ QPDFJob::doJSONPages(Pipeline* p, bool& first, QPDF& pdf)
1050 1050 auto& pldh = doc.page_labels();
1051 1051 auto& odh = doc.outlines();
1052 1052 int pageno = -1;
1053   - for (auto& page: doc.pages().all()) {
  1053 + for (auto& page: doc.pages()) {
1054 1054 ++pageno;
1055 1055 JSON j_page = JSON::makeDictionary();
1056 1056 QPDFPageObjectHelper ph(page);
... ... @@ -1112,7 +1112,7 @@ QPDFJob::doJSONPageLabels(Pipeline* p, bool& first, QPDF& pdf)
1112 1112 auto& doc = pdf.doc();
1113 1113 JSON j_labels = JSON::makeArray();
1114 1114 auto& pldh = doc.page_labels();
1115   - long long npages = QIntC::to_longlong(doc.pages().all().size());
  1115 + long long npages = QIntC::to_longlong(doc.pages().size());
1116 1116 if (pldh.hasPageLabels()) {
1117 1117 std::vector<QPDFObjectHandle> labels;
1118 1118 pldh.getLabelsForPageRange(0, npages - 1, 0, labels);
... ... @@ -1161,7 +1161,7 @@ QPDFJob::doJSONOutlines(Pipeline* p, bool&amp; first, QPDF&amp; pdf)
1161 1161 auto& doc = pdf.doc();
1162 1162 std::map<QPDFObjGen, int> page_numbers;
1163 1163 int n = 0;
1164   - for (auto const& oh: doc.pages().all()) {
  1164 + for (auto const& oh: doc.pages()) {
1165 1165 page_numbers[oh] = ++n;
1166 1166 }
1167 1167  
... ... @@ -1180,7 +1180,7 @@ QPDFJob::doJSONAcroform(Pipeline* p, bool&amp; first, QPDF&amp; pdf)
1180 1180 j_acroform.addDictionaryMember("needappearances", JSON::makeBool(afdh.getNeedAppearances()));
1181 1181 JSON j_fields = j_acroform.addDictionaryMember("fields", JSON::makeArray());
1182 1182 int pagepos1 = 0;
1183   - for (auto const& page: doc.pages().all()) {
  1183 + for (auto const& page: doc.pages()) {
1184 1184 ++pagepos1;
1185 1185 for (auto& aoh: afdh.getWidgetAnnotationsForPage({page})) {
1186 1186 QPDFFormFieldObjectHelper ffh = afdh.getFieldForAnnotation(aoh);
... ... @@ -1858,8 +1858,8 @@ QPDFJob::validateUnderOverlay(QPDF&amp; pdf, UnderOverlay* uo)
1858 1858 {
1859 1859 processFile(uo->pdf, uo->filename.data(), uo->password.data(), true, false);
1860 1860 try {
1861   - uo->to_pagenos = QUtil::parse_numrange(
1862   - uo->to_nr.data(), static_cast<int>(pdf.doc().pages().all().size()));
  1861 + uo->to_pagenos =
  1862 + QUtil::parse_numrange(uo->to_nr.data(), static_cast<int>(pdf.doc().pages().size()));
1863 1863 } catch (std::runtime_error& e) {
1864 1864 throw std::runtime_error(
1865 1865 "parsing numeric range for " + uo->which + " \"to\" pages: " + e.what());
... ... @@ -2355,8 +2355,8 @@ void
2355 2355 QPDFJob::Input::initialize(Inputs& in, QPDF* a_qpdf)
2356 2356 {
2357 2357 qpdf = a_qpdf ? a_qpdf : qpdf_p.get();
2358   - auto& doc = qpdf->doc();
2359 2358 if (qpdf) {
  2359 + auto& doc = qpdf->doc();
2360 2360 orig_pages = doc.pages().all();
2361 2361 n_pages = static_cast<int>(orig_pages.size());
2362 2362 copied_pages = std::vector<bool>(orig_pages.size(), false);
... ...
libqpdf/QPDFPageDocumentHelper.cc
... ... @@ -30,12 +30,7 @@ std::vector&lt;QPDFPageObjectHelper&gt;
30 30 QPDFPageDocumentHelper::getAllPages()
31 31 {
32 32 auto& pp = qpdf.doc().pages();
33   - std::vector<QPDFPageObjectHelper> pages;
34   - pages.reserve(pp.size());
35   - for (auto const& iter: pp.all()) {
36   - pages.emplace_back(iter);
37   - }
38   - return pages;
  33 + return {pp.begin(), pp.end()};
39 34 }
40 35  
41 36 void
... ...
libqpdf/QPDFWriter.cc
... ... @@ -2128,7 +2128,7 @@ QPDFWriter::Members::initializeSpecialStreams()
2128 2128 {
2129 2129 // Mark all page content streams in case we are filtering or normalizing.
2130 2130 int num = 0;
2131   - for (auto& page: pages.all()) {
  2131 + for (auto& page: pages) {
2132 2132 page_object_to_seq[page.getObjGen()] = ++num;
2133 2133 QPDFObjectHandle contents = page.getKey("/Contents");
2134 2134 std::vector<QPDFObjGen> contents_objects;
... ... @@ -2380,7 +2380,7 @@ QPDFWriter::Members::doWriteSetup()
2380 2380 if (!obj.streams_empty) {
2381 2381 if (linearized) {
2382 2382 // Page dictionaries are not allowed to be compressed objects.
2383   - for (auto& page: qpdf.doc().pages().all()) {
  2383 + for (auto& page: pages) {
2384 2384 if (obj[page].object_stream > 0) {
2385 2385 obj[page].object_stream = 0;
2386 2386 }
... ... @@ -3133,7 +3133,7 @@ QPDFWriter::Members::enqueueObjectsPCLm()
3133 3133 std::string image_transform_content = "q /image Do Q\n";
3134 3134  
3135 3135 // enqueue all pages first
3136   - for (auto& page: pages.all()) {
  3136 + for (auto& page: pages) {
3137 3137 // enqueue page
3138 3138 enqueueObject(page);
3139 3139  
... ...
libqpdf/QPDF_linearization.cc
... ... @@ -1108,7 +1108,7 @@ Lin::calculateLinearizationData(T const&amp; object_stream_data)
1108 1108 { // local scope
1109 1109 // Map all page objects to the containing object stream. This should be a no-op in a
1110 1110 // properly linearized file.
1111   - for (auto oh: pages.all()) {
  1111 + for (auto oh: pages) {
1112 1112 uc_pages.emplace_back(getUncompressedObject(oh, object_stream_data));
1113 1113 }
1114 1114 }
... ...
libqpdf/QPDF_optimization.cc
... ... @@ -99,7 +99,7 @@ Lin::optimize_internal(
99 99 // Traverse pages
100 100  
101 101 size_t n = 0;
102   - for (auto const& page: m->pages.all()) {
  102 + for (auto const& page: m->pages) {
103 103 updateObjectMaps(ObjUser(ObjUser::ou_page, n), page, skip_stream_parameters);
104 104 ++n;
105 105 }
... ...
libqpdf/QPDF_pages.cc
... ... @@ -494,7 +494,7 @@ QPDF::removePage(QPDFObjectHandle page)
494 494 }
495 495  
496 496 void
497   -Pages ::erase(QPDFObjectHandle& page)
  497 +Pages::erase(QPDFObjectHandle& page)
498 498 {
499 499 int pos = qpdf.findPage(page); // also ensures flat /Pages
500 500 QTC::TC(
... ... @@ -551,7 +551,7 @@ QPDF::findPage(QPDFObjGen og)
551 551 }
552 552  
553 553 int
554   -Pages ::find(QPDFObjGen og)
  554 +Pages::find(QPDFObjGen og)
555 555 {
556 556 flattenPagesTree();
557 557 auto it = pageobj_to_pages_pos.find(og);
... ...
libqpdf/qpdf/QPDF_private.hh
... ... @@ -853,6 +853,8 @@ class QPDF::Doc::Objects: Common
853 853 class QPDF::Doc::Pages: Common
854 854 {
855 855 public:
  856 + using iterator = std::vector<QPDFObjectHandle>::const_iterator;
  857 +
856 858 Pages() = delete;
857 859 Pages(Pages const&) = delete;
858 860 Pages(Pages&&) = delete;
... ... @@ -883,6 +885,18 @@ class QPDF::Doc::Pages: Common
883 885 return all().size();
884 886 }
885 887  
  888 + iterator
  889 + begin()
  890 + {
  891 + return all().cbegin();
  892 + }
  893 +
  894 + iterator
  895 + end()
  896 + {
  897 + return all().cend();
  898 + }
  899 +
886 900 int find(QPDFObjGen og);
887 901 void erase(QPDFObjectHandle& page);
888 902 void update_cache();
... ...