summaryrefslogtreecommitdiffstats
path: root/libqpdf/QPDF_Array.cc
diff options
context:
space:
mode:
authorm-holger <m-holger@kubitscheck.org>2023-03-26 21:02:49 +0200
committerm-holger <m-holger@kubitscheck.org>2023-03-29 13:10:19 +0200
commit8fdc3f09648ad2c79455363255b9f8fdac9e65f3 (patch)
treeed76678105360f7de31e17efd27663831743399e /libqpdf/QPDF_Array.cc
parent18c1ffe0df335a46cddbeb96e2cb939d850df9fa (diff)
downloadqpdf-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.cc18
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;
}