/** Recursively determines the distance the beginning (lower end) of the quads * have from the start of the track. * \param node The node index for which to set the distance from start. * \param new_distance The new distance for the specified graph node. */ void QuadGraph::computeDistanceFromStart(unsigned int node, float new_distance) { GraphNode *gn = m_all_nodes[node]; float current_distance = gn->getDistanceFromStart(); // If this node already has a distance defined, check if the new distance // is longer, and if so adjust all following nodes. Without this the // length of the track (as taken by the distance from start of the last // node) could be smaller than some of the paths. This can result in // incorrect results for the arrival time estimation of the AI karts. // See trac #354 for details. // Then there is no need to test/adjust any more nodes. if(current_distance>=0) { if(current_distance<new_distance) { float delta = new_distance - current_distance; updateDistancesForAllSuccessors(gn->getQuadIndex(), delta, 0); } return; } // Otherwise this node has no distance defined yet. Set the new // distance, and recursively update all following nodes. gn->setDistanceFromStart(new_distance); for(unsigned int i=0; i<gn->getNumberOfSuccessors(); i++) { GraphNode *gn_next = m_all_nodes[gn->getSuccessor(i)]; // The start node (only node with distance 0) is reached again, // recursion can stop now if(gn_next->getDistanceFromStart()==0) continue; computeDistanceFromStart(gn_next->getQuadIndex(), new_distance + gn->getDistanceToSuccessor(i)); } // for i } // computeDistanceFromStart
/* * DeleteCFG() * Remove one CFG. */ void DeleteCFG(GraphNode *Root) { NodeVec VisitStack; NodeSet Visited; VisitStack.push_back(Root); while(VisitStack.size()) { GraphNode *Parent = VisitStack.back(); VisitStack.pop_back(); if (Visited.count(Parent)) continue; Visited.insert(Parent); NodeVec &Child = Parent->getSuccessor(); for (int i = 0, e = Child.size(); i < e; i++) VisitStack.push_back(Child[i]); } for (NodeSet::iterator I = Visited.begin(), E = Visited.end(); I != E; I++) delete *I; }