aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2021-01-29 16:02:05 +0100
committerJay Berkenbilt <ejb@ql.org>2021-01-30 21:15:23 +0100
commitde0b11fc4793213dc6156d34412580a6e4df0c48 (patch)
treec8b3f45840bd439aeeb5498e0f0fd8107d0e2d05 /libqpdf
parent35e7859bc7d903c0177ce2a14f2842e1a2dbb09a (diff)
downloadqpdf-de0b11fc4793213dc6156d34412580a6e4df0c48.tar.zst
Add C++ iterator API around array and dictionary objects
Diffstat (limited to 'libqpdf')
-rw-r--r--libqpdf/QPDFObjectHandle.cc177
1 files changed, 177 insertions, 0 deletions
diff --git a/libqpdf/QPDFObjectHandle.cc b/libqpdf/QPDFObjectHandle.cc
index 93f49792..288b5256 100644
--- a/libqpdf/QPDFObjectHandle.cc
+++ b/libqpdf/QPDFObjectHandle.cc
@@ -3079,3 +3079,180 @@ QPDFObjectHandle::warn(QPDF* qpdf, QPDFExc const& e)
throw e;
}
}
+
+QPDFDictItems::QPDFDictItems(QPDFObjectHandle& oh) :
+ oh(oh)
+{
+}
+
+QPDFDictItems::iterator&
+QPDFDictItems::iterator::operator++()
+{
+ ++this->m->iter;
+ updateIValue();
+ return *this;
+}
+
+QPDFDictItems::iterator&
+QPDFDictItems::iterator::operator--()
+{
+ --this->m->iter;
+ updateIValue();
+ return *this;
+}
+
+QPDFDictItems::iterator::reference
+QPDFDictItems::iterator:: operator*()
+{
+ updateIValue();
+ return this->ivalue;
+}
+
+QPDFDictItems::iterator::pointer
+QPDFDictItems::iterator::operator->()
+{
+ updateIValue();
+ return &this->ivalue;
+}
+
+bool
+QPDFDictItems::iterator::operator==(iterator const& other) const
+{
+ if (this->m->is_end && other.m->is_end)
+ {
+ return true;
+ }
+ if (this->m->is_end || other.m->is_end)
+ {
+ return false;
+ }
+ return (this->ivalue.first == other.ivalue.first);
+}
+
+QPDFDictItems::iterator::iterator(QPDFObjectHandle& oh, bool for_begin) :
+ m(new Members(oh, for_begin))
+{
+ updateIValue();
+}
+
+void
+QPDFDictItems::iterator::updateIValue()
+{
+ this->m->is_end = (this->m->iter == this->m->keys.end());
+ if (this->m->is_end)
+ {
+ this->ivalue.first = "";
+ this->ivalue.second = QPDFObjectHandle();
+ }
+ else
+ {
+ this->ivalue.first = *(this->m->iter);
+ this->ivalue.second = this->m->oh.getKey(this->ivalue.first);
+ }
+}
+
+QPDFDictItems::iterator::Members::Members(
+ QPDFObjectHandle& oh, bool for_begin) :
+ oh(oh)
+{
+ this->keys = oh.getKeys();
+ this->iter = for_begin ? this->keys.begin() : this->keys.end();
+}
+
+QPDFDictItems::iterator
+QPDFDictItems::begin()
+{
+ return iterator(oh, true);
+}
+
+QPDFDictItems::iterator
+QPDFDictItems::end()
+{
+ return iterator(oh, false);
+}
+
+QPDFArrayItems::QPDFArrayItems(QPDFObjectHandle& oh) :
+ oh(oh)
+{
+}
+
+QPDFArrayItems::iterator&
+QPDFArrayItems::iterator::operator++()
+{
+ if (! this->m->is_end)
+ {
+ ++this->m->item_number;
+ updateIValue();
+ }
+ return *this;
+}
+
+QPDFArrayItems::iterator&
+QPDFArrayItems::iterator::operator--()
+{
+ if (this->m->item_number > 0)
+ {
+ --this->m->item_number;
+ updateIValue();
+ }
+ return *this;
+}
+
+QPDFArrayItems::iterator::reference
+QPDFArrayItems::iterator:: operator*()
+{
+ updateIValue();
+ return this->ivalue;
+}
+
+QPDFArrayItems::iterator::pointer
+QPDFArrayItems::iterator::operator->()
+{
+ updateIValue();
+ return &this->ivalue;
+}
+
+bool
+QPDFArrayItems::iterator::operator==(iterator const& other) const
+{
+ return (this->m->item_number == other.m->item_number);
+}
+
+QPDFArrayItems::iterator::iterator(QPDFObjectHandle& oh, bool for_begin) :
+ m(new Members(oh, for_begin))
+{
+ updateIValue();
+}
+
+void
+QPDFArrayItems::iterator::updateIValue()
+{
+ this->m->is_end = (this->m->item_number >= this->m->oh.getArrayNItems());
+ if (this->m->is_end)
+ {
+ this->ivalue = QPDFObjectHandle();
+ }
+ else
+ {
+ this->ivalue = this->m->oh.getArrayItem(this->m->item_number);
+ }
+}
+
+QPDFArrayItems::iterator::Members::Members(
+ QPDFObjectHandle& oh, bool for_begin) :
+ oh(oh)
+{
+ this->item_number = for_begin ? 0 : oh.getArrayNItems();
+}
+
+QPDFArrayItems::iterator
+QPDFArrayItems::begin()
+{
+ return iterator(oh, true);
+}
+
+QPDFArrayItems::iterator
+QPDFArrayItems::end()
+{
+ return iterator(oh, false);
+}