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 74 }
75 75  
76 76 QPDFObjectHandle operator[](size_t n) const;
77   -
78 77 QPDFObjectHandle operator[](int n) const;
79 78  
80 79 std::shared_ptr<QPDFObject> copy(bool shallow = false) const;
... ...
libqpdf/QPDF_Array.cc
... ... @@ -180,6 +180,31 @@ Array::size() const
180 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 208 std::pair<bool, QPDFObjectHandle>
184 209 Array::at(int n) const
185 210 {
... ... @@ -549,36 +574,13 @@ BaseHandle::size() const
549 574 QPDFObjectHandle
550 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 586 QPDFObjectHandle
... ...
libqpdf/qpdf/QPDFObjectHandle_private.hh
... ... @@ -70,6 +70,10 @@ namespace qpdf
70 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 77 using iterator = std::vector<QPDFObjectHandle>::iterator;
74 78 using const_iterator = std::vector<QPDFObjectHandle>::const_iterator;
75 79 using const_reverse_iterator = std::vector<QPDFObjectHandle>::const_reverse_iterator;
... ...