From 53f6c0a55a3202d102eec92654b728de3eda2201 Mon Sep 17 00:00:00 2001 From: m-holger Date: Thu, 18 May 2023 17:40:06 +0100 Subject: [PATCH] Use QPDFObjGen::set in QPDFPageObjectHelper::forEachXObject --- libqpdf/QPDFPageObjectHelper.cc | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/libqpdf/QPDFPageObjectHelper.cc b/libqpdf/QPDFPageObjectHelper.cc index a2deb386..f884b071 100644 --- a/libqpdf/QPDFPageObjectHelper.cc +++ b/libqpdf/QPDFPageObjectHelper.cc @@ -352,30 +352,27 @@ QPDFPageObjectHelper::forEachXObject( "QPDFPageObjectHelper::forEachXObject", recursive ? (this->oh.isFormXObject() ? 0 : 1) : (this->oh.isFormXObject() ? 2 : 3)); - std::set seen; + QPDFObjGen::set seen; std::list queue; queue.push_back(*this); while (!queue.empty()) { - QPDFPageObjectHelper ph = queue.front(); - queue.pop_front(); - QPDFObjGen og = ph.oh.getObjGen(); - if (seen.count(og)) { - continue; - } - seen.insert(og); - QPDFObjectHandle resources = ph.getAttribute("/Resources", false); - if (resources.isDictionary() && resources.hasKey("/XObject")) { - QPDFObjectHandle xobj_dict = resources.getKey("/XObject"); - for (auto const& key: xobj_dict.getKeys()) { - QPDFObjectHandle obj = xobj_dict.getKey(key); - if ((!selector) || selector(obj)) { - action(obj, xobj_dict, key); - } - if (recursive && obj.isFormXObject()) { - queue.push_back(QPDFPageObjectHelper(obj)); + auto& ph = queue.front(); + if (seen.add(ph)) { + auto xobj_dict = + ph.getAttribute("/Resources", false).getKeyIfDict("/XObject"); + if (xobj_dict.isDictionary()) { + for (auto const& key: xobj_dict.getKeys()) { + QPDFObjectHandle obj = xobj_dict.getKey(key); + if ((!selector) || selector(obj)) { + action(obj, xobj_dict, key); + } + if (recursive && obj.isFormXObject()) { + queue.emplace_back(obj); + } } } } + queue.pop_front(); } }