Commit 3c4aa887a9098221d2d6f3319cc81bd2864a2ad5

Authored by m-holger
1 parent b00647d5

Refactor `QPDFPageLabelDocumentHelper::Members` to use `std::unique_ptr`, simpli…

…fy logic, and enhance consistency with modern C++ practices.
include/qpdf/QPDFPageLabelDocumentHelper.hh
@@ -77,19 +77,7 @@ class QPDFPageLabelDocumentHelper: public QPDFDocumentHelper @@ -77,19 +77,7 @@ class QPDFPageLabelDocumentHelper: public QPDFDocumentHelper
77 std::vector<QPDFObjectHandle>& new_labels); 77 std::vector<QPDFObjectHandle>& new_labels);
78 78
79 private: 79 private:
80 - class Members  
81 - {  
82 - friend class QPDFPageLabelDocumentHelper;  
83 -  
84 - public:  
85 - ~Members() = default;  
86 -  
87 - private:  
88 - Members() = default;  
89 - Members(Members const&) = delete;  
90 -  
91 - std::shared_ptr<QPDFNumberTreeObjectHelper> labels;  
92 - }; 80 + class Members;
93 81
94 std::shared_ptr<Members> m; 82 std::shared_ptr<Members> m;
95 }; 83 };
libqpdf/QPDFPageLabelDocumentHelper.cc
@@ -2,37 +2,43 @@ @@ -2,37 +2,43 @@
2 2
3 #include <qpdf/QTC.hh> 3 #include <qpdf/QTC.hh>
4 4
  5 +class QPDFPageLabelDocumentHelper::Members
  6 +{
  7 + public:
  8 + Members() = default;
  9 + Members(Members const&) = delete;
  10 + ~Members() = default;
  11 +
  12 + std::unique_ptr<QPDFNumberTreeObjectHelper> labels;
  13 +};
  14 +
5 QPDFPageLabelDocumentHelper::QPDFPageLabelDocumentHelper(QPDF& qpdf) : 15 QPDFPageLabelDocumentHelper::QPDFPageLabelDocumentHelper(QPDF& qpdf) :
6 QPDFDocumentHelper(qpdf), 16 QPDFDocumentHelper(qpdf),
7 - m(new Members()) 17 + m(std::make_shared<Members>())
8 { 18 {
9 QPDFObjectHandle root = qpdf.getRoot(); 19 QPDFObjectHandle root = qpdf.getRoot();
10 if (root.hasKey("/PageLabels")) { 20 if (root.hasKey("/PageLabels")) {
11 m->labels = 21 m->labels =
12 - std::make_shared<QPDFNumberTreeObjectHelper>(root.getKey("/PageLabels"), this->qpdf); 22 + std::make_unique<QPDFNumberTreeObjectHelper>(root.getKey("/PageLabels"), this->qpdf);
13 } 23 }
14 } 24 }
15 25
16 bool 26 bool
17 QPDFPageLabelDocumentHelper::hasPageLabels() 27 QPDFPageLabelDocumentHelper::hasPageLabels()
18 { 28 {
19 - return nullptr != m->labels; 29 + return m->labels != nullptr;
20 } 30 }
21 31
22 QPDFObjectHandle 32 QPDFObjectHandle
23 QPDFPageLabelDocumentHelper::getLabelForPage(long long page_idx) 33 QPDFPageLabelDocumentHelper::getLabelForPage(long long page_idx)
24 { 34 {
25 - QPDFObjectHandle result(QPDFObjectHandle::newNull());  
26 if (!hasPageLabels()) { 35 if (!hasPageLabels()) {
27 - return result; 36 + return QPDFObjectHandle::newNull();
28 } 37 }
29 QPDFNumberTreeObjectHelper::numtree_number offset = 0; 38 QPDFNumberTreeObjectHelper::numtree_number offset = 0;
30 QPDFObjectHandle label; 39 QPDFObjectHandle label;
31 - if (!m->labels->findObjectAtOrBelow(page_idx, label, offset)) {  
32 - return result;  
33 - }  
34 - if (!label.isDictionary()) {  
35 - return result; 40 + if (!m->labels->findObjectAtOrBelow(page_idx, label, offset) || !label.isDictionary()) {
  41 + return QPDFObjectHandle::newNull();
36 } 42 }
37 QPDFObjectHandle S = label.getKey("/S"); // type (D, R, r, A, a) 43 QPDFObjectHandle S = label.getKey("/S"); // type (D, R, r, A, a)
38 QPDFObjectHandle P = label.getKey("/P"); // prefix 44 QPDFObjectHandle P = label.getKey("/P"); // prefix
@@ -43,7 +49,7 @@ QPDFPageLabelDocumentHelper::getLabelForPage(long long page_idx) @@ -43,7 +49,7 @@ QPDFPageLabelDocumentHelper::getLabelForPage(long long page_idx)
43 } 49 }
44 QIntC::range_check(start, offset); 50 QIntC::range_check(start, offset);
45 start += offset; 51 start += offset;
46 - result = QPDFObjectHandle::newDictionary(); 52 + auto result = QPDFObjectHandle::newDictionary();
47 result.replaceKey("/S", S); 53 result.replaceKey("/S", S);
48 result.replaceKey("/P", P); 54 result.replaceKey("/P", P);
49 result.replaceKey("/St", QPDFObjectHandle::newInteger(start)); 55 result.replaceKey("/St", QPDFObjectHandle::newInteger(start));
@@ -81,21 +87,20 @@ QPDFPageLabelDocumentHelper::getLabelsForPageRange( @@ -81,21 +87,20 @@ QPDFPageLabelDocumentHelper::getLabelsForPageRange(
81 label.getKey("/St").getIntValue() - last.getKey("/St").getIntValue(); 87 label.getKey("/St").getIntValue() - last.getKey("/St").getIntValue();
82 long long int idx_delta = new_start_idx - last_idx.getIntValue(); 88 long long int idx_delta = new_start_idx - last_idx.getIntValue();
83 if (st_delta == idx_delta) { 89 if (st_delta == idx_delta) {
84 - QTC::TC("qpdf", "QPDFPageLabelDocumentHelper skip first");  
85 skip_first = true; 90 skip_first = true;
86 } 91 }
87 } 92 }
88 } 93 }
89 if (!skip_first) { 94 if (!skip_first) {
90 - new_labels.push_back(QPDFObjectHandle::newInteger(new_start_idx));  
91 - new_labels.push_back(label); 95 + new_labels.emplace_back(QPDFObjectHandle::newInteger(new_start_idx));
  96 + new_labels.emplace_back(label);
92 } 97 }
93 98
94 long long int idx_offset = new_start_idx - start_idx; 99 long long int idx_offset = new_start_idx - start_idx;
95 for (long long i = start_idx + 1; i <= end_idx; ++i) { 100 for (long long i = start_idx + 1; i <= end_idx; ++i) {
96 if (m->labels->hasIndex(i) && (label = getLabelForPage(i)).isDictionary()) { 101 if (m->labels->hasIndex(i) && (label = getLabelForPage(i)).isDictionary()) {
97 - new_labels.push_back(QPDFObjectHandle::newInteger(i + idx_offset));  
98 - new_labels.push_back(label); 102 + new_labels.emplace_back(QPDFObjectHandle::newInteger(i + idx_offset));
  103 + new_labels.emplace_back(label);
99 } 104 }
100 } 105 }
101 } 106 }
qpdf/qpdf.testcov
@@ -338,7 +338,6 @@ QPDFAcroFormDocumentHelper annotation found 1 @@ -338,7 +338,6 @@ QPDFAcroFormDocumentHelper annotation found 1
338 QPDFJob keep files open n 0 338 QPDFJob keep files open n 0
339 QPDFJob keep files open y 0 339 QPDFJob keep files open y 0
340 QPDFJob automatically set keep files open 1 340 QPDFJob automatically set keep files open 1
341 -QPDFPageLabelDocumentHelper skip first 0  
342 QPDFOutlineObjectHelper direct dest 0 341 QPDFOutlineObjectHelper direct dest 0
343 QPDFOutlineObjectHelper action dest 0 342 QPDFOutlineObjectHelper action dest 0
344 QPDFOutlineObjectHelper named dest 0 343 QPDFOutlineObjectHelper named dest 0