diff --git a/libqpdf/QPDF_Array.cc b/libqpdf/QPDF_Array.cc index b160a82..2e9ba73 100644 --- a/libqpdf/QPDF_Array.cc +++ b/libqpdf/QPDF_Array.cc @@ -340,37 +340,42 @@ Array::push_back(QPDFObjectHandle const& item) } bool -Array::erase(int at_i) +Array::erase(size_t at) { auto a = array(); - if (at_i < 0) { - return false; - } - size_t at = to_s(at_i); if (at >= size()) { return false; } - if (a->sp) { - auto end = a->sp->elements.end(); - if (auto iter = a->sp->elements.lower_bound(at); iter != end) { - if (iter->first == at) { - iter++; - a->sp->elements.erase(at); - } + if (!a->sp) { + a->elements.erase(a->elements.cbegin() + to_i(at)); + return true; + } + auto end = a->sp->elements.end(); + if (auto iter = a->sp->elements.lower_bound(at); iter != end) { + if (iter->first == at) { + iter++; + a->sp->elements.erase(at); + } - while (iter != end) { - auto nh = a->sp->elements.extract(iter++); - --nh.key(); - a->sp->elements.insert(std::move(nh)); - } + while (iter != end) { + auto nh = a->sp->elements.extract(iter++); + --nh.key(); + a->sp->elements.insert(std::move(nh)); } - --(a->sp->size); - } else { - a->elements.erase(a->elements.cbegin() + at_i); } + --(a->sp->size); return true; } +bool +Array::erase(int at_i) +{ + if (at_i < 0) { + return false; + } + return erase(to_s(at_i)); +} + int QPDFObjectHandle::getArrayNItems() const { diff --git a/libqpdf/qpdf/QPDFObjectHandle_private.hh b/libqpdf/qpdf/QPDFObjectHandle_private.hh index e792a58..183b792 100644 --- a/libqpdf/qpdf/QPDFObjectHandle_private.hh +++ b/libqpdf/qpdf/QPDFObjectHandle_private.hh @@ -99,6 +99,7 @@ namespace qpdf bool insert(size_t at, QPDFObjectHandle const& item); bool insert(int at, QPDFObjectHandle const& item); void push_back(QPDFObjectHandle const& item); + bool erase(size_t at); bool erase(int at); std::vector getAsVector() const;