private void TraversalOnNodeDiscovered(object sender, NodeDiscoveryEventArgs e) { if (!_indices.ContainsKey(e.NewNode)) { _indices[e.NewNode] = _indices.Count; _order.Add(e.NewNode); } }
private void TraversalOnNodeDiscovered(object sender, NodeDiscoveryEventArgs e) { if (!e.ContinueExploring) { return; } if (e.Origin == null) { AddRemainingNodes(); } else { var originNode = e.Origin.GetOtherNode(e.NewNode); while (_stack.Peek() != originNode) { _order.Add(_stack.Pop()); } } _stack.Push(e.NewNode); }
/// <inheritdoc /> public void Run(INode entrypoint) { if (entrypoint == null) { throw new ArgumentNullException(nameof(entrypoint)); } var visited = new HashSet <INode>(); var stack = new Stack <(INode node, IEdge edge)>(); stack.Push((entrypoint, null)); while (stack.Count > 0) { var(node, origin) = stack.Pop(); var eventArgs = new NodeDiscoveryEventArgs(node, origin) { ContinueExploring = visited.Add(node) }; OnNodeDiscovered(eventArgs); if (eventArgs.Abort) { return; } if (eventArgs.ContinueExploring) { var nextEdges = ReverseTraversal ? node.GetIncomingEdges() : node.GetOutgoingEdges(); foreach (var edge in nextEdges) { stack.Push((edge.GetOtherNode(node), edge)); } } } OnTraversalCompleted(); }
/// <summary> /// Fires and handles the node discovered event. /// </summary> /// <param name="e">The event arguments.</param> protected virtual void OnNodeDiscovered(NodeDiscoveryEventArgs e) { NodeDiscovered?.Invoke(this, e); }