Commit 522d2b2227cbc8edc1b7404f2e3980a28d216988

Authored by Jay Berkenbilt
1 parent 5187a3ec

Improve efficiency of fixDanglingReferences

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;