summaryrefslogtreecommitdiffstats
path: root/include
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 /include
parent35e7859bc7d903c0177ce2a14f2842e1a2dbb09a (diff)
downloadqpdf-de0b11fc4793213dc6156d34412580a6e4df0c48.tar.zst
Add C++ iterator API around array and dictionary objects
Diffstat (limited to 'include')
-rw-r--r--include/qpdf/QPDFObjectHandle.hh181
1 files changed, 179 insertions, 2 deletions
diff --git a/include/qpdf/QPDFObjectHandle.hh b/include/qpdf/QPDFObjectHandle.hh
index b28568ed..554c7131 100644
--- a/include/qpdf/QPDFObjectHandle.hh
+++ b/include/qpdf/QPDFObjectHandle.hh
@@ -631,7 +631,8 @@ class QPDFObjectHandle
QPDF_DLL
std::string getInlineImageValue();
- // Methods for array objects; see also name and array objects
+ // Methods for array objects; see also name and array objects. See
+ // also QPDFArrayItems later in this file.
QPDF_DLL
int getArrayNItems();
QPDF_DLL
@@ -655,7 +656,8 @@ class QPDFObjectHandle
QPDF_DLL
Matrix getArrayAsMatrix();
- // Methods for dictionary objects
+ // Methods for dictionary objects. See also QPDFDictItems later in
+ // this file.
QPDF_DLL
bool hasKey(std::string const&);
QPDF_DLL
@@ -1224,4 +1226,179 @@ class QPDFObjectHandle
bool reserved;
};
+class QPDFDictItems
+{
+ // This class allows C++-style iteration, including range-for
+ // iteration, around dictionaries. You can write
+
+ // for (auto iter: QPDFDictItems(dictionary_obj))
+ // {
+ // // iter.first is a string
+ // // iter.second is a QPDFObjectHandle
+ // }
+
+ public:
+ QPDF_DLL
+ QPDFDictItems(QPDFObjectHandle& oh);
+
+ class iterator: public std::iterator<
+ std::bidirectional_iterator_tag,
+ std::pair<std::string, QPDFObjectHandle>>
+ {
+ friend class QPDFDictItems;
+ public:
+ QPDF_DLL
+ virtual ~iterator() = default;
+ QPDF_DLL
+ iterator& operator++();
+ QPDF_DLL
+ iterator operator++(int)
+ {
+ iterator t = *this;
+ ++(*this);
+ return t;
+ }
+ QPDF_DLL
+ iterator& operator--();
+ QPDF_DLL
+ iterator operator--(int)
+ {
+ iterator t = *this;
+ --(*this);
+ return t;
+ }
+ QPDF_DLL
+ reference operator*();
+ QPDF_DLL
+ pointer operator->();
+ QPDF_DLL
+ bool operator==(iterator const& other) const;
+ QPDF_DLL
+ bool operator!=(iterator const& other) const
+ {
+ return ! operator==(other);
+ }
+
+ private:
+ iterator(QPDFObjectHandle& oh, bool for_begin);
+ void updateIValue();
+
+ class Members
+ {
+ friend class QPDFDictItems::iterator;
+
+ public:
+ QPDF_DLL
+ ~Members() = default;
+
+ private:
+ Members(QPDFObjectHandle& oh, bool for_begin);
+ Members() = delete;
+ Members(Members const&) = delete;
+
+ QPDFObjectHandle& oh;
+ std::set<std::string> keys;
+ std::set<std::string>::iterator iter;
+ bool is_end;
+ };
+ PointerHolder<Members> m;
+ value_type ivalue;
+ };
+
+ QPDF_DLL
+ iterator begin();
+ QPDF_DLL
+ iterator end();
+
+ private:
+ QPDFObjectHandle& oh;
+};
+
+class QPDFArrayItems
+{
+ // This class allows C++-style iteration, including range-for
+ // iteration, around arrays. You can write
+
+ // for (auto iter: QPDFArrayItems(array_obj))
+ // {
+ // // iter is a QPDFObjectHandle
+ // }
+
+ public:
+ QPDF_DLL
+ QPDFArrayItems(QPDFObjectHandle& oh);
+
+ class iterator: public std::iterator<
+ std::bidirectional_iterator_tag,
+ QPDFObjectHandle>
+ {
+ friend class QPDFArrayItems;
+ public:
+ QPDF_DLL
+ virtual ~iterator() = default;
+ QPDF_DLL
+ iterator& operator++();
+ QPDF_DLL
+ iterator operator++(int)
+ {
+ iterator t = *this;
+ ++(*this);
+ return t;
+ }
+ QPDF_DLL
+ iterator& operator--();
+ QPDF_DLL
+ iterator operator--(int)
+ {
+ iterator t = *this;
+ --(*this);
+ return t;
+ }
+ QPDF_DLL
+ reference operator*();
+ QPDF_DLL
+ pointer operator->();
+ QPDF_DLL
+ bool operator==(iterator const& other) const;
+ QPDF_DLL
+ bool operator!=(iterator const& other) const
+ {
+ return ! operator==(other);
+ }
+
+ private:
+ iterator(QPDFObjectHandle& oh, bool for_begin);
+ void updateIValue();
+
+ class Members
+ {
+ friend class QPDFArrayItems::iterator;
+
+ public:
+ QPDF_DLL
+ ~Members() = default;
+
+ private:
+ Members(QPDFObjectHandle& oh, bool for_begin);
+ Members() = delete;
+ Members(Members const&) = delete;
+
+ QPDFObjectHandle& oh;
+ int item_number;
+ bool is_end;
+ };
+ PointerHolder<Members> m;
+ value_type ivalue;
+ };
+
+ QPDF_DLL
+ iterator begin();
+ QPDF_DLL
+ iterator end();
+
+ private:
+ QPDFObjectHandle& oh;
+};
+
+
#endif // QPDFOBJECTHANDLE_HH