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 | 20 | #include <qpdf/QPDF_Null.hh> |
| 21 | 21 | #include <qpdf/QPDF_Dictionary.hh> |
| 22 | 22 | #include <qpdf/QPDF_Stream.hh> |
| 23 | +#include <qpdf/QPDF_Array.hh> | |
| 23 | 24 | |
| 24 | 25 | std::string QPDF::qpdf_version = "8.4.2"; |
| 25 | 26 | |
| ... | ... | @@ -1349,13 +1350,10 @@ QPDF::fixDanglingReferences(bool force) |
| 1349 | 1350 | } |
| 1350 | 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 | 1358 | for (std::list<QPDFObjectHandle>::iterator iter = to_check.begin(); |
| 1361 | 1359 | iter != to_check.end(); ++iter) | ... | ... |
libqpdf/QPDF_Array.cc
| ... | ... | @@ -142,3 +142,14 @@ QPDF_Array::getElementsForShallowCopy() const |
| 142 | 142 | { |
| 143 | 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 | 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 | 4 | #include <qpdf/QPDFObject.hh> |
| 5 | 5 | |
| 6 | 6 | #include <vector> |
| 7 | +#include <list> | |
| 7 | 8 | #include <qpdf/SparseOHArray.hh> |
| 8 | 9 | |
| 9 | 10 | class QPDF_Array: public QPDFObject |
| ... | ... | @@ -28,7 +29,11 @@ class QPDF_Array: public QPDFObject |
| 28 | 29 | void appendItem(QPDFObjectHandle const& item); |
| 29 | 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 | 35 | SparseOHArray const& getElementsForShallowCopy() const; |
| 36 | + void addExplicitElementsToList(std::list<QPDFObjectHandle>&) const; | |
| 32 | 37 | |
| 33 | 38 | protected: |
| 34 | 39 | virtual void releaseResolved(); | ... | ... |
libqpdf/qpdf/SparseOHArray.hh
| ... | ... | @@ -26,6 +26,12 @@ class SparseOHArray |
| 26 | 26 | QPDF_DLL |
| 27 | 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 | 35 | private: |
| 30 | 36 | std::map<size_t, QPDFObjectHandle> elements; |
| 31 | 37 | size_t n_elements; | ... | ... |