Commit 14f445b197beaa2456faa788566d560d316fa13b

Authored by m-holger
1 parent 696802a7

Refactor `Array::erase` to add `size_t` overload, simplify logic, improve bounds…

… checking, and align with `Array` API conventions.
libqpdf/QPDF_Array.cc
@@ -340,37 +340,42 @@ Array::push_back(QPDFObjectHandle const& item) @@ -340,37 +340,42 @@ Array::push_back(QPDFObjectHandle const& item)
340 } 340 }
341 341
342 bool 342 bool
343 -Array::erase(int at_i) 343 +Array::erase(size_t at)
344 { 344 {
345 auto a = array(); 345 auto a = array();
346 - if (at_i < 0) {  
347 - return false;  
348 - }  
349 - size_t at = to_s(at_i);  
350 if (at >= size()) { 346 if (at >= size()) {
351 return false; 347 return false;
352 } 348 }
353 - if (a->sp) {  
354 - auto end = a->sp->elements.end();  
355 - if (auto iter = a->sp->elements.lower_bound(at); iter != end) {  
356 - if (iter->first == at) {  
357 - iter++;  
358 - a->sp->elements.erase(at);  
359 - } 349 + if (!a->sp) {
  350 + a->elements.erase(a->elements.cbegin() + to_i(at));
  351 + return true;
  352 + }
  353 + auto end = a->sp->elements.end();
  354 + if (auto iter = a->sp->elements.lower_bound(at); iter != end) {
  355 + if (iter->first == at) {
  356 + iter++;
  357 + a->sp->elements.erase(at);
  358 + }
360 359
361 - while (iter != end) {  
362 - auto nh = a->sp->elements.extract(iter++);  
363 - --nh.key();  
364 - a->sp->elements.insert(std::move(nh));  
365 - } 360 + while (iter != end) {
  361 + auto nh = a->sp->elements.extract(iter++);
  362 + --nh.key();
  363 + a->sp->elements.insert(std::move(nh));
366 } 364 }
367 - --(a->sp->size);  
368 - } else {  
369 - a->elements.erase(a->elements.cbegin() + at_i);  
370 } 365 }
  366 + --(a->sp->size);
371 return true; 367 return true;
372 } 368 }
373 369
  370 +bool
  371 +Array::erase(int at_i)
  372 +{
  373 + if (at_i < 0) {
  374 + return false;
  375 + }
  376 + return erase(to_s(at_i));
  377 +}
  378 +
374 int 379 int
375 QPDFObjectHandle::getArrayNItems() const 380 QPDFObjectHandle::getArrayNItems() const
376 { 381 {
libqpdf/qpdf/QPDFObjectHandle_private.hh
@@ -99,6 +99,7 @@ namespace qpdf @@ -99,6 +99,7 @@ namespace qpdf
99 bool insert(size_t at, QPDFObjectHandle const& item); 99 bool insert(size_t at, QPDFObjectHandle const& item);
100 bool insert(int at, QPDFObjectHandle const& item); 100 bool insert(int at, QPDFObjectHandle const& item);
101 void push_back(QPDFObjectHandle const& item); 101 void push_back(QPDFObjectHandle const& item);
  102 + bool erase(size_t at);
102 bool erase(int at); 103 bool erase(int at);
103 104
104 std::vector<QPDFObjectHandle> getAsVector() const; 105 std::vector<QPDFObjectHandle> getAsVector() const;