aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/QPDFNumberTreeObjectHelper.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/QPDFNumberTreeObjectHelper.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/QPDFNumberTreeObjectHelper.cc')
-rw-r--r--libqpdf/QPDFNumberTreeObjectHelper.cc41
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;
}