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