/// <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); }
/// <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(); }
/// <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);