Commit 3c4aa887a9098221d2d6f3319cc81bd2864a2ad5
1 parent
b00647d5
Refactor `QPDFPageLabelDocumentHelper::Members` to use `std::unique_ptr`, simpli…
…fy logic, and enhance consistency with modern C++ practices.
Showing
3 changed files
with
22 additions
and
30 deletions
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 | ... | ... |