Commit f42de31c9ba947f2c991265e0bef4bb54ce92222

Authored by m-holger
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.
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 +}
... ...