aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/QPDF_Array.cc
diff options
context:
space:
mode:
authorm-holger <m-holger@kubitscheck.org>2023-03-25 19:05:54 +0100
committerm-holger <m-holger@kubitscheck.org>2023-03-29 14:15:39 +0200
commit9e30de80326ad88c155725c66e3d444232119deb (patch)
tree15ae0fe4f0116b5dc3c54dc94a78ecee186cfe79 /libqpdf/QPDF_Array.cc
parent0db65e79120e66069a37906845a984457b711b6f (diff)
downloadqpdf-9e30de80326ad88c155725c66e3d444232119deb.tar.zst
Remove temporary OHArray::erase, insert and copy
Diffstat (limited to 'libqpdf/QPDF_Array.cc')
-rw-r--r--libqpdf/QPDF_Array.cc32
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);
}
}