Exemple #1
0
        /// <summary>
        /// Executes a traversal of the virtual tree of archived files.
        /// </summary>
        /// <param name="visitorImplementation">The visitor implementation to execute when visiting each node.</param>
        public void TraverseFileTree(IVirtualFileTreeVisitor visitorImplementation)
        {
            ArgCheck.NotNull(visitorImplementation, nameof(visitorImplementation));
            this.ThrowIfLocked();

            this.FileIndex.TraverseFileTree(visitorImplementation);
        }
Exemple #2
0
        /// <summary>
        /// Executes a traversal of the <see cref="VirtualFileTree"/>.
        /// </summary>
        /// <param name="visitorImplementation">The visitor implementation to execute when visiting each node.</param>
        public void TraverseNodes(IVirtualFileTreeVisitor visitorImplementation)
        {
            visitorImplementation.OnStart();

            var traversal = new Stack <VirtualFileTreeNode>();

            traversal.Push(this.Root);

            var visitedNodes = new HashSet <VirtualFileTreeNode>();

            while (traversal.Count > 0)
            {
                var curNode = traversal.Pop();

                if (curNode.IsEmpty)
                {
                    continue;
                }

                if (visitedNodes.Contains(curNode))
                {
                    // Pre-order traveral visit was previously done.
                    // Skip the post-order visit callback if the node has no files.
                    if (curNode.Files.Count > 0)
                    {
                        visitorImplementation.OnPostOrderVisit(
                            curNode.Directory,
                            new ReadOnlySpan <AegisFileInfo>(curNode.Files.Values.ToArray()));
                    }
                }
                else
                {
                    // Skip the pre-order visit callback if the node has no files.
                    if (curNode.Files.Count > 0)
                    {
                        visitorImplementation.OnPreOrderVisit(
                            curNode.Directory,
                            new ReadOnlySpan <AegisFileInfo>(curNode.Files.Values.ToArray()));
                    }
                    visitedNodes.Add(curNode);

                    // We'll revisit this node when we're done with its children for the post-order traversal.
                    traversal.Push(curNode);

                    // We'll visit all the node's children too, starting with the leftmost.
                    foreach (var child in curNode.Children.Values.Reverse())
                    {
                        traversal.Push(child);
                    }
                }
            }

            visitorImplementation.OnDone();
        }
Exemple #3
0
 /// <summary>
 /// Executes a traversal of the virtual tree of archived files.
 /// </summary>
 /// <param name="visitorImplementation">The visitor implementation to execute when visiting each node.</param>
 public void TraverseFileTree(IVirtualFileTreeVisitor visitorImplementation)
 => this.FileTree.TraverseNodes(visitorImplementation);