From 5438f0881c4954945827e72f9fefa11a5f1fb18b Mon Sep 17 00:00:00 2001 From: m-holger Date: Mon, 18 Aug 2025 12:31:07 +0100 Subject: [PATCH] Add const subscript operators to `Array`for improved object access --- include/qpdf/ObjectHandle.hh | 1 - libqpdf/QPDF_Array.cc | 60 +++++++++++++++++++++++++++++++----------------------------- libqpdf/qpdf/QPDFObjectHandle_private.hh | 4 ++++ 3 files changed, 35 insertions(+), 30 deletions(-) diff --git a/include/qpdf/ObjectHandle.hh b/include/qpdf/ObjectHandle.hh index d121f20..a69f5ae 100644 --- a/include/qpdf/ObjectHandle.hh +++ b/include/qpdf/ObjectHandle.hh @@ -74,7 +74,6 @@ namespace qpdf } QPDFObjectHandle operator[](size_t n) const; - QPDFObjectHandle operator[](int n) const; std::shared_ptr copy(bool shallow = false) const; diff --git a/libqpdf/QPDF_Array.cc b/libqpdf/QPDF_Array.cc index ddbeba5..23dd2d2 100644 --- a/libqpdf/QPDF_Array.cc +++ b/libqpdf/QPDF_Array.cc @@ -180,6 +180,31 @@ Array::size() const return 0; } +QPDFObjectHandle const& +Array::operator[](size_t n) const +{ + static const QPDFObjectHandle null_obj; + auto a = as(); + if (!a) { + return null_obj; + } + if (a->sp) { + auto const& iter = a->sp->elements.find(n); + return iter == a->sp->elements.end() ? null_obj : iter->second; + } + return n >= a->elements.size() ? null_obj : a->elements[n]; +} + +QPDFObjectHandle const& +Array::operator[](int n) const +{ + static const QPDFObjectHandle null_obj; + if (n < 0) { + return null_obj; + } + return (*this)[static_cast(n)]; +} + std::pair Array::at(int n) const { @@ -549,36 +574,13 @@ BaseHandle::size() const QPDFObjectHandle BaseHandle::operator[](size_t n) const { - switch (resolved_type_code()) { - case ::ot_array: - { - auto a = as(); - if (n >= a->size()) { - return {}; - } - return Array(obj).at(static_cast(n)).second; - } - case ::ot_uninitialized: - case ::ot_reserved: - case ::ot_null: - case ::ot_destroyed: - case ::ot_unresolved: - case ::ot_reference: - return {}; - case ::ot_boolean: - case ::ot_integer: - case ::ot_real: - case ::ot_string: - case ::ot_name: - case ::ot_dictionary: - case ::ot_stream: - case ::ot_inlineimage: - case ::ot_operator: - return {obj}; - default: - throw std::logic_error("Unexpected type code in size"); // unreachable - return {}; // unreachable + if (resolved_type_code() == ::ot_array) { + return Array(obj)[n]; } + if (n < size()) { + return *this; + } + return {}; } QPDFObjectHandle diff --git a/libqpdf/qpdf/QPDFObjectHandle_private.hh b/libqpdf/qpdf/QPDFObjectHandle_private.hh index 447754b..161534c 100644 --- a/libqpdf/qpdf/QPDFObjectHandle_private.hh +++ b/libqpdf/qpdf/QPDFObjectHandle_private.hh @@ -70,6 +70,10 @@ namespace qpdf return *this; } + QPDFObjectHandle const& operator[](size_t n) const; + + QPDFObjectHandle const& operator[](int n) const; + using iterator = std::vector::iterator; using const_iterator = std::vector::const_iterator; using const_reverse_iterator = std::vector::const_reverse_iterator; -- libgit2 0.21.4