Commit f42de31c9ba947f2c991265e0bef4bb54ce92222
1 parent
f5083840
Add private-API subscript operators to `QPDFObjectHandle` for size_t and int
Implement subscript operators (`operator[]`) to provide indexed access to `QPDFObjectHandle` for both `size_t` and `int` types.
Showing
2 changed files
with
48 additions
and
0 deletions
include/qpdf/ObjectHandle.hh
| ... | ... | @@ -73,6 +73,10 @@ namespace qpdf |
| 73 | 73 | return size() == 0; |
| 74 | 74 | } |
| 75 | 75 | |
| 76 | + QPDFObjectHandle operator[](size_t n) const; | |
| 77 | + | |
| 78 | + QPDFObjectHandle operator[](int n) const; | |
| 79 | + | |
| 76 | 80 | std::shared_ptr<QPDFObject> copy(bool shallow = false) const; |
| 77 | 81 | // Recursively remove association with any QPDF object. This method may only be called |
| 78 | 82 | // during final destruction. | ... | ... |
libqpdf/QPDF_Array.cc
| ... | ... | @@ -528,3 +528,47 @@ BaseHandle::size() const |
| 528 | 528 | return 0; // unreachable |
| 529 | 529 | } |
| 530 | 530 | } |
| 531 | + | |
| 532 | +QPDFObjectHandle | |
| 533 | +BaseHandle::operator[](size_t n) const | |
| 534 | +{ | |
| 535 | + switch (resolved_type_code()) { | |
| 536 | + case ::ot_array: | |
| 537 | + { | |
| 538 | + auto a = as<QPDF_Array>(); | |
| 539 | + if (n >= a->size()) { | |
| 540 | + return {}; | |
| 541 | + } | |
| 542 | + return Array(obj).at(static_cast<int>(n)).second; | |
| 543 | + } | |
| 544 | + case ::ot_uninitialized: | |
| 545 | + case ::ot_reserved: | |
| 546 | + case ::ot_null: | |
| 547 | + case ::ot_destroyed: | |
| 548 | + case ::ot_unresolved: | |
| 549 | + case ::ot_reference: | |
| 550 | + return {}; | |
| 551 | + case ::ot_boolean: | |
| 552 | + case ::ot_integer: | |
| 553 | + case ::ot_real: | |
| 554 | + case ::ot_string: | |
| 555 | + case ::ot_name: | |
| 556 | + case ::ot_dictionary: | |
| 557 | + case ::ot_stream: | |
| 558 | + case ::ot_inlineimage: | |
| 559 | + case ::ot_operator: | |
| 560 | + return {obj}; | |
| 561 | + default: | |
| 562 | + throw std::logic_error("Unexpected type code in size"); // unreachable | |
| 563 | + return {}; // unreachable | |
| 564 | + } | |
| 565 | +} | |
| 566 | + | |
| 567 | +QPDFObjectHandle | |
| 568 | +BaseHandle::operator[](int n) const | |
| 569 | +{ | |
| 570 | + if (n < 0) { | |
| 571 | + return {}; | |
| 572 | + } | |
| 573 | + return (*this)[static_cast<size_t>(n)]; | |
| 574 | +} | ... | ... |