Commit 7bbd8b30d099f6ede57d7fa84d5e1e4b1cdca1a1

Authored by m-holger
1 parent 59b25578

Refactor `NNTreeIterator::resetLimits`: replace `getArrayNItems` and `getArrayIt…

…em` with `size` and subscript operators, remove redundant debug traces, simplify loop logic, and improve readability.
libqpdf/NNTree.cc
... ... @@ -160,35 +160,31 @@ NNTreeIterator::increment(bool backward)
160 160 void
161 161 NNTreeIterator::resetLimits(QPDFObjectHandle a_node, std::list<PathElement>::iterator parent)
162 162 {
163   - bool done = false;
164   - while (!done) {
  163 + while (true) {
165 164 if (parent == path.end()) {
166   - QTC::TC("qpdf", "NNTree remove limits from root");
167 165 a_node.removeKey("/Limits");
168   - done = true;
169 166 break;
170 167 }
171 168 auto kids = a_node.getKey("/Kids");
172   - int nkids = kids.isArray() ? kids.getArrayNItems() : 0;
  169 + size_t nkids = kids.isArray() ? kids.size() : 0;
173 170 auto items = a_node.getKey(impl.details.itemsKey());
174   - int nitems = items.isArray() ? items.getArrayNItems() : 0;
  171 + size_t nitems = items.size();
175 172  
176 173 bool changed = true;
177 174 QPDFObjectHandle first;
178 175 QPDFObjectHandle last;
179 176 if (nitems >= 2) {
180   - first = items.getArrayItem(0);
181   - last = items.getArrayItem((nitems - 1) & ~1);
  177 + first = items[0];
  178 + last = items[(nitems - 1u) & ~1u];
182 179 } else if (nkids > 0) {
183   - auto first_kid = kids.getArrayItem(0);
184   - auto last_kid = kids.getArrayItem(nkids - 1);
  180 + auto first_kid = kids[0];
  181 + auto last_kid = kids[nkids - 1u];
185 182 if (first_kid.isDictionary() && last_kid.isDictionary()) {
186 183 auto first_limits = first_kid.getKey("/Limits");
187 184 auto last_limits = last_kid.getKey("/Limits");
188   - if (first_limits.isArray() && (first_limits.getArrayNItems() >= 2) &&
189   - last_limits.isArray() && (last_limits.getArrayNItems() >= 2)) {
190   - first = first_limits.getArrayItem(0);
191   - last = last_limits.getArrayItem(1);
  185 + if (first_limits.size() >= 2 && last_limits.size() >= 2) {
  186 + first = first_limits[0];
  187 + last = last_limits[1];
192 188 }
193 189 }
194 190 }
... ... @@ -197,13 +193,12 @@ NNTreeIterator::resetLimits(QPDFObjectHandle a_node, std::list&lt;PathElement&gt;::ite
197 193 limits.appendItem(first);
198 194 limits.appendItem(last);
199 195 auto olimits = a_node.getKey("/Limits");
200   - if (olimits.isArray() && (olimits.getArrayNItems() == 2)) {
201   - auto ofirst = olimits.getArrayItem(0);
202   - auto olast = olimits.getArrayItem(1);
  196 + if (olimits.size() == 2) {
  197 + auto ofirst = olimits[0];
  198 + auto olast = olimits[1];
203 199 if (impl.details.keyValid(ofirst) && impl.details.keyValid(olast) &&
204 200 (impl.details.compareKeys(first, ofirst) == 0) &&
205 201 (impl.details.compareKeys(last, olast) == 0)) {
206   - QTC::TC("qpdf", "NNTree limits didn't change");
207 202 changed = false;
208 203 }
209 204 }
... ... @@ -211,12 +206,11 @@ NNTreeIterator::resetLimits(QPDFObjectHandle a_node, std::list&lt;PathElement&gt;::ite
211 206 a_node.replaceKey("/Limits", limits);
212 207 }
213 208 } else {
214   - QTC::TC("qpdf", "NNTree unable to determine limits");
215 209 impl.warn(a_node, "unable to determine limits");
216 210 }
217 211  
218 212 if (!changed || parent == path.begin()) {
219   - done = true;
  213 + break;
220 214 } else {
221 215 a_node = parent->node;
222 216 --parent;
... ...
qpdf/qpdf.testcov
... ... @@ -522,13 +522,10 @@ QPDFPageObjectHelper::forEachXObject 3
522 522 NNTree skip invalid kid 0
523 523 NNTree skip item at end of short items 0
524 524 NNTree skip invalid key 0
525   -NNTree unable to determine limits 0
526 525 NNTree repair 0
527   -NNTree limits didn't change 0
528 526 NNTree increment end() 0
529 527 NNTree insertAfter inserts first 0
530 528 NNTree erased last kid/item in tree 1
531   -NNTree remove limits from root 0
532 529 QPDFPageObjectHelper unresolved names 0
533 530 QPDFPageObjectHelper resolving unresolved 0
534 531 QPDFFileSpecObjectHelper empty compat_name 0
... ...