diff --git a/libqpdf/QPDF_Array.cc b/libqpdf/QPDF_Array.cc index 18bec61..b160a82 100644 --- a/libqpdf/QPDF_Array.cc +++ b/libqpdf/QPDF_Array.cc @@ -285,43 +285,48 @@ Array::setFromVector(std::vector const& v) } bool -Array::insert(int at_i, QPDFObjectHandle const& item) +Array::insert(size_t at, QPDFObjectHandle const& item) { auto a = array(); size_t sz = size(); - if (at_i < 0) { - return false; - } - size_t at = to_s(at_i); if (at > sz) { return false; } + checkOwnership(item); if (at == sz) { // As special case, also allow insert beyond the end push_back(item); return true; } - checkOwnership(item); - if (a->sp) { - auto iter = a->sp->elements.crbegin(); - while (iter != a->sp->elements.crend()) { - auto key = (iter++)->first; - if (key >= at) { - auto nh = a->sp->elements.extract(key); - ++nh.key(); - a->sp->elements.insert(std::move(nh)); - } else { - break; - } + if (!a->sp) { + a->elements.insert(a->elements.cbegin() + to_i(at), item); + return true; + } + auto iter = a->sp->elements.crbegin(); + while (iter != a->sp->elements.crend()) { + auto key = (iter++)->first; + if (key >= at) { + auto nh = a->sp->elements.extract(key); + ++nh.key(); + a->sp->elements.insert(std::move(nh)); + } else { + break; } - a->sp->elements[at] = item; - ++a->sp->size; - } else { - a->elements.insert(a->elements.cbegin() + at_i, item); } + a->sp->elements[at] = item; + ++a->sp->size; return true; } +bool +Array::insert(int at_i, QPDFObjectHandle const& item) +{ + if (at_i < 0) { + return false; + } + return insert(to_s(at_i), item); +} + void Array::push_back(QPDFObjectHandle const& item) { diff --git a/libqpdf/qpdf/QPDFObjectHandle_private.hh b/libqpdf/qpdf/QPDFObjectHandle_private.hh index 2f9da1e..e792a58 100644 --- a/libqpdf/qpdf/QPDFObjectHandle_private.hh +++ b/libqpdf/qpdf/QPDFObjectHandle_private.hh @@ -96,6 +96,7 @@ namespace qpdf QPDFObjectHandle get(int n) const; bool set(size_t at, QPDFObjectHandle const& oh); bool set(int at, QPDFObjectHandle const& oh); + bool insert(size_t at, QPDFObjectHandle const& item); bool insert(int at, QPDFObjectHandle const& item); void push_back(QPDFObjectHandle const& item); bool erase(int at);