Commit a7b6975132eed94905eb784a0e267e575cade2cb

Authored by m-holger
1 parent d3f2dc32

Remove SparseOHArray

libqpdf/CMakeLists.txt
@@ -115,7 +115,6 @@ set(libqpdf_SOURCES @@ -115,7 +115,6 @@ set(libqpdf_SOURCES
115 ResourceFinder.cc 115 ResourceFinder.cc
116 SecureRandomDataProvider.cc 116 SecureRandomDataProvider.cc
117 SF_FlateLzwDecode.cc 117 SF_FlateLzwDecode.cc
118 - SparseOHArray.cc  
119 qpdf-c.cc 118 qpdf-c.cc
120 qpdfjob-c.cc 119 qpdfjob-c.cc
121 qpdflogger-c.cc) 120 qpdflogger-c.cc)
libqpdf/QPDFObjectHandle.cc
@@ -23,7 +23,6 @@ @@ -23,7 +23,6 @@
23 #include <qpdf/QPDF_Stream.hh> 23 #include <qpdf/QPDF_Stream.hh>
24 #include <qpdf/QPDF_String.hh> 24 #include <qpdf/QPDF_String.hh>
25 #include <qpdf/QPDF_Unresolved.hh> 25 #include <qpdf/QPDF_Unresolved.hh>
26 -#include <qpdf/SparseOHArray.hh>  
27 26
28 #include <qpdf/QIntC.hh> 27 #include <qpdf/QIntC.hh>
29 #include <qpdf/QTC.hh> 28 #include <qpdf/QTC.hh>
libqpdf/QPDF_Array.cc
1 #include <qpdf/QPDF_Array.hh> 1 #include <qpdf/QPDF_Array.hh>
2 2
  3 +#include <qpdf/QPDFObjectHandle.hh>
3 #include <qpdf/QPDFObject_private.hh> 4 #include <qpdf/QPDFObject_private.hh>
4 5
5 static const QPDFObjectHandle null_oh = QPDFObjectHandle::newNull(); 6 static const QPDFObjectHandle null_oh = QPDFObjectHandle::newNull();
@@ -24,6 +25,20 @@ QPDF_Array::checkOwnership(QPDFObjectHandle const&amp; item) const @@ -24,6 +25,20 @@ QPDF_Array::checkOwnership(QPDFObjectHandle const&amp; item) const
24 } 25 }
25 } 26 }
26 27
  28 +QPDF_Array::QPDF_Array() :
  29 + QPDFValue(::ot_array, "array")
  30 +{
  31 +}
  32 +
  33 +QPDF_Array::QPDF_Array(QPDF_Array const& other) :
  34 + QPDFValue(::ot_array, "array"),
  35 + sparse(other.sparse),
  36 + sp_size(other.sp_size),
  37 + sp_elements(other.sp_elements),
  38 + elements(other.elements)
  39 +{
  40 +}
  41 +
27 QPDF_Array::QPDF_Array(std::vector<QPDFObjectHandle> const& v) : 42 QPDF_Array::QPDF_Array(std::vector<QPDFObjectHandle> const& v) :
28 QPDFValue(::ot_array, "array") 43 QPDFValue(::ot_array, "array")
29 { 44 {
@@ -36,34 +51,18 @@ QPDF_Array::QPDF_Array( @@ -36,34 +51,18 @@ QPDF_Array::QPDF_Array(
36 sparse(sparse) 51 sparse(sparse)
37 { 52 {
38 if (sparse) { 53 if (sparse) {
39 - sp_elements = SparseOHArray();  
40 for (auto&& item: v) { 54 for (auto&& item: v) {
41 if (item->getTypeCode() != ::ot_null || 55 if (item->getTypeCode() != ::ot_null ||
42 item->getObjGen().isIndirect()) { 56 item->getObjGen().isIndirect()) {
43 - sp_elements.elements[sp_elements.n_elements] = std::move(item); 57 + sp_elements[sp_size] = std::move(item);
44 } 58 }
45 - ++sp_elements.n_elements; 59 + ++sp_size;
46 } 60 }
47 } else { 61 } else {
48 elements = std::move(v); 62 elements = std::move(v);
49 } 63 }
50 } 64 }
51 65
52 -QPDF_Array::QPDF_Array(SparseOHArray const& items) :  
53 - QPDFValue(::ot_array, "array"),  
54 - sparse(true),  
55 - sp_elements(items)  
56 -  
57 -{  
58 -}  
59 -  
60 -QPDF_Array::QPDF_Array(std::vector<std::shared_ptr<QPDFObject>> const& items) :  
61 - QPDFValue(::ot_array, "array"),  
62 - sparse(false),  
63 - elements(items)  
64 -{  
65 -}  
66 -  
67 std::shared_ptr<QPDFObject> 66 std::shared_ptr<QPDFObject>
68 QPDF_Array::create(std::vector<QPDFObjectHandle> const& items) 67 QPDF_Array::create(std::vector<QPDFObjectHandle> const& items)
69 { 68 {
@@ -78,36 +77,20 @@ QPDF_Array::create( @@ -78,36 +77,20 @@ QPDF_Array::create(
78 } 77 }
79 78
80 std::shared_ptr<QPDFObject> 79 std::shared_ptr<QPDFObject>
81 -QPDF_Array::create(SparseOHArray const& items)  
82 -{  
83 - return do_create(new QPDF_Array(items));  
84 -}  
85 -  
86 -std::shared_ptr<QPDFObject>  
87 -QPDF_Array::create(std::vector<std::shared_ptr<QPDFObject>> const& items)  
88 -{  
89 - return do_create(new QPDF_Array(items));  
90 -}  
91 -  
92 -std::shared_ptr<QPDFObject>  
93 QPDF_Array::copy(bool shallow) 80 QPDF_Array::copy(bool shallow)
94 { 81 {
95 if (shallow) { 82 if (shallow) {
96 - if (sparse) {  
97 - return create(sp_elements);  
98 - } else {  
99 - return create(elements);  
100 - } 83 + return do_create(new QPDF_Array(*this));
101 } else { 84 } else {
102 if (sparse) { 85 if (sparse) {
103 - SparseOHArray result;  
104 - result.n_elements = sp_elements.n_elements;  
105 - for (auto const& element: sp_elements.elements) { 86 + QPDF_Array* result = new QPDF_Array();
  87 + result->sp_size = sp_size;
  88 + for (auto const& element: sp_elements) {
106 auto const& obj = element.second; 89 auto const& obj = element.second;
107 - result.elements[element.first] = 90 + result->sp_elements[element.first] =
108 obj->getObjGen().isIndirect() ? obj : obj->copy(); 91 obj->getObjGen().isIndirect() ? obj : obj->copy();
109 } 92 }
110 - return create(std::move(result)); 93 + return do_create(result);
111 } else { 94 } else {
112 std::vector<std::shared_ptr<QPDFObject>> result; 95 std::vector<std::shared_ptr<QPDFObject>> result;
113 result.reserve(elements.size()); 96 result.reserve(elements.size());
@@ -118,7 +101,7 @@ QPDF_Array::copy(bool shallow) @@ -118,7 +101,7 @@ QPDF_Array::copy(bool shallow)
118 : element->copy()) 101 : element->copy())
119 : element); 102 : element);
120 } 103 }
121 - return create(std::move(result)); 104 + return create(std::move(result), false);
122 } 105 }
123 } 106 }
124 } 107 }
@@ -127,7 +110,7 @@ void @@ -127,7 +110,7 @@ void
127 QPDF_Array::disconnect() 110 QPDF_Array::disconnect()
128 { 111 {
129 if (sparse) { 112 if (sparse) {
130 - for (auto& item: sp_elements.elements) { 113 + for (auto& item: sp_elements) {
131 auto& obj = item.second; 114 auto& obj = item.second;
132 if (!obj->getObjGen().isIndirect()) { 115 if (!obj->getObjGen().isIndirect()) {
133 obj->disconnect(); 116 obj->disconnect();
@@ -147,8 +130,7 @@ QPDF_Array::unparse() @@ -147,8 +130,7 @@ QPDF_Array::unparse()
147 { 130 {
148 if (sparse) { 131 if (sparse) {
149 std::string result = "[ "; 132 std::string result = "[ ";
150 - int size = sp_elements.size();  
151 - for (int i = 0; i < size; ++i) { 133 + for (int i = 0; i < sp_size; ++i) {
152 result += at(i).unparse(); 134 result += at(i).unparse();
153 result += " "; 135 result += " ";
154 } 136 }
@@ -171,8 +153,7 @@ QPDF_Array::getJSON(int json_version) @@ -171,8 +153,7 @@ QPDF_Array::getJSON(int json_version)
171 { 153 {
172 if (sparse) { 154 if (sparse) {
173 JSON j = JSON::makeArray(); 155 JSON j = JSON::makeArray();
174 - int size = sp_elements.size();  
175 - for (int i = 0; i < size; ++i) { 156 + for (int i = 0; i < sp_size; ++i) {
176 j.addArrayElement(at(i).getJSON(json_version)); 157 j.addArrayElement(at(i).getJSON(json_version));
177 } 158 }
178 return j; 159 return j;
@@ -192,8 +173,8 @@ QPDF_Array::at(int n) const noexcept @@ -192,8 +173,8 @@ QPDF_Array::at(int n) const noexcept
192 if (n < 0 || n >= size()) { 173 if (n < 0 || n >= size()) {
193 return {}; 174 return {};
194 } else if (sparse) { 175 } else if (sparse) {
195 - auto const& iter = sp_elements.elements.find(n);  
196 - return iter == sp_elements.elements.end() ? null_oh : (*iter).second; 176 + auto const& iter = sp_elements.find(n);
  177 + return iter == sp_elements.end() ? null_oh : (*iter).second;
197 } else { 178 } else {
198 return elements[size_t(n)]; 179 return elements[size_t(n)];
199 } 180 }
@@ -205,7 +186,7 @@ QPDF_Array::getAsVector() const @@ -205,7 +186,7 @@ QPDF_Array::getAsVector() const
205 if (sparse) { 186 if (sparse) {
206 std::vector<QPDFObjectHandle> v; 187 std::vector<QPDFObjectHandle> v;
207 v.reserve(size_t(size())); 188 v.reserve(size_t(size()));
208 - for (auto const& item: sp_elements.elements) { 189 + for (auto const& item: sp_elements) {
209 v.resize(size_t(item.first), null_oh); 190 v.resize(size_t(item.first), null_oh);
210 v.push_back(item.second); 191 v.push_back(item.second);
211 } 192 }
@@ -224,7 +205,7 @@ QPDF_Array::setAt(int at, QPDFObjectHandle const&amp; oh) @@ -224,7 +205,7 @@ QPDF_Array::setAt(int at, QPDFObjectHandle const&amp; oh)
224 } 205 }
225 checkOwnership(oh); 206 checkOwnership(oh);
226 if (sparse) { 207 if (sparse) {
227 - sp_elements.elements[at] = oh.getObj(); 208 + sp_elements[at] = oh.getObj();
228 } else { 209 } else {
229 elements[size_t(at)] = oh.getObj(); 210 elements[size_t(at)] = oh.getObj();
230 } 211 }
@@ -254,19 +235,19 @@ QPDF_Array::insert(int at, QPDFObjectHandle const&amp; item) @@ -254,19 +235,19 @@ QPDF_Array::insert(int at, QPDFObjectHandle const&amp; item)
254 } else { 235 } else {
255 checkOwnership(item); 236 checkOwnership(item);
256 if (sparse) { 237 if (sparse) {
257 - auto iter = sp_elements.elements.crbegin();  
258 - while (iter != sp_elements.elements.crend()) { 238 + auto iter = sp_elements.crbegin();
  239 + while (iter != sp_elements.crend()) {
259 auto key = (iter++)->first; 240 auto key = (iter++)->first;
260 if (key >= at) { 241 if (key >= at) {
261 - auto nh = sp_elements.elements.extract(key); 242 + auto nh = sp_elements.extract(key);
262 ++nh.key(); 243 ++nh.key();
263 - sp_elements.elements.insert(std::move(nh)); 244 + sp_elements.insert(std::move(nh));
264 } else { 245 } else {
265 break; 246 break;
266 } 247 }
267 } 248 }
268 - sp_elements.elements[at] = item.getObj();  
269 - ++sp_elements.n_elements; 249 + sp_elements[at] = item.getObj();
  250 + ++sp_size;
270 } else { 251 } else {
271 elements.insert(elements.cbegin() + at, item.getObj()); 252 elements.insert(elements.cbegin() + at, item.getObj());
272 } 253 }
@@ -279,7 +260,7 @@ QPDF_Array::push_back(QPDFObjectHandle const&amp; item) @@ -279,7 +260,7 @@ QPDF_Array::push_back(QPDFObjectHandle const&amp; item)
279 { 260 {
280 checkOwnership(item); 261 checkOwnership(item);
281 if (sparse) { 262 if (sparse) {
282 - sp_elements.elements[sp_elements.n_elements++] = item.getObj(); 263 + sp_elements[sp_size++] = item.getObj();
283 } else { 264 } else {
284 elements.push_back(item.getObj()); 265 elements.push_back(item.getObj());
285 } 266 }
@@ -292,20 +273,20 @@ QPDF_Array::erase(int at) @@ -292,20 +273,20 @@ QPDF_Array::erase(int at)
292 return false; 273 return false;
293 } 274 }
294 if (sparse) { 275 if (sparse) {
295 - auto end = sp_elements.elements.end();  
296 - if (auto iter = sp_elements.elements.lower_bound(at); iter != end) { 276 + auto end = sp_elements.end();
  277 + if (auto iter = sp_elements.lower_bound(at); iter != end) {
297 if (iter->first == at) { 278 if (iter->first == at) {
298 iter++; 279 iter++;
299 - sp_elements.elements.erase(at); 280 + sp_elements.erase(at);
300 } 281 }
301 282
302 while (iter != end) { 283 while (iter != end) {
303 - auto nh = sp_elements.elements.extract(iter++); 284 + auto nh = sp_elements.extract(iter++);
304 --nh.key(); 285 --nh.key();
305 - sp_elements.elements.insert(std::move(nh)); 286 + sp_elements.insert(std::move(nh));
306 } 287 }
307 } 288 }
308 - --sp_elements.n_elements; 289 + --sp_size;
309 } else { 290 } else {
310 elements.erase(elements.cbegin() + at); 291 elements.erase(elements.cbegin() + at);
311 } 292 }
libqpdf/SparseOHArray.cc deleted
No preview for this file type
libqpdf/qpdf/QPDF_Array.hh
@@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
3 3
4 #include <qpdf/QPDFValue.hh> 4 #include <qpdf/QPDFValue.hh>
5 5
6 -#include <qpdf/SparseOHArray.hh> 6 +#include <map>
7 #include <vector> 7 #include <vector>
8 8
9 class QPDF_Array: public QPDFValue 9 class QPDF_Array: public QPDFValue
@@ -14,9 +14,6 @@ class QPDF_Array: public QPDFValue @@ -14,9 +14,6 @@ class QPDF_Array: public QPDFValue
14 create(std::vector<QPDFObjectHandle> const& items); 14 create(std::vector<QPDFObjectHandle> const& items);
15 static std::shared_ptr<QPDFObject> 15 static std::shared_ptr<QPDFObject>
16 create(std::vector<std::shared_ptr<QPDFObject>>&& items, bool sparse); 16 create(std::vector<std::shared_ptr<QPDFObject>>&& items, bool sparse);
17 - static std::shared_ptr<QPDFObject> create(SparseOHArray const& items);  
18 - static std::shared_ptr<QPDFObject>  
19 - create(std::vector<std::shared_ptr<QPDFObject>> const& items);  
20 virtual std::shared_ptr<QPDFObject> copy(bool shallow = false); 17 virtual std::shared_ptr<QPDFObject> copy(bool shallow = false);
21 virtual std::string unparse(); 18 virtual std::string unparse();
22 virtual JSON getJSON(int json_version); 19 virtual JSON getJSON(int json_version);
@@ -25,7 +22,7 @@ class QPDF_Array: public QPDFValue @@ -25,7 +22,7 @@ class QPDF_Array: public QPDFValue
25 int 22 int
26 size() const noexcept 23 size() const noexcept
27 { 24 {
28 - return sparse ? sp_elements.size() : int(elements.size()); 25 + return sparse ? sp_size : int(elements.size());
29 } 26 }
30 QPDFObjectHandle at(int n) const noexcept; 27 QPDFObjectHandle at(int n) const noexcept;
31 bool setAt(int n, QPDFObjectHandle const& oh); 28 bool setAt(int n, QPDFObjectHandle const& oh);
@@ -36,15 +33,16 @@ class QPDF_Array: public QPDFValue @@ -36,15 +33,16 @@ class QPDF_Array: public QPDFValue
36 bool erase(int at); 33 bool erase(int at);
37 34
38 private: 35 private:
  36 + QPDF_Array();
  37 + QPDF_Array(QPDF_Array const&);
39 QPDF_Array(std::vector<QPDFObjectHandle> const& items); 38 QPDF_Array(std::vector<QPDFObjectHandle> const& items);
40 QPDF_Array(std::vector<std::shared_ptr<QPDFObject>>&& items, bool sparse); 39 QPDF_Array(std::vector<std::shared_ptr<QPDFObject>>&& items, bool sparse);
41 - QPDF_Array(SparseOHArray const& items);  
42 - QPDF_Array(std::vector<std::shared_ptr<QPDFObject>> const& items);  
43 40
44 void checkOwnership(QPDFObjectHandle const& item) const; 41 void checkOwnership(QPDFObjectHandle const& item) const;
45 42
46 bool sparse{false}; 43 bool sparse{false};
47 - SparseOHArray sp_elements; 44 + int sp_size{0};
  45 + std::map<int, std::shared_ptr<QPDFObject>> sp_elements;
48 std::vector<std::shared_ptr<QPDFObject>> elements; 46 std::vector<std::shared_ptr<QPDFObject>> elements;
49 }; 47 };
50 48
libqpdf/qpdf/SparseOHArray.hh deleted
1 -#ifndef QPDF_SPARSEOHARRAY_HH  
2 -#define QPDF_SPARSEOHARRAY_HH  
3 -  
4 -#include <qpdf/QPDFObjectHandle.hh>  
5 -#include <qpdf/QPDFObject_private.hh>  
6 -#include <map>  
7 -  
8 -class QPDF_Array;  
9 -  
10 -class SparseOHArray  
11 -{  
12 - public:  
13 - SparseOHArray() = default;  
14 - int  
15 - size() const noexcept  
16 - {  
17 - return n_elements;  
18 - }  
19 -  
20 - private:  
21 - friend class QPDF_Array;  
22 - std::map<int, std::shared_ptr<QPDFObject>> elements;  
23 - int n_elements{0};  
24 -};  
25 -  
26 -#endif // QPDF_SPARSEOHARRAY_HH  
libtests/sparse_array.cc
1 #include <qpdf/assert_test.h> 1 #include <qpdf/assert_test.h>
2 2
3 #include <qpdf/QPDFObjectHandle.hh> 3 #include <qpdf/QPDFObjectHandle.hh>
  4 +#include <qpdf/QPDFObject_private.hh>
4 #include <qpdf/QPDF_Array.hh> 5 #include <qpdf/QPDF_Array.hh>
5 #include <iostream> 6 #include <iostream>
6 7