bool Graph::Node::reachableBy(Node *node, Node *term) { Stack stack; Node *pos; const int seq = graph->nextSequence(); stack.push(node); while (stack.getSize()) { pos = reinterpret_cast<Node *>(stack.pop().u.p); if (pos == this) return true; if (pos == term) continue; for (EdgeIterator ei = pos->outgoing(); !ei.end(); ei.next()) { if (ei.getType() == Edge::BACK || ei.getType() == Edge::DUMMY) continue; if (ei.getNode()->visit(seq)) stack.push(ei.getNode()); } } return pos == this; }
bool Graph::Node::reachableBy(const Node *node, const Node *term) const { std::stack<const Node *> stack; const Node *pos = NULL; const int seq = graph->nextSequence(); stack.push(node); while (!stack.empty()) { pos = stack.top(); stack.pop(); if (pos == this) return true; if (pos == term) continue; for (EdgeIterator ei = pos->outgoing(); !ei.end(); ei.next()) { if (ei.getType() == Edge::BACK || ei.getType() == Edge::DUMMY) continue; if (ei.getNode()->visit(seq)) stack.push(ei.getNode()); } } return pos == this; }