Commit 5438f0881c4954945827e72f9fefa11a5f1fb18b

Authored by m-holger
1 parent 62d1dd6d

Add const subscript operators to `Array`for improved object access

include/qpdf/ObjectHandle.hh
@@ -74,7 +74,6 @@ namespace qpdf @@ -74,7 +74,6 @@ namespace qpdf
74 } 74 }
75 75
76 QPDFObjectHandle operator[](size_t n) const; 76 QPDFObjectHandle operator[](size_t n) const;
77 -  
78 QPDFObjectHandle operator[](int n) const; 77 QPDFObjectHandle operator[](int n) const;
79 78
80 std::shared_ptr<QPDFObject> copy(bool shallow = false) const; 79 std::shared_ptr<QPDFObject> copy(bool shallow = false) const;
libqpdf/QPDF_Array.cc
@@ -180,6 +180,31 @@ Array::size() const @@ -180,6 +180,31 @@ Array::size() const
180 return 0; 180 return 0;
181 } 181 }
182 182
  183 +QPDFObjectHandle const&
  184 +Array::operator[](size_t n) const
  185 +{
  186 + static const QPDFObjectHandle null_obj;
  187 + auto a = as<QPDF_Array>();
  188 + if (!a) {
  189 + return null_obj;
  190 + }
  191 + if (a->sp) {
  192 + auto const& iter = a->sp->elements.find(n);
  193 + return iter == a->sp->elements.end() ? null_obj : iter->second;
  194 + }
  195 + return n >= a->elements.size() ? null_obj : a->elements[n];
  196 +}
  197 +
  198 +QPDFObjectHandle const&
  199 +Array::operator[](int n) const
  200 +{
  201 + static const QPDFObjectHandle null_obj;
  202 + if (n < 0) {
  203 + return null_obj;
  204 + }
  205 + return (*this)[static_cast<size_t>(n)];
  206 +}
  207 +
183 std::pair<bool, QPDFObjectHandle> 208 std::pair<bool, QPDFObjectHandle>
184 Array::at(int n) const 209 Array::at(int n) const
185 { 210 {
@@ -549,36 +574,13 @@ BaseHandle::size() const @@ -549,36 +574,13 @@ BaseHandle::size() const
549 QPDFObjectHandle 574 QPDFObjectHandle
550 BaseHandle::operator[](size_t n) const 575 BaseHandle::operator[](size_t n) const
551 { 576 {
552 - switch (resolved_type_code()) {  
553 - case ::ot_array:  
554 - {  
555 - auto a = as<QPDF_Array>();  
556 - if (n >= a->size()) {  
557 - return {};  
558 - }  
559 - return Array(obj).at(static_cast<int>(n)).second;  
560 - }  
561 - case ::ot_uninitialized:  
562 - case ::ot_reserved:  
563 - case ::ot_null:  
564 - case ::ot_destroyed:  
565 - case ::ot_unresolved:  
566 - case ::ot_reference:  
567 - return {};  
568 - case ::ot_boolean:  
569 - case ::ot_integer:  
570 - case ::ot_real:  
571 - case ::ot_string:  
572 - case ::ot_name:  
573 - case ::ot_dictionary:  
574 - case ::ot_stream:  
575 - case ::ot_inlineimage:  
576 - case ::ot_operator:  
577 - return {obj};  
578 - default:  
579 - throw std::logic_error("Unexpected type code in size"); // unreachable  
580 - return {}; // unreachable 577 + if (resolved_type_code() == ::ot_array) {
  578 + return Array(obj)[n];
581 } 579 }
  580 + if (n < size()) {
  581 + return *this;
  582 + }
  583 + return {};
582 } 584 }
583 585
584 QPDFObjectHandle 586 QPDFObjectHandle
libqpdf/qpdf/QPDFObjectHandle_private.hh
@@ -70,6 +70,10 @@ namespace qpdf @@ -70,6 +70,10 @@ namespace qpdf
70 return *this; 70 return *this;
71 } 71 }
72 72
  73 + QPDFObjectHandle const& operator[](size_t n) const;
  74 +
  75 + QPDFObjectHandle const& operator[](int n) const;
  76 +
73 using iterator = std::vector<QPDFObjectHandle>::iterator; 77 using iterator = std::vector<QPDFObjectHandle>::iterator;
74 using const_iterator = std::vector<QPDFObjectHandle>::const_iterator; 78 using const_iterator = std::vector<QPDFObjectHandle>::const_iterator;
75 using const_reverse_iterator = std::vector<QPDFObjectHandle>::const_reverse_iterator; 79 using const_reverse_iterator = std::vector<QPDFObjectHandle>::const_reverse_iterator;