From 3c4aa887a9098221d2d6f3319cc81bd2864a2ad5 Mon Sep 17 00:00:00 2001 From: m-holger Date: Tue, 26 Aug 2025 20:08:54 +0100 Subject: [PATCH] Refactor `QPDFPageLabelDocumentHelper::Members` to use `std::unique_ptr`, simplify logic, and enhance consistency with modern C++ practices. --- include/qpdf/QPDFPageLabelDocumentHelper.hh | 14 +------------- libqpdf/QPDFPageLabelDocumentHelper.cc | 37 +++++++++++++++++++++---------------- qpdf/qpdf.testcov | 1 - 3 files changed, 22 insertions(+), 30 deletions(-) diff --git a/include/qpdf/QPDFPageLabelDocumentHelper.hh b/include/qpdf/QPDFPageLabelDocumentHelper.hh index 9c63172..c5a9c3f 100644 --- a/include/qpdf/QPDFPageLabelDocumentHelper.hh +++ b/include/qpdf/QPDFPageLabelDocumentHelper.hh @@ -77,19 +77,7 @@ class QPDFPageLabelDocumentHelper: public QPDFDocumentHelper std::vector& new_labels); private: - class Members - { - friend class QPDFPageLabelDocumentHelper; - - public: - ~Members() = default; - - private: - Members() = default; - Members(Members const&) = delete; - - std::shared_ptr labels; - }; + class Members; std::shared_ptr m; }; diff --git a/libqpdf/QPDFPageLabelDocumentHelper.cc b/libqpdf/QPDFPageLabelDocumentHelper.cc index eab70b9..af7ed1c 100644 --- a/libqpdf/QPDFPageLabelDocumentHelper.cc +++ b/libqpdf/QPDFPageLabelDocumentHelper.cc @@ -2,37 +2,43 @@ #include +class QPDFPageLabelDocumentHelper::Members +{ + public: + Members() = default; + Members(Members const&) = delete; + ~Members() = default; + + std::unique_ptr labels; +}; + QPDFPageLabelDocumentHelper::QPDFPageLabelDocumentHelper(QPDF& qpdf) : QPDFDocumentHelper(qpdf), - m(new Members()) + m(std::make_shared()) { QPDFObjectHandle root = qpdf.getRoot(); if (root.hasKey("/PageLabels")) { m->labels = - std::make_shared(root.getKey("/PageLabels"), this->qpdf); + std::make_unique(root.getKey("/PageLabels"), this->qpdf); } } bool QPDFPageLabelDocumentHelper::hasPageLabels() { - return nullptr != m->labels; + return m->labels != nullptr; } QPDFObjectHandle QPDFPageLabelDocumentHelper::getLabelForPage(long long page_idx) { - QPDFObjectHandle result(QPDFObjectHandle::newNull()); if (!hasPageLabels()) { - return result; + return QPDFObjectHandle::newNull(); } QPDFNumberTreeObjectHelper::numtree_number offset = 0; QPDFObjectHandle label; - if (!m->labels->findObjectAtOrBelow(page_idx, label, offset)) { - return result; - } - if (!label.isDictionary()) { - return result; + if (!m->labels->findObjectAtOrBelow(page_idx, label, offset) || !label.isDictionary()) { + return QPDFObjectHandle::newNull(); } QPDFObjectHandle S = label.getKey("/S"); // type (D, R, r, A, a) QPDFObjectHandle P = label.getKey("/P"); // prefix @@ -43,7 +49,7 @@ QPDFPageLabelDocumentHelper::getLabelForPage(long long page_idx) } QIntC::range_check(start, offset); start += offset; - result = QPDFObjectHandle::newDictionary(); + auto result = QPDFObjectHandle::newDictionary(); result.replaceKey("/S", S); result.replaceKey("/P", P); result.replaceKey("/St", QPDFObjectHandle::newInteger(start)); @@ -81,21 +87,20 @@ QPDFPageLabelDocumentHelper::getLabelsForPageRange( label.getKey("/St").getIntValue() - last.getKey("/St").getIntValue(); long long int idx_delta = new_start_idx - last_idx.getIntValue(); if (st_delta == idx_delta) { - QTC::TC("qpdf", "QPDFPageLabelDocumentHelper skip first"); skip_first = true; } } } if (!skip_first) { - new_labels.push_back(QPDFObjectHandle::newInteger(new_start_idx)); - new_labels.push_back(label); + new_labels.emplace_back(QPDFObjectHandle::newInteger(new_start_idx)); + new_labels.emplace_back(label); } long long int idx_offset = new_start_idx - start_idx; for (long long i = start_idx + 1; i <= end_idx; ++i) { if (m->labels->hasIndex(i) && (label = getLabelForPage(i)).isDictionary()) { - new_labels.push_back(QPDFObjectHandle::newInteger(i + idx_offset)); - new_labels.push_back(label); + new_labels.emplace_back(QPDFObjectHandle::newInteger(i + idx_offset)); + new_labels.emplace_back(label); } } } diff --git a/qpdf/qpdf.testcov b/qpdf/qpdf.testcov index 5e9e65f..5292fd7 100644 --- a/qpdf/qpdf.testcov +++ b/qpdf/qpdf.testcov @@ -338,7 +338,6 @@ QPDFAcroFormDocumentHelper annotation found 1 QPDFJob keep files open n 0 QPDFJob keep files open y 0 QPDFJob automatically set keep files open 1 -QPDFPageLabelDocumentHelper skip first 0 QPDFOutlineObjectHelper direct dest 0 QPDFOutlineObjectHelper action dest 0 QPDFOutlineObjectHelper named dest 0 -- libgit2 0.21.4