diff options
author | m-holger <m-holger@kubitscheck.org> | 2023-03-26 21:02:49 +0200 |
---|---|---|
committer | m-holger <m-holger@kubitscheck.org> | 2023-03-29 13:10:19 +0200 |
commit | 8fdc3f09648ad2c79455363255b9f8fdac9e65f3 (patch) | |
tree | ed76678105360f7de31e17efd27663831743399e /libqpdf/QPDF_Array.cc | |
parent | 18c1ffe0df335a46cddbeb96e2cb939d850df9fa (diff) | |
download | qpdf-8fdc3f09648ad2c79455363255b9f8fdac9e65f3.tar.zst |
Optimize QPDFParser for non-sparse QPDF_Arrays
Stop using nullptr to represent null objects.
Count null array elements and trigger creation of sparse arrays if null count is
greater than 100.
Diffstat (limited to 'libqpdf/QPDF_Array.cc')
-rw-r--r-- | libqpdf/QPDF_Array.cc | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/libqpdf/QPDF_Array.cc b/libqpdf/QPDF_Array.cc index 7a3a29ca..31abd8eb 100644 --- a/libqpdf/QPDF_Array.cc +++ b/libqpdf/QPDF_Array.cc @@ -11,15 +11,19 @@ QPDF_Array::QPDF_Array(std::vector<QPDFObjectHandle> const& v) : setFromVector(v); } -QPDF_Array::QPDF_Array(std::vector<std::shared_ptr<QPDFObject>>&& v) : - QPDFValue(::ot_array, "array") +QPDF_Array::QPDF_Array( + std::vector<std::shared_ptr<QPDFObject>>&& v, bool sparse) : + QPDFValue(::ot_array, "array"), + sparse(sparse) { setFromVector(std::move(v)); } QPDF_Array::QPDF_Array(SparseOHArray const& items) : QPDFValue(::ot_array, "array"), + sparse(true), sp_elements(items) + { } @@ -37,9 +41,10 @@ QPDF_Array::create(std::vector<QPDFObjectHandle> const& items) } std::shared_ptr<QPDFObject> -QPDF_Array::create(std::vector<std::shared_ptr<QPDFObject>>&& items) +QPDF_Array::create( + std::vector<std::shared_ptr<QPDFObject>>&& items, bool sparse) { - return do_create(new QPDF_Array(std::move(items))); + return do_create(new QPDF_Array(std::move(items), sparse)); } std::shared_ptr<QPDFObject> @@ -196,8 +201,9 @@ QPDF_Array::setFromVector(std::vector<std::shared_ptr<QPDFObject>>&& v) if (sparse) { sp_elements = SparseOHArray(); for (auto&& item: v) { - if (item) { - sp_elements.append(item); + if (item->getTypeCode() != ::ot_null || + item->getObjGen().isIndirect()) { + sp_elements.append(std::move(item)); } else { ++sp_elements.n_elements; } |