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