void SymbolTable::installSubtreeCaches(Node *Nd, VisitedNodesType &VisitedNodes, NodeVectorType &AdditionalNodes) { if (VisitedNodes.count(Nd)) return; TraceClass::Method _("installSubtreeCaches", Node::Trace); Node::Trace.traceSexp(Nd); VisitedNodes.insert(Nd); Nd->installCaches(AdditionalNodes); for (auto *Kid : *Nd) AdditionalNodes.push_back(Kid); }
void Tree::VisitChildrenForLeafNodes(Node * const node, NodeVectorType & leaf_nodes) const { std::vector<Node *> children = node->GetChildren(); if (children.size() == 0) leaf_nodes.push_back(node); else { std::vector<Node *>::iterator children_iter; for (children_iter = children.begin(); children_iter != children.end(); ++children_iter) VisitChildrenForLeafNodes(*children_iter, leaf_nodes); } }
/** * Get the last node in the list. */ XalanNode* getLast() const { return m_countNodes.empty() == true ? 0 : m_countNodes.back(); }
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); } } }