58369 {
58370 while (!s.empty()) {
58371 auto &entry = s.top();
58372 if (entry.exhausted) {
58373 Pop(handler, entry.node);
58374 continue;
58375 }
58376 entry.exhausted = true;
58377
58378 const auto type = entry.node.GetType();
58379 switch (type) {
58380 case NType::LEAF_INLINED:
58381 case NType::LEAF:
58382 case NType::NODE_7_LEAF:
58383 case NType::NODE_15_LEAF:
58384 case NType::NODE_256_LEAF:
58385 break;
58386 case NType::PREFIX: {
58387 Prefix prefix(art, entry.node, true);
58388 Emplace(handler, *prefix.ptr);
58389 break;
58390 }
58391
58392 case NType::NODE_4: {
58393 IterateChildren<FUNC, Node4>(handler, entry.node, type);
58394 break;
58395 }
58396 case NType::NODE_16: {
58397 IterateChildren<FUNC, Node16>(handler, entry.node, type);
58398 break;
58399 }
58400 case NType::NODE_48: {
58401 IterateChildren<FUNC, Node48>(handler, entry.node, type);
58402 break;
58403 }
58404 case NType::NODE_256: {
58405 IterateChildren<FUNC, Node256>(handler, entry.node, type);
58406 break;
58407 }
58408 default:
58409 throw InternalException("invalid node type for ART ARTScanner: %d", type);
58410 }
58411 }
58412 }