Commit 522d2b2227cbc8edc1b7404f2e3980a28d216988
1 parent
5187a3ec
Improve efficiency of fixDanglingReferences
Showing
5 changed files
with
39 additions
and
7 deletions
libqpdf/QPDF.cc
| @@ -20,6 +20,7 @@ | @@ -20,6 +20,7 @@ | ||
| 20 | #include <qpdf/QPDF_Null.hh> | 20 | #include <qpdf/QPDF_Null.hh> |
| 21 | #include <qpdf/QPDF_Dictionary.hh> | 21 | #include <qpdf/QPDF_Dictionary.hh> |
| 22 | #include <qpdf/QPDF_Stream.hh> | 22 | #include <qpdf/QPDF_Stream.hh> |
| 23 | +#include <qpdf/QPDF_Array.hh> | ||
| 23 | 24 | ||
| 24 | std::string QPDF::qpdf_version = "8.4.2"; | 25 | std::string QPDF::qpdf_version = "8.4.2"; |
| 25 | 26 | ||
| @@ -1349,13 +1350,10 @@ QPDF::fixDanglingReferences(bool force) | @@ -1349,13 +1350,10 @@ QPDF::fixDanglingReferences(bool force) | ||
| 1349 | } | 1350 | } |
| 1350 | else if (obj.isArray()) | 1351 | else if (obj.isArray()) |
| 1351 | { | 1352 | { |
| 1352 | - std::vector<QPDFObjectHandle> elements = obj.getArrayAsVector(); | ||
| 1353 | - for (std::vector<QPDFObjectHandle>::iterator iter = | ||
| 1354 | - elements.begin(); | ||
| 1355 | - iter != elements.end(); ++iter) | ||
| 1356 | - { | ||
| 1357 | - to_check.push_back(*iter); | ||
| 1358 | - } | 1353 | + QPDF_Array* arr = |
| 1354 | + dynamic_cast<QPDF_Array*>( | ||
| 1355 | + QPDFObjectHandle::ObjAccessor::getObject(obj).getPointer()); | ||
| 1356 | + arr->addExplicitElementsToList(to_check); | ||
| 1359 | } | 1357 | } |
| 1360 | for (std::list<QPDFObjectHandle>::iterator iter = to_check.begin(); | 1358 | for (std::list<QPDFObjectHandle>::iterator iter = to_check.begin(); |
| 1361 | iter != to_check.end(); ++iter) | 1359 | iter != to_check.end(); ++iter) |
libqpdf/QPDF_Array.cc
| @@ -142,3 +142,14 @@ QPDF_Array::getElementsForShallowCopy() const | @@ -142,3 +142,14 @@ QPDF_Array::getElementsForShallowCopy() const | ||
| 142 | { | 142 | { |
| 143 | return this->elements; | 143 | return this->elements; |
| 144 | } | 144 | } |
| 145 | + | ||
| 146 | +void | ||
| 147 | +QPDF_Array::addExplicitElementsToList(std::list<QPDFObjectHandle>& l) const | ||
| 148 | +{ | ||
| 149 | + for (std::map<size_t, QPDFObjectHandle>::const_iterator iter = | ||
| 150 | + this->elements.begin(); | ||
| 151 | + iter != this->elements.end(); ++iter) | ||
| 152 | + { | ||
| 153 | + l.push_back((*iter).second); | ||
| 154 | + } | ||
| 155 | +} |
libqpdf/SparseOHArray.cc
| @@ -141,3 +141,15 @@ SparseOHArray::insert(size_t idx, QPDFObjectHandle oh) | @@ -141,3 +141,15 @@ SparseOHArray::insert(size_t idx, QPDFObjectHandle oh) | ||
| 141 | ++this->n_elements; | 141 | ++this->n_elements; |
| 142 | } | 142 | } |
| 143 | } | 143 | } |
| 144 | + | ||
| 145 | +SparseOHArray::const_iterator | ||
| 146 | +SparseOHArray::begin() const | ||
| 147 | +{ | ||
| 148 | + return this->elements.begin(); | ||
| 149 | +} | ||
| 150 | + | ||
| 151 | +SparseOHArray::const_iterator | ||
| 152 | +SparseOHArray::end() const | ||
| 153 | +{ | ||
| 154 | + return this->elements.end(); | ||
| 155 | +} |
libqpdf/qpdf/QPDF_Array.hh
| @@ -4,6 +4,7 @@ | @@ -4,6 +4,7 @@ | ||
| 4 | #include <qpdf/QPDFObject.hh> | 4 | #include <qpdf/QPDFObject.hh> |
| 5 | 5 | ||
| 6 | #include <vector> | 6 | #include <vector> |
| 7 | +#include <list> | ||
| 7 | #include <qpdf/SparseOHArray.hh> | 8 | #include <qpdf/SparseOHArray.hh> |
| 8 | 9 | ||
| 9 | class QPDF_Array: public QPDFObject | 10 | class QPDF_Array: public QPDFObject |
| @@ -28,7 +29,11 @@ class QPDF_Array: public QPDFObject | @@ -28,7 +29,11 @@ class QPDF_Array: public QPDFObject | ||
| 28 | void appendItem(QPDFObjectHandle const& item); | 29 | void appendItem(QPDFObjectHandle const& item); |
| 29 | void eraseItem(int at); | 30 | void eraseItem(int at); |
| 30 | 31 | ||
| 32 | + // Helper methods for QPDF and QPDFObjectHandle -- these are | ||
| 33 | + // public methods since the whole class is not part of the public | ||
| 34 | + // API. Otherwise, these would be wrapped in accessor classes. | ||
| 31 | SparseOHArray const& getElementsForShallowCopy() const; | 35 | SparseOHArray const& getElementsForShallowCopy() const; |
| 36 | + void addExplicitElementsToList(std::list<QPDFObjectHandle>&) const; | ||
| 32 | 37 | ||
| 33 | protected: | 38 | protected: |
| 34 | virtual void releaseResolved(); | 39 | virtual void releaseResolved(); |
libqpdf/qpdf/SparseOHArray.hh
| @@ -26,6 +26,12 @@ class SparseOHArray | @@ -26,6 +26,12 @@ class SparseOHArray | ||
| 26 | QPDF_DLL | 26 | QPDF_DLL |
| 27 | void insert(size_t idx, QPDFObjectHandle oh); | 27 | void insert(size_t idx, QPDFObjectHandle oh); |
| 28 | 28 | ||
| 29 | + typedef std::map<size_t, QPDFObjectHandle>::const_iterator const_iterator; | ||
| 30 | + QPDF_DLL | ||
| 31 | + const_iterator begin() const; | ||
| 32 | + QPDF_DLL | ||
| 33 | + const_iterator end() const; | ||
| 34 | + | ||
| 29 | private: | 35 | private: |
| 30 | std::map<size_t, QPDFObjectHandle> elements; | 36 | std::map<size_t, QPDFObjectHandle> elements; |
| 31 | size_t n_elements; | 37 | size_t n_elements; |