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/QPDFNumberTreeObjectHelper.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/QPDFNumberTreeObjectHelper.cc')
-rw-r--r-- | libqpdf/QPDFNumberTreeObjectHelper.cc | 41 |
1 files changed, 34 insertions, 7 deletions
diff --git a/libqpdf/QPDFNumberTreeObjectHelper.cc b/libqpdf/QPDFNumberTreeObjectHelper.cc index 426891e2..a66a5f48 100644 --- a/libqpdf/QPDFNumberTreeObjectHelper.cc +++ b/libqpdf/QPDFNumberTreeObjectHelper.cc @@ -75,6 +75,7 @@ QPDFNumberTreeObjectHelper::iterator& QPDFNumberTreeObjectHelper::iterator::operator++() { ++(*impl); + updateIValue(); return *this; } @@ -82,14 +83,38 @@ QPDFNumberTreeObjectHelper::iterator& QPDFNumberTreeObjectHelper::iterator::operator--() { --(*impl); + updateIValue(); return *this; } +void +QPDFNumberTreeObjectHelper::iterator::updateIValue() +{ + if (impl->valid()) + { + auto p = *impl; + this->ivalue.first = p->first.getIntValue(); + this->ivalue.second = p->second; + } + else + { + this->ivalue.first = 0; + this->ivalue.second = QPDFObjectHandle(); + } +} + QPDFNumberTreeObjectHelper::iterator::reference QPDFNumberTreeObjectHelper::iterator::operator*() { - auto p = **impl; - return std::make_pair(p.first.getIntValue(), p.second); + updateIValue(); + return this->ivalue; +} + +QPDFNumberTreeObjectHelper::iterator::pointer +QPDFNumberTreeObjectHelper::iterator::operator->() +{ + updateIValue(); + return &this->ivalue; } bool @@ -103,12 +128,14 @@ QPDFNumberTreeObjectHelper::iterator::insertAfter( numtree_number key, QPDFObjectHandle value) { impl->insertAfter(QPDFObjectHandle::newInteger(key), value); + updateIValue(); } void QPDFNumberTreeObjectHelper::iterator::remove() { impl->remove(); + updateIValue(); } QPDFNumberTreeObjectHelper::iterator @@ -162,7 +189,7 @@ QPDFNumberTreeObjectHelper::getMin() { return 0; } - return (*i).first; + return i->first; } QPDFNumberTreeObjectHelper::numtree_number @@ -173,7 +200,7 @@ QPDFNumberTreeObjectHelper::getMax() { return 0; } - return (*i).first; + return i->first; } bool @@ -192,7 +219,7 @@ QPDFNumberTreeObjectHelper::findObject( { return false; } - oh = (*i).second; + oh = i->second; return true; } @@ -206,8 +233,8 @@ QPDFNumberTreeObjectHelper::findObjectAtOrBelow( { return false; } - oh = (*i).second; - offset = idx - (*i).first; + oh = i->second; + offset = idx - i->first; return true; } |