From 38cf7c16283ec2d476514a54e2b1a7016b0b770a Mon Sep 17 00:00:00 2001 From: m-holger Date: Sat, 25 Mar 2023 15:30:52 +0000 Subject: Add separate sparse mode to QPDF_Array Add temporary clone of SparseOHArray to implement non-sparse mode. --- include/qpdf/QPDFObjectHandle.hh | 1 + 1 file changed, 1 insertion(+) (limited to 'include') diff --git a/include/qpdf/QPDFObjectHandle.hh b/include/qpdf/QPDFObjectHandle.hh index 77fe680f..b722b083 100644 --- a/include/qpdf/QPDFObjectHandle.hh +++ b/include/qpdf/QPDFObjectHandle.hh @@ -1497,6 +1497,7 @@ class QPDFObjectHandle friend class QPDF_Dictionary; friend class QPDF_Stream; friend class SparseOHArray; + friend class OHArray; private: static void -- cgit v1.2.3-54-g00ecf From ad2875a4aa6cc22e32bbaa848ae71619ff51c138 Mon Sep 17 00:00:00 2001 From: m-holger Date: Sat, 25 Mar 2023 16:37:47 +0000 Subject: Remove temporary OHArray::size, append and remove_last Also, add const overload of QPDFObjectHandle::getObj --- include/qpdf/QPDFObjectHandle.hh | 5 +++++ libqpdf/OHArray.cc | 20 +------------------- libqpdf/QPDF_Array.cc | 18 +++++++++--------- libqpdf/qpdf/OHArray.hh | 3 --- 4 files changed, 15 insertions(+), 31 deletions(-) (limited to 'include') diff --git a/include/qpdf/QPDFObjectHandle.hh b/include/qpdf/QPDFObjectHandle.hh index b722b083..5166e198 100644 --- a/include/qpdf/QPDFObjectHandle.hh +++ b/include/qpdf/QPDFObjectHandle.hh @@ -1578,6 +1578,11 @@ class QPDFObjectHandle { return obj; } + std::shared_ptr + getObj() const + { + return obj; + } QPDFObject* getObjectPtr() { diff --git a/libqpdf/OHArray.cc b/libqpdf/OHArray.cc index e25e1239..22b99b13 100644 --- a/libqpdf/OHArray.cc +++ b/libqpdf/OHArray.cc @@ -11,24 +11,6 @@ OHArray::OHArray() { } -size_t -OHArray::size() const -{ - return elements.size(); -} - -void -OHArray::append(QPDFObjectHandle oh) -{ - elements.push_back(oh.getObj()); -} - -void -OHArray::append(std::shared_ptr&& obj) -{ - elements.push_back(std::move(obj)); -} - QPDFObjectHandle OHArray::at(size_t idx) const { @@ -77,7 +59,7 @@ OHArray::insert(size_t idx, QPDFObjectHandle oh) throw std::logic_error("bounds error inserting item to OHArray"); } else if (idx == elements.size()) { // Allow inserting to the last position - append(oh.getObj()); + elements.push_back(oh.getObj()); } else { int n = int(idx); elements.insert(elements.cbegin() + n, oh.getObj()); diff --git a/libqpdf/QPDF_Array.cc b/libqpdf/QPDF_Array.cc index 31abd8eb..afe33827 100644 --- a/libqpdf/QPDF_Array.cc +++ b/libqpdf/QPDF_Array.cc @@ -93,7 +93,7 @@ QPDF_Array::unparse() return result; } else { std::string result = "[ "; - size_t size = elements.size(); + size_t size = elements.elements.size(); for (size_t i = 0; i < size; ++i) { result += elements.at(i).unparse(); result += " "; @@ -115,7 +115,7 @@ QPDF_Array::getJSON(int json_version) return j; } else { JSON j = JSON::makeArray(); - size_t size = elements.size(); + size_t size = elements.elements.size(); for (size_t i = 0; i < size; ++i) { j.addArrayElement(elements.at(i).getJSON(json_version)); } @@ -131,7 +131,7 @@ QPDF_Array::getNItems() const // a lot of code. return QIntC::to_int(sp_elements.size()); } else { - return QIntC::to_int(elements.size()); + return QIntC::to_int(elements.elements.size()); } } @@ -145,7 +145,7 @@ QPDF_Array::getItem(int n) const } return sp_elements.at(QIntC::to_size(n)); } else { - if ((n < 0) || (n >= QIntC::to_int(elements.size()))) { + if ((n < 0) || (n >= QIntC::to_int(elements.elements.size()))) { throw std::logic_error( "INTERNAL ERROR: bounds error accessing QPDF_Array element"); } @@ -162,7 +162,7 @@ QPDF_Array::getAsVector(std::vector& v) const v.push_back(sp_elements.at(i)); } } else { - size_t size = elements.size(); + size_t size = elements.elements.size(); for (size_t i = 0; i < size; ++i) { v.push_back(elements.at(i)); } @@ -190,7 +190,7 @@ QPDF_Array::setFromVector(std::vector const& v) } else { elements = OHArray(); for (auto const& iter: v) { - elements.append(iter); + elements.elements.push_back(iter.getObj()); } } } @@ -211,7 +211,7 @@ QPDF_Array::setFromVector(std::vector>&& v) } else { elements = OHArray(); for (auto&& item: v) { - elements.append(std::move(item)); + elements.elements.push_back(std::move(item)); } } } @@ -228,7 +228,7 @@ QPDF_Array::insertItem(int at, QPDFObjectHandle const& item) sp_elements.insert(QIntC::to_size(at), item); } else { // As special case, also allow insert beyond the end - if ((at < 0) || (at > QIntC::to_int(elements.size()))) { + if ((at < 0) || (at > QIntC::to_int(elements.elements.size()))) { throw std::logic_error( "INTERNAL ERROR: bounds error accessing QPDF_Array element"); } @@ -242,7 +242,7 @@ QPDF_Array::appendItem(QPDFObjectHandle const& item) if (sparse) { sp_elements.append(item); } else { - elements.append(item); + elements.elements.push_back(item.getObj()); } } diff --git a/libqpdf/qpdf/OHArray.hh b/libqpdf/qpdf/OHArray.hh index e6dc9524..a87cd6b5 100644 --- a/libqpdf/qpdf/OHArray.hh +++ b/libqpdf/qpdf/OHArray.hh @@ -12,9 +12,6 @@ class OHArray { public: OHArray(); - size_t size() const; - void append(QPDFObjectHandle oh); - void append(std::shared_ptr&& obj); QPDFObjectHandle at(size_t idx) const; void setAt(size_t idx, QPDFObjectHandle oh); void erase(size_t idx); -- cgit v1.2.3-54-g00ecf From 0db65e79120e66069a37906845a984457b711b6f Mon Sep 17 00:00:00 2001 From: m-holger Date: Sat, 25 Mar 2023 17:23:19 +0000 Subject: Remove temporary OHArray::disconnect and setAt --- include/qpdf/QPDFObjectHandle.hh | 4 ++-- libqpdf/OHArray.cc | 20 -------------------- libqpdf/QPDF_Array.cc | 12 ++++++++++-- libqpdf/qpdf/OHArray.hh | 2 -- 4 files changed, 12 insertions(+), 26 deletions(-) (limited to 'include') diff --git a/include/qpdf/QPDFObjectHandle.hh b/include/qpdf/QPDFObjectHandle.hh index 5166e198..ecb50ba0 100644 --- a/include/qpdf/QPDFObjectHandle.hh +++ b/include/qpdf/QPDFObjectHandle.hh @@ -1494,14 +1494,14 @@ class QPDFObjectHandle // disconnected(). class DisconnectAccess { + friend class QPDF_Array; friend class QPDF_Dictionary; friend class QPDF_Stream; friend class SparseOHArray; - friend class OHArray; private: static void - disconnect(QPDFObjectHandle& o) + disconnect(QPDFObjectHandle o) { o.disconnect(); } diff --git a/libqpdf/OHArray.cc b/libqpdf/OHArray.cc index dc01421f..ce6a595e 100644 --- a/libqpdf/OHArray.cc +++ b/libqpdf/OHArray.cc @@ -11,26 +11,6 @@ OHArray::OHArray() { } -void -OHArray::disconnect() -{ - for (auto const& iter: elements) { - if (iter) { - QPDFObjectHandle oh = iter; - QPDFObjectHandle::DisconnectAccess::disconnect(oh); - } - } -} - -void -OHArray::setAt(size_t idx, QPDFObjectHandle oh) -{ - if (idx >= elements.size()) { - throw std::logic_error("bounds error setting item in OHArray"); - } - elements[idx] = oh.getObj(); -} - void OHArray::erase(size_t idx) { diff --git a/libqpdf/QPDF_Array.cc b/libqpdf/QPDF_Array.cc index b86c3f0a..ce08332a 100644 --- a/libqpdf/QPDF_Array.cc +++ b/libqpdf/QPDF_Array.cc @@ -77,7 +77,11 @@ QPDF_Array::disconnect() if (sparse) { sp_elements.disconnect(); } else { - elements.disconnect(); + for (auto const& iter: elements.elements) { + if (iter) { + QPDFObjectHandle::DisconnectAccess::disconnect(iter); + } + } } } @@ -176,7 +180,11 @@ QPDF_Array::setItem(int n, QPDFObjectHandle const& oh) if (sparse) { sp_elements.setAt(QIntC::to_size(n), oh); } else { - elements.setAt(QIntC::to_size(n), oh); + size_t idx = size_t(n); + if (n < 0 || idx >= elements.elements.size()) { + throw std::logic_error("bounds error setting item in QPDF_Array"); + } + elements.elements[idx] = oh.getObj(); } } diff --git a/libqpdf/qpdf/OHArray.hh b/libqpdf/qpdf/OHArray.hh index e8abc8b3..e4d880db 100644 --- a/libqpdf/qpdf/OHArray.hh +++ b/libqpdf/qpdf/OHArray.hh @@ -12,11 +12,9 @@ class OHArray { public: OHArray(); - void setAt(size_t idx, QPDFObjectHandle oh); void erase(size_t idx); void insert(size_t idx, QPDFObjectHandle oh); OHArray copy(); - void disconnect(); private: friend class QPDF_Array; -- cgit v1.2.3-54-g00ecf From a171ebb9427e41559efbeb1f144a19b73bb3eca6 Mon Sep 17 00:00:00 2001 From: m-holger Date: Sun, 11 Dec 2022 16:13:19 +0000 Subject: Refactor QPDF_Array::disconnect --- include/qpdf/QPDFObjectHandle.hh | 2 -- libqpdf/QPDF_Array.cc | 13 +++++++++---- libqpdf/SparseOHArray.cc | 8 -------- libqpdf/qpdf/SparseOHArray.hh | 1 - 4 files changed, 9 insertions(+), 15 deletions(-) (limited to 'include') diff --git a/include/qpdf/QPDFObjectHandle.hh b/include/qpdf/QPDFObjectHandle.hh index ecb50ba0..ee424e39 100644 --- a/include/qpdf/QPDFObjectHandle.hh +++ b/include/qpdf/QPDFObjectHandle.hh @@ -1494,10 +1494,8 @@ class QPDFObjectHandle // disconnected(). class DisconnectAccess { - friend class QPDF_Array; friend class QPDF_Dictionary; friend class QPDF_Stream; - friend class SparseOHArray; private: static void diff --git a/libqpdf/QPDF_Array.cc b/libqpdf/QPDF_Array.cc index afec05af..1f1ce55a 100644 --- a/libqpdf/QPDF_Array.cc +++ b/libqpdf/QPDF_Array.cc @@ -116,11 +116,16 @@ void QPDF_Array::disconnect() { if (sparse) { - sp_elements.disconnect(); + for (auto& item: sp_elements.elements) { + auto& obj = item.second; + if (!obj->getObjGen().isIndirect()) { + obj->disconnect(); + } + } } else { - for (auto const& iter: elements) { - if (iter) { - QPDFObjectHandle::DisconnectAccess::disconnect(iter); + for (auto& obj: elements) { + if (!obj->getObjGen().isIndirect()) { + obj->disconnect(); } } } diff --git a/libqpdf/SparseOHArray.cc b/libqpdf/SparseOHArray.cc index 6a1c976a..c830d035 100644 --- a/libqpdf/SparseOHArray.cc +++ b/libqpdf/SparseOHArray.cc @@ -1,13 +1,5 @@ #include -void -SparseOHArray::disconnect() -{ - for (auto& iter: this->elements) { - QPDFObjectHandle::DisconnectAccess::disconnect(iter.second); - } -} - SparseOHArray SparseOHArray::copy() { diff --git a/libqpdf/qpdf/SparseOHArray.hh b/libqpdf/qpdf/SparseOHArray.hh index 1b31f266..e7733472 100644 --- a/libqpdf/qpdf/SparseOHArray.hh +++ b/libqpdf/qpdf/SparseOHArray.hh @@ -17,7 +17,6 @@ class SparseOHArray return n_elements; } SparseOHArray copy(); - void disconnect(); private: friend class QPDF_Array; -- cgit v1.2.3-54-g00ecf