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
| @@ -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; |