Commit a7b6975132eed94905eb784a0e267e575cade2cb

Authored by m-holger
1 parent d3f2dc32

Remove SparseOHArray

libqpdf/CMakeLists.txt
... ... @@ -115,7 +115,6 @@ set(libqpdf_SOURCES
115 115 ResourceFinder.cc
116 116 SecureRandomDataProvider.cc
117 117 SF_FlateLzwDecode.cc
118   - SparseOHArray.cc
119 118 qpdf-c.cc
120 119 qpdfjob-c.cc
121 120 qpdflogger-c.cc)
... ...
libqpdf/QPDFObjectHandle.cc
... ... @@ -23,7 +23,6 @@
23 23 #include <qpdf/QPDF_Stream.hh>
24 24 #include <qpdf/QPDF_String.hh>
25 25 #include <qpdf/QPDF_Unresolved.hh>
26   -#include <qpdf/SparseOHArray.hh>
27 26  
28 27 #include <qpdf/QIntC.hh>
29 28 #include <qpdf/QTC.hh>
... ...
libqpdf/QPDF_Array.cc
1 1 #include <qpdf/QPDF_Array.hh>
2 2  
  3 +#include <qpdf/QPDFObjectHandle.hh>
3 4 #include <qpdf/QPDFObject_private.hh>
4 5  
5 6 static const QPDFObjectHandle null_oh = QPDFObjectHandle::newNull();
... ... @@ -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 42 QPDF_Array::QPDF_Array(std::vector<QPDFObjectHandle> const& v) :
28 43 QPDFValue(::ot_array, "array")
29 44 {
... ... @@ -36,34 +51,18 @@ QPDF_Array::QPDF_Array(
36 51 sparse(sparse)
37 52 {
38 53 if (sparse) {
39   - sp_elements = SparseOHArray();
40 54 for (auto&& item: v) {
41 55 if (item->getTypeCode() != ::ot_null ||
42 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 61 } else {
48 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 66 std::shared_ptr<QPDFObject>
68 67 QPDF_Array::create(std::vector<QPDFObjectHandle> const& items)
69 68 {
... ... @@ -78,36 +77,20 @@ QPDF_Array::create(
78 77 }
79 78  
80 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 80 QPDF_Array::copy(bool shallow)
94 81 {
95 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 84 } else {
102 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 89 auto const& obj = element.second;
107   - result.elements[element.first] =
  90 + result->sp_elements[element.first] =
108 91 obj->getObjGen().isIndirect() ? obj : obj->copy();
109 92 }
110   - return create(std::move(result));
  93 + return do_create(result);
111 94 } else {
112 95 std::vector<std::shared_ptr<QPDFObject>> result;
113 96 result.reserve(elements.size());
... ... @@ -118,7 +101,7 @@ QPDF_Array::copy(bool shallow)
118 101 : element->copy())
119 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 110 QPDF_Array::disconnect()
128 111 {
129 112 if (sparse) {
130   - for (auto& item: sp_elements.elements) {
  113 + for (auto& item: sp_elements) {
131 114 auto& obj = item.second;
132 115 if (!obj->getObjGen().isIndirect()) {
133 116 obj->disconnect();
... ... @@ -147,8 +130,7 @@ QPDF_Array::unparse()
147 130 {
148 131 if (sparse) {
149 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 134 result += at(i).unparse();
153 135 result += " ";
154 136 }
... ... @@ -171,8 +153,7 @@ QPDF_Array::getJSON(int json_version)
171 153 {
172 154 if (sparse) {
173 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 157 j.addArrayElement(at(i).getJSON(json_version));
177 158 }
178 159 return j;
... ... @@ -192,8 +173,8 @@ QPDF_Array::at(int n) const noexcept
192 173 if (n < 0 || n >= size()) {
193 174 return {};
194 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 178 } else {
198 179 return elements[size_t(n)];
199 180 }
... ... @@ -205,7 +186,7 @@ QPDF_Array::getAsVector() const
205 186 if (sparse) {
206 187 std::vector<QPDFObjectHandle> v;
207 188 v.reserve(size_t(size()));
208   - for (auto const& item: sp_elements.elements) {
  189 + for (auto const& item: sp_elements) {
209 190 v.resize(size_t(item.first), null_oh);
210 191 v.push_back(item.second);
211 192 }
... ... @@ -224,7 +205,7 @@ QPDF_Array::setAt(int at, QPDFObjectHandle const&amp; oh)
224 205 }
225 206 checkOwnership(oh);
226 207 if (sparse) {
227   - sp_elements.elements[at] = oh.getObj();
  208 + sp_elements[at] = oh.getObj();
228 209 } else {
229 210 elements[size_t(at)] = oh.getObj();
230 211 }
... ... @@ -254,19 +235,19 @@ QPDF_Array::insert(int at, QPDFObjectHandle const&amp; item)
254 235 } else {
255 236 checkOwnership(item);
256 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 240 auto key = (iter++)->first;
260 241 if (key >= at) {
261   - auto nh = sp_elements.elements.extract(key);
  242 + auto nh = sp_elements.extract(key);
262 243 ++nh.key();
263   - sp_elements.elements.insert(std::move(nh));
  244 + sp_elements.insert(std::move(nh));
264 245 } else {
265 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 251 } else {
271 252 elements.insert(elements.cbegin() + at, item.getObj());
272 253 }
... ... @@ -279,7 +260,7 @@ QPDF_Array::push_back(QPDFObjectHandle const&amp; item)
279 260 {
280 261 checkOwnership(item);
281 262 if (sparse) {
282   - sp_elements.elements[sp_elements.n_elements++] = item.getObj();
  263 + sp_elements[sp_size++] = item.getObj();
283 264 } else {
284 265 elements.push_back(item.getObj());
285 266 }
... ... @@ -292,20 +273,20 @@ QPDF_Array::erase(int at)
292 273 return false;
293 274 }
294 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 278 if (iter->first == at) {
298 279 iter++;
299   - sp_elements.elements.erase(at);
  280 + sp_elements.erase(at);
300 281 }
301 282  
302 283 while (iter != end) {
303   - auto nh = sp_elements.elements.extract(iter++);
  284 + auto nh = sp_elements.extract(iter++);
304 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 290 } else {
310 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 3  
4 4 #include <qpdf/QPDFValue.hh>
5 5  
6   -#include <qpdf/SparseOHArray.hh>
  6 +#include <map>
7 7 #include <vector>
8 8  
9 9 class QPDF_Array: public QPDFValue
... ... @@ -14,9 +14,6 @@ class QPDF_Array: public QPDFValue
14 14 create(std::vector<QPDFObjectHandle> const& items);
15 15 static std::shared_ptr<QPDFObject>
16 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 17 virtual std::shared_ptr<QPDFObject> copy(bool shallow = false);
21 18 virtual std::string unparse();
22 19 virtual JSON getJSON(int json_version);
... ... @@ -25,7 +22,7 @@ class QPDF_Array: public QPDFValue
25 22 int
26 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 27 QPDFObjectHandle at(int n) const noexcept;
31 28 bool setAt(int n, QPDFObjectHandle const& oh);
... ... @@ -36,15 +33,16 @@ class QPDF_Array: public QPDFValue
36 33 bool erase(int at);
37 34  
38 35 private:
  36 + QPDF_Array();
  37 + QPDF_Array(QPDF_Array const&);
39 38 QPDF_Array(std::vector<QPDFObjectHandle> const& items);
40 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 41 void checkOwnership(QPDFObjectHandle const& item) const;
45 42  
46 43 bool sparse{false};
47   - SparseOHArray sp_elements;
  44 + int sp_size{0};
  45 + std::map<int, std::shared_ptr<QPDFObject>> sp_elements;
48 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 1 #include <qpdf/assert_test.h>
2 2  
3 3 #include <qpdf/QPDFObjectHandle.hh>
  4 +#include <qpdf/QPDFObject_private.hh>
4 5 #include <qpdf/QPDF_Array.hh>
5 6 #include <iostream>
6 7  
... ...