From 8ed3e8c79b5cbccfeccee865e555b68025ee2c1f Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Mon, 25 Jan 2021 08:05:43 -0500 Subject: NNTree: rework iterators to be more memory efficient Keep a std::pair internal to the iterators so that operator* can return a reference and operator-> can work, and each can work without copying pairs of objects around. --- include/qpdf/QPDFNameTreeObjectHelper.hh | 8 +++++--- include/qpdf/QPDFNumberTreeObjectHelper.hh | 8 +++++--- 2 files changed, 10 insertions(+), 6 deletions(-) (limited to 'include') diff --git a/include/qpdf/QPDFNameTreeObjectHelper.hh b/include/qpdf/QPDFNameTreeObjectHelper.hh index aa1955ed..18156768 100644 --- a/include/qpdf/QPDFNameTreeObjectHelper.hh +++ b/include/qpdf/QPDFNameTreeObjectHelper.hh @@ -75,9 +75,6 @@ class QPDFNameTreeObjectHelper: public QPDFObjectHelper class iterator: public std::iterator< std::bidirectional_iterator_tag, - std::pair, - void, - std::pair*, std::pair> { friend class QPDFNameTreeObjectHelper; @@ -105,6 +102,8 @@ class QPDFNameTreeObjectHelper: public QPDFObjectHelper QPDF_DLL reference operator*(); QPDF_DLL + pointer operator->(); + QPDF_DLL bool operator==(iterator const& other) const; QPDF_DLL bool operator!=(iterator const& other) const @@ -131,8 +130,11 @@ class QPDFNameTreeObjectHelper: public QPDFObjectHelper void remove(); private: + void updateIValue(); + iterator(std::shared_ptr const&); std::shared_ptr impl; + value_type ivalue; }; // The iterator looks like map iterator, so i.first is a string diff --git a/include/qpdf/QPDFNumberTreeObjectHelper.hh b/include/qpdf/QPDFNumberTreeObjectHelper.hh index 70695327..7343978b 100644 --- a/include/qpdf/QPDFNumberTreeObjectHelper.hh +++ b/include/qpdf/QPDFNumberTreeObjectHelper.hh @@ -94,9 +94,6 @@ class QPDFNumberTreeObjectHelper: public QPDFObjectHelper class iterator: public std::iterator< std::bidirectional_iterator_tag, - std::pair, - void, - std::pair*, std::pair> { friend class QPDFNumberTreeObjectHelper; @@ -124,6 +121,8 @@ class QPDFNumberTreeObjectHelper: public QPDFObjectHelper QPDF_DLL reference operator*(); QPDF_DLL + pointer operator->(); + QPDF_DLL bool operator==(iterator const& other) const; QPDF_DLL bool operator!=(iterator const& other) const @@ -150,8 +149,11 @@ class QPDFNumberTreeObjectHelper: public QPDFObjectHelper void remove(); private: + void updateIValue(); + iterator(std::shared_ptr const&); std::shared_ptr impl; + value_type ivalue; }; // The iterator looks like map iterator, so i.first is a string -- cgit v1.2.3-70-g09d2