コード例 #1
0
 private void TraversalOnNodeDiscovered(object sender, NodeDiscoveryEventArgs e)
 {
     if (!_indices.ContainsKey(e.NewNode))
     {
         _indices[e.NewNode] = _indices.Count;
         _order.Add(e.NewNode);
     }
 }
コード例 #2
0
ファイル: PostOrderRecorder.cs プロジェクト: mirec12590/Echo
        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);
        }
コード例 #3
0
        /// <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();
        }
コード例 #4
0
 /// <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);
 }