From 522d2b2227cbc8edc1b7404f2e3980a28d216988 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sat, 17 Aug 2019 22:28:19 -0400 Subject: Improve efficiency of fixDanglingReferences --- libqpdf/QPDF.cc | 12 +++++------- libqpdf/QPDF_Array.cc | 11 +++++++++++ libqpdf/SparseOHArray.cc | 12 ++++++++++++ libqpdf/qpdf/QPDF_Array.hh | 5 +++++ libqpdf/qpdf/SparseOHArray.hh | 6 ++++++ 5 files changed, 39 insertions(+), 7 deletions(-) (limited to 'libqpdf') diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc index a549eed0..5a03facc 100644 --- a/libqpdf/QPDF.cc +++ b/libqpdf/QPDF.cc @@ -20,6 +20,7 @@ #include #include #include +#include std::string QPDF::qpdf_version = "8.4.2"; @@ -1349,13 +1350,10 @@ QPDF::fixDanglingReferences(bool force) } else if (obj.isArray()) { - std::vector elements = obj.getArrayAsVector(); - for (std::vector::iterator iter = - elements.begin(); - iter != elements.end(); ++iter) - { - to_check.push_back(*iter); - } + QPDF_Array* arr = + dynamic_cast( + QPDFObjectHandle::ObjAccessor::getObject(obj).getPointer()); + arr->addExplicitElementsToList(to_check); } for (std::list::iterator iter = to_check.begin(); iter != to_check.end(); ++iter) diff --git a/libqpdf/QPDF_Array.cc b/libqpdf/QPDF_Array.cc index 31cd2dbc..99a75dcc 100644 --- a/libqpdf/QPDF_Array.cc +++ b/libqpdf/QPDF_Array.cc @@ -142,3 +142,14 @@ QPDF_Array::getElementsForShallowCopy() const { return this->elements; } + +void +QPDF_Array::addExplicitElementsToList(std::list& l) const +{ + for (std::map::const_iterator iter = + this->elements.begin(); + iter != this->elements.end(); ++iter) + { + l.push_back((*iter).second); + } +} diff --git a/libqpdf/SparseOHArray.cc b/libqpdf/SparseOHArray.cc index 2c525ca8..76c7c224 100644 --- a/libqpdf/SparseOHArray.cc +++ b/libqpdf/SparseOHArray.cc @@ -141,3 +141,15 @@ SparseOHArray::insert(size_t idx, QPDFObjectHandle oh) ++this->n_elements; } } + +SparseOHArray::const_iterator +SparseOHArray::begin() const +{ + return this->elements.begin(); +} + +SparseOHArray::const_iterator +SparseOHArray::end() const +{ + return this->elements.end(); +} diff --git a/libqpdf/qpdf/QPDF_Array.hh b/libqpdf/qpdf/QPDF_Array.hh index eb0b594b..7ea111a9 100644 --- a/libqpdf/qpdf/QPDF_Array.hh +++ b/libqpdf/qpdf/QPDF_Array.hh @@ -4,6 +4,7 @@ #include #include +#include #include class QPDF_Array: public QPDFObject @@ -28,7 +29,11 @@ class QPDF_Array: public QPDFObject void appendItem(QPDFObjectHandle const& item); void eraseItem(int at); + // Helper methods for QPDF and QPDFObjectHandle -- these are + // public methods since the whole class is not part of the public + // API. Otherwise, these would be wrapped in accessor classes. SparseOHArray const& getElementsForShallowCopy() const; + void addExplicitElementsToList(std::list&) const; protected: virtual void releaseResolved(); diff --git a/libqpdf/qpdf/SparseOHArray.hh b/libqpdf/qpdf/SparseOHArray.hh index 2e3f334c..6cd30ece 100644 --- a/libqpdf/qpdf/SparseOHArray.hh +++ b/libqpdf/qpdf/SparseOHArray.hh @@ -26,6 +26,12 @@ class SparseOHArray QPDF_DLL void insert(size_t idx, QPDFObjectHandle oh); + typedef std::map::const_iterator const_iterator; + QPDF_DLL + const_iterator begin() const; + QPDF_DLL + const_iterator end() const; + private: std::map elements; size_t n_elements; -- cgit v1.2.3-54-g00ecf