diff options
author | Jay Berkenbilt <ejb@ql.org> | 2021-01-25 14:05:43 +0100 |
---|---|---|
committer | Jay Berkenbilt <ejb@ql.org> | 2021-01-26 15:12:23 +0100 |
commit | 8ed3e8c79b5cbccfeccee865e555b68025ee2c1f (patch) | |
tree | 159063cdb1773605254e0436365d4eeb137282ff /libqpdf/QPDFNameTreeObjectHelper.cc | |
parent | e7e20772ed29f3eb9756b31fe0bd9bc29a445891 (diff) | |
download | qpdf-8ed3e8c79b5cbccfeccee865e555b68025ee2c1f.tar.zst |
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.
Diffstat (limited to 'libqpdf/QPDFNameTreeObjectHelper.cc')
-rw-r--r-- | libqpdf/QPDFNameTreeObjectHelper.cc | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/libqpdf/QPDFNameTreeObjectHelper.cc b/libqpdf/QPDFNameTreeObjectHelper.cc index 7abc761a..1dc7f205 100644 --- a/libqpdf/QPDFNameTreeObjectHelper.cc +++ b/libqpdf/QPDFNameTreeObjectHelper.cc @@ -79,6 +79,7 @@ QPDFNameTreeObjectHelper::iterator& QPDFNameTreeObjectHelper::iterator::operator++() { ++(*impl); + updateIValue(); return *this; } @@ -86,14 +87,38 @@ QPDFNameTreeObjectHelper::iterator& QPDFNameTreeObjectHelper::iterator::operator--() { --(*impl); + updateIValue(); return *this; } +void +QPDFNameTreeObjectHelper::iterator::updateIValue() +{ + if (impl->valid()) + { + auto p = *impl; + this->ivalue.first = p->first.getUTF8Value(); + this->ivalue.second = p->second; + } + else + { + this->ivalue.first = ""; + this->ivalue.second = QPDFObjectHandle(); + } +} + QPDFNameTreeObjectHelper::iterator::reference QPDFNameTreeObjectHelper::iterator::operator*() { - auto p = **impl; - return std::make_pair(p.first.getUTF8Value(), p.second); + updateIValue(); + return this->ivalue; +} + +QPDFNameTreeObjectHelper::iterator::pointer +QPDFNameTreeObjectHelper::iterator::operator->() +{ + updateIValue(); + return &this->ivalue; } bool @@ -107,12 +132,14 @@ QPDFNameTreeObjectHelper::iterator::insertAfter( std::string const& key, QPDFObjectHandle value) { impl->insertAfter(QPDFObjectHandle::newUnicodeString(key), value); + updateIValue(); } void QPDFNameTreeObjectHelper::iterator::remove() { impl->remove(); + updateIValue(); } QPDFNameTreeObjectHelper::iterator @@ -175,7 +202,7 @@ QPDFNameTreeObjectHelper::findObject( { return false; } - oh = (*i).second; + oh = i->second; return true; } |