diff options
author | m-holger <m-holger@kubitscheck.org> | 2023-03-25 19:05:54 +0100 |
---|---|---|
committer | m-holger <m-holger@kubitscheck.org> | 2023-03-29 14:15:39 +0200 |
commit | 9e30de80326ad88c155725c66e3d444232119deb (patch) | |
tree | 15ae0fe4f0116b5dc3c54dc94a78ecee186cfe79 /libqpdf/QPDF_Array.cc | |
parent | 0db65e79120e66069a37906845a984457b711b6f (diff) | |
download | qpdf-9e30de80326ad88c155725c66e3d444232119deb.tar.zst |
Remove temporary OHArray::erase, insert and copy
Diffstat (limited to 'libqpdf/QPDF_Array.cc')
-rw-r--r-- | libqpdf/QPDF_Array.cc | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/libqpdf/QPDF_Array.cc b/libqpdf/QPDF_Array.cc index ce08332a..c7a9f315 100644 --- a/libqpdf/QPDF_Array.cc +++ b/libqpdf/QPDF_Array.cc @@ -67,7 +67,20 @@ QPDF_Array::copy(bool shallow) if (sparse) { return create(shallow ? sp_elements : sp_elements.copy()); } else { - return create(shallow ? elements : elements.copy()); + if (shallow) { + return create(elements); + } else { + OHArray result; + result.elements.reserve(elements.elements.size()); + for (auto const& element: elements.elements) { + result.elements.push_back( + element + ? (element->getObjGen().isIndirect() ? element + : element->copy()) + : element); + } + return create(result); + } } } @@ -237,11 +250,19 @@ 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 + size_t idx = QIntC::to_size(at); if ((at < 0) || (at > QIntC::to_int(elements.elements.size()))) { throw std::logic_error( "INTERNAL ERROR: bounds error accessing QPDF_Array element"); } - elements.insert(QIntC::to_size(at), item); + if (idx == elements.elements.size()) { + // Allow inserting to the last position + elements.elements.push_back(item.getObj()); + } else { + int n = int(idx); + elements.elements.insert( + elements.elements.cbegin() + n, item.getObj()); + } } } @@ -261,6 +282,11 @@ QPDF_Array::eraseItem(int at) if (sparse) { sp_elements.erase(QIntC::to_size(at)); } else { - elements.erase(QIntC::to_size(at)); + size_t idx = QIntC::to_size(at); + if (idx >= elements.elements.size()) { + throw std::logic_error("bounds error erasing item from OHArray"); + } + int n = int(idx); + elements.elements.erase(elements.elements.cbegin() + n); } } |