Commit 522d2b2227cbc8edc1b7404f2e3980a28d216988

Authored by Jay Berkenbilt
1 parent 5187a3ec

Improve efficiency of fixDanglingReferences

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;
... ...