void SymbolTable::install(Node *Root) { TraceClass::Method _("install", Node::Trace); // Before starting, clear all known caches. VisitedNodesType VisitedNodes; NodeVectorType AdditionalNodes; for (const auto &Pair : SymbolMap) clearSubtreeCaches(Pair.second, VisitedNodes, AdditionalNodes); clearSubtreeCaches(Root, VisitedNodes, AdditionalNodes); NodeVectorType MoreNodes; while (!AdditionalNodes.empty()) { MoreNodes.swap(AdditionalNodes); while (!MoreNodes.empty()) { Node *Nd = MoreNodes.back(); MoreNodes.pop_back(); clearSubtreeCaches(Nd, VisitedNodes, AdditionalNodes); } } VisitedNodes.clear(); installDefinitions(Root); for (const auto &Pair : SymbolMap) installSubtreeCaches(Pair.second, VisitedNodes, AdditionalNodes); while (!AdditionalNodes.empty()) { MoreNodes.swap(AdditionalNodes); while (!MoreNodes.empty()) { Node *Nd = MoreNodes.back(); MoreNodes.pop_back(); installSubtreeCaches(Nd, VisitedNodes, AdditionalNodes); } } }
/** * Get the last node in the list. */ XalanNode* getLast() const { return m_countNodes.empty() == true ? 0 : m_countNodes.back(); }