aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/QPDFNameTreeObjectHelper.cc
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2021-01-25 14:05:43 +0100
committerJay Berkenbilt <ejb@ql.org>2021-01-26 15:12:23 +0100
commit8ed3e8c79b5cbccfeccee865e555b68025ee2c1f (patch)
tree159063cdb1773605254e0436365d4eeb137282ff /libqpdf/QPDFNameTreeObjectHelper.cc
parente7e20772ed29f3eb9756b31fe0bd9bc29a445891 (diff)
downloadqpdf-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.cc33
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;
}