From 117a35dc6d96ca04e7aa4dcd9f84d01287687bc6 Mon Sep 17 00:00:00 2001 From: m-holger Date: Wed, 19 Feb 2025 15:23:59 +0000 Subject: [PATCH] Make Array iterable --- libqpdf/QPDF_Array.cc | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ libqpdf/qpdf/QPDFObjectHandle_private.hh | 18 ++++++++++++++++++ 2 files changed, 108 insertions(+), 0 deletions(-) diff --git a/libqpdf/QPDF_Array.cc b/libqpdf/QPDF_Array.cc index 7f5c9ae..2c4104c 100644 --- a/libqpdf/QPDF_Array.cc +++ b/libqpdf/QPDF_Array.cc @@ -46,6 +46,96 @@ Array::array() const return nullptr; // unreachable } +Array::iterator +Array::begin() +{ + if (auto a = as()) { + if (!a->sp) { + return a->elements.begin(); + } + if (!sp_elements) { + sp_elements = std::make_unique>(getAsVector()); + } + return sp_elements->begin(); + } + return {}; +} + +Array::iterator +Array::end() +{ + if (auto a = as()) { + if (!a->sp) { + return a->elements.end(); + } + if (!sp_elements) { + sp_elements = std::make_unique>(getAsVector()); + } + return sp_elements->end(); + } + return {}; +} + +Array::const_iterator +Array::cbegin() +{ + if (auto a = as()) { + if (!a->sp) { + return a->elements.cbegin(); + } + if (!sp_elements) { + sp_elements = std::make_unique>(getAsVector()); + } + return sp_elements->cbegin(); + } + return {}; +} + +Array::const_iterator +Array::cend() +{ + if (auto a = as()) { + if (!a->sp) { + return a->elements.cend(); + } + if (!sp_elements) { + sp_elements = std::make_unique>(getAsVector()); + } + return sp_elements->cend(); + } + return {}; +} + +Array::const_reverse_iterator +Array::crbegin() +{ + if (auto a = as()) { + if (!a->sp) { + return a->elements.crbegin(); + } + if (!sp_elements) { + sp_elements = std::make_unique>(getAsVector()); + } + return sp_elements->crbegin(); + } + return {}; +} + +Array::const_reverse_iterator +Array::crend() +{ + if (auto a = as()) { + if (!a->sp) { + return a->elements.crend(); + } + if (!sp_elements) { + sp_elements = std::make_unique>(getAsVector()); + } + return sp_elements->crend(); + } + return {}; +} + QPDFObjectHandle Array::null() const { diff --git a/libqpdf/qpdf/QPDFObjectHandle_private.hh b/libqpdf/qpdf/QPDFObjectHandle_private.hh index efe276c..61ce62a 100644 --- a/libqpdf/qpdf/QPDFObjectHandle_private.hh +++ b/libqpdf/qpdf/QPDFObjectHandle_private.hh @@ -21,6 +21,22 @@ namespace qpdf { } + using iterator = std::vector::iterator; + using const_iterator = std::vector::const_iterator; + using const_reverse_iterator = std::vector::const_reverse_iterator; + + iterator begin(); + + iterator end(); + + const_iterator cbegin(); + + const_iterator cend(); + + const_reverse_iterator crbegin(); + + const_reverse_iterator crend(); + int size() const; std::pair at(int n) const; bool setAt(int at, QPDFObjectHandle const& oh); @@ -35,6 +51,8 @@ namespace qpdf QPDF_Array* array() const; void checkOwnership(QPDFObjectHandle const& item) const; QPDFObjectHandle null() const; + + std::unique_ptr> sp_elements{}; }; // BaseDictionary is only used as a base class. It does not contain any methods exposed in the -- libgit2 0.21.4