Commit bfda94151950c9dfd930e1d780d6f16b2dfd4501

Authored by Jay Berkenbilt
1 parent ee271fd2

Use an unordered map for SparseOHArray for efficiency

This was added in C++11.
libqpdf/SparseOHArray.cc
@@ -30,8 +30,7 @@ SparseOHArray::at(size_t idx) const @@ -30,8 +30,7 @@ SparseOHArray::at(size_t idx) const
30 throw std::logic_error( 30 throw std::logic_error(
31 "INTERNAL ERROR: bounds error accessing SparseOHArray element"); 31 "INTERNAL ERROR: bounds error accessing SparseOHArray element");
32 } 32 }
33 - std::map<size_t, QPDFObjectHandle>::const_iterator iter =  
34 - this->elements.find(idx); 33 + auto iter = this->elements.find(idx);
35 if (iter == this->elements.end()) 34 if (iter == this->elements.end())
36 { 35 {
37 return QPDFObjectHandle::newNull(); 36 return QPDFObjectHandle::newNull();
@@ -58,8 +57,7 @@ SparseOHArray::remove_last() @@ -58,8 +57,7 @@ SparseOHArray::remove_last()
58 void 57 void
59 SparseOHArray::releaseResolved() 58 SparseOHArray::releaseResolved()
60 { 59 {
61 - for (std::map<size_t, QPDFObjectHandle>::iterator iter =  
62 - this->elements.begin(); 60 + for (auto iter = this->elements.begin();
63 iter != this->elements.end(); ++iter) 61 iter != this->elements.end(); ++iter)
64 { 62 {
65 QPDFObjectHandle::ReleaseResolver::releaseResolved((*iter).second); 63 QPDFObjectHandle::ReleaseResolver::releaseResolved((*iter).second);
@@ -90,9 +88,8 @@ SparseOHArray::erase(size_t idx) @@ -90,9 +88,8 @@ SparseOHArray::erase(size_t idx)
90 { 88 {
91 throw std::logic_error("bounds error erasing item from SparseOHArray"); 89 throw std::logic_error("bounds error erasing item from SparseOHArray");
92 } 90 }
93 - std::map<size_t, QPDFObjectHandle> dest;  
94 - for (std::map<size_t, QPDFObjectHandle>::iterator iter =  
95 - this->elements.begin(); 91 + decltype(this->elements) dest;
  92 + for (auto iter = this->elements.begin();
96 iter != this->elements.end(); ++iter) 93 iter != this->elements.end(); ++iter)
97 { 94 {
98 if ((*iter).first < idx) 95 if ((*iter).first < idx)
@@ -122,9 +119,8 @@ SparseOHArray::insert(size_t idx, QPDFObjectHandle oh) @@ -122,9 +119,8 @@ SparseOHArray::insert(size_t idx, QPDFObjectHandle oh)
122 } 119 }
123 else 120 else
124 { 121 {
125 - std::map<size_t, QPDFObjectHandle> dest;  
126 - for (std::map<size_t, QPDFObjectHandle>::iterator iter =  
127 - this->elements.begin(); 122 + decltype(this->elements) dest;
  123 + for (auto iter = this->elements.begin();
128 iter != this->elements.end(); ++iter) 124 iter != this->elements.end(); ++iter)
129 { 125 {
130 if ((*iter).first < idx) 126 if ((*iter).first < idx)
libqpdf/qpdf/SparseOHArray.hh
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 #define QPDF_SPARSEOHARRAY_HH 2 #define QPDF_SPARSEOHARRAY_HH
3 3
4 #include <qpdf/QPDFObjectHandle.hh> 4 #include <qpdf/QPDFObjectHandle.hh>
5 -#include <map> 5 +#include <unordered_map>
6 6
7 class SparseOHArray 7 class SparseOHArray
8 { 8 {
@@ -26,14 +26,14 @@ class SparseOHArray @@ -26,14 +26,14 @@ 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; 29 + typedef std::unordered_map<size_t, QPDFObjectHandle>::const_iterator const_iterator;
30 QPDF_DLL 30 QPDF_DLL
31 const_iterator begin() const; 31 const_iterator begin() const;
32 QPDF_DLL 32 QPDF_DLL
33 const_iterator end() const; 33 const_iterator end() const;
34 34
35 private: 35 private:
36 - std::map<size_t, QPDFObjectHandle> elements; 36 + std::unordered_map<size_t, QPDFObjectHandle> elements;
37 size_t n_elements; 37 size_t n_elements;
38 }; 38 };
39 39