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 77 std::vector<QPDFObjectHandle>& new_labels);
78 78  
79 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 82 std::shared_ptr<Members> m;
95 83 };
... ...
libqpdf/QPDFPageLabelDocumentHelper.cc
... ... @@ -2,37 +2,43 @@
2 2  
3 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 15 QPDFPageLabelDocumentHelper::QPDFPageLabelDocumentHelper(QPDF& qpdf) :
6 16 QPDFDocumentHelper(qpdf),
7   - m(new Members())
  17 + m(std::make_shared<Members>())
8 18 {
9 19 QPDFObjectHandle root = qpdf.getRoot();
10 20 if (root.hasKey("/PageLabels")) {
11 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 26 bool
17 27 QPDFPageLabelDocumentHelper::hasPageLabels()
18 28 {
19   - return nullptr != m->labels;
  29 + return m->labels != nullptr;
20 30 }
21 31  
22 32 QPDFObjectHandle
23 33 QPDFPageLabelDocumentHelper::getLabelForPage(long long page_idx)
24 34 {
25   - QPDFObjectHandle result(QPDFObjectHandle::newNull());
26 35 if (!hasPageLabels()) {
27   - return result;
  36 + return QPDFObjectHandle::newNull();
28 37 }
29 38 QPDFNumberTreeObjectHelper::numtree_number offset = 0;
30 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 43 QPDFObjectHandle S = label.getKey("/S"); // type (D, R, r, A, a)
38 44 QPDFObjectHandle P = label.getKey("/P"); // prefix
... ... @@ -43,7 +49,7 @@ QPDFPageLabelDocumentHelper::getLabelForPage(long long page_idx)
43 49 }
44 50 QIntC::range_check(start, offset);
45 51 start += offset;
46   - result = QPDFObjectHandle::newDictionary();
  52 + auto result = QPDFObjectHandle::newDictionary();
47 53 result.replaceKey("/S", S);
48 54 result.replaceKey("/P", P);
49 55 result.replaceKey("/St", QPDFObjectHandle::newInteger(start));
... ... @@ -81,21 +87,20 @@ QPDFPageLabelDocumentHelper::getLabelsForPageRange(
81 87 label.getKey("/St").getIntValue() - last.getKey("/St").getIntValue();
82 88 long long int idx_delta = new_start_idx - last_idx.getIntValue();
83 89 if (st_delta == idx_delta) {
84   - QTC::TC("qpdf", "QPDFPageLabelDocumentHelper skip first");
85 90 skip_first = true;
86 91 }
87 92 }
88 93 }
89 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 99 long long int idx_offset = new_start_idx - start_idx;
95 100 for (long long i = start_idx + 1; i <= end_idx; ++i) {
96 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 338 QPDFJob keep files open n 0
339 339 QPDFJob keep files open y 0
340 340 QPDFJob automatically set keep files open 1
341   -QPDFPageLabelDocumentHelper skip first 0
342 341 QPDFOutlineObjectHelper direct dest 0
343 342 QPDFOutlineObjectHelper action dest 0
344 343 QPDFOutlineObjectHelper named dest 0
... ...