Commit 5438f0881c4954945827e72f9fefa11a5f1fb18b
1 parent
62d1dd6d
Add const subscript operators to `Array`for improved object access
Showing
3 changed files
with
35 additions
and
30 deletions
include/qpdf/ObjectHandle.hh
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; | ... | ... |