Commit a7b6975132eed94905eb784a0e267e575cade2cb
1 parent
d3f2dc32
Remove SparseOHArray
Showing
7 changed files
with
51 additions
and
100 deletions
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& item) const | @@ -24,6 +25,20 @@ QPDF_Array::checkOwnership(QPDFObjectHandle const& 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& oh) | @@ -224,7 +205,7 @@ QPDF_Array::setAt(int at, QPDFObjectHandle const& 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& item) | @@ -254,19 +235,19 @@ QPDF_Array::insert(int at, QPDFObjectHandle const& 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& item) | @@ -279,7 +260,7 @@ QPDF_Array::push_back(QPDFObjectHandle const& 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