internal RootedProjectTree CloneProjectTreeRootToLeafWithoutBuilders(RootedProjectTree templateTree) { var root = RootedProjectTree.Create(templateTree.Caption); var rootWithChildren = RecursiveAddChildren(templateTree.ProjectTree, root); return(rootWithChildren); }
internal static RootedProjectTree ConstructVeryLargeTree(Random random, int depth, int maxImmediateChildrenCount, int totalNodeCount, Func <string> counter = null) { Requires.NotNull(random, "random"); Requires.Range(depth > 0, "maxDepth"); Requires.Range(totalNodeCount > 0, "totalNodeCount"); if (counter == null) { int counterPosition = 0; counter = () => "Node " + ++counterPosition; } var tree = RootedProjectTree.Create(counter()); int nodesAllocated = 1; int maxChildrenCount = Math.Min(maxImmediateChildrenCount, totalNodeCount - nodesAllocated); if (depth == 1) { tree = tree.AddChildren(Enumerable.Range(1, maxChildrenCount).Select(n => ProjectTree.Create(counter()))); nodesAllocated += maxChildrenCount; } else { int childrenCount = random.Next(maxChildrenCount) + 1; int sizePerBranch = (totalNodeCount - nodesAllocated) / childrenCount; if (sizePerBranch > 0) { tree = tree.AddChildren(Enumerable.Range(1, childrenCount).Select(n => ConstructVeryLargeTree(random, depth - 1, maxImmediateChildrenCount, sizePerBranch, counter).ProjectTree)); } } return(tree); }
public RootedProjectTree CloneProjectTreeRootToLeafWithBuilders(RootedProjectTree templateTree) { var rootBuilder = ProjectTree.Create(templateTree.Caption).ToBuilder(); RecursiveAddChildren(templateTree.ProjectTree, rootBuilder); var root = rootBuilder.ToImmutable(); return root.AsRoot; }
internal RootedProjectTree CloneProjectTreeRootToLeafWithBuilders(RootedProjectTree templateTree) { var rootBuilder = ProjectTree.Create(templateTree.Caption).ToBuilder(); RecursiveAddChildren(templateTree.ProjectTree, rootBuilder); var root = rootBuilder.ToImmutable(); return(root.AsRoot); }
private static void MeasureTests() { var tests = new ProjectTreeTests(new LogHelper()); RootedProjectTree templateTree = ProjectTreeTests.ConstructVeryLargeTree(new Random(21748171), 4, 100, 10000); Console.WriteLine("Template tree contains {0} nodes.", templateTree.GetSelfAndDescendents().Count()); MeasureReport(tests.CloneProjectTreeLeafToRoot, templateTree, "Optimal clone"); MeasureReport(tests.CloneProjectTreeRootToLeafWithBuilders, templateTree, "Sub-optimal (using builders)"); MeasureReport(tests.CloneProjectTreeRootToLeafWithoutBuilders, templateTree, "Sub-optimal"); }
private static void MeasureReport(Func<RootedProjectTree, RootedProjectTree> action, RootedProjectTree templateTree, string name) { GC.Collect(); var timer = Stopwatch.StartNew(); var result = action(templateTree); timer.Stop(); if (result.GetSelfAndDescendents().Count() != templateTree.GetSelfAndDescendents().Count()) { Console.WriteLine("FAIL: invalid clone"); } Console.WriteLine("{0} {1}", timer.Elapsed, name); }
private static RootedProjectTree RecursiveAddChildren(ProjectTree template, RootedProjectTree receiver) { RootedProjectTree latest = receiver; foreach (var templateChild in template) { var clonedTemplateChild = ProjectTree.Create(templateChild.Caption); var asChild = latest.AddChild(clonedTemplateChild).Value; var childWithChildren = RecursiveAddChildren(templateChild, asChild); latest = childWithChildren.Parent; } return(latest); }
private static RootedProjectTree RecursiveAddChildren(ProjectTree template, RootedProjectTree receiver) { RootedProjectTree latest = receiver; foreach (var templateChild in template) { var clonedTemplateChild = ProjectTree.Create(templateChild.Caption); var asChild = latest.AddChild(clonedTemplateChild).Value; var childWithChildren = RecursiveAddChildren(templateChild, asChild); latest = childWithChildren.Parent; } return latest; }
internal RootedProjectTree CloneProjectTreeRootToLeafWithoutBuilders(RootedProjectTree templateTree) { var root = RootedProjectTree.Create(templateTree.Caption); var rootWithChildren = RecursiveAddChildren(templateTree.ProjectTree, root); return rootWithChildren; }
internal RootedProjectTree CloneProjectTreeLeafToRoot(RootedProjectTree templateTree) { var clone = ProjectTree.Create(templateTree.Caption).AddChildren(templateTree.ProjectTree.Children.Select(this.CloneProjectTreeLeafToRoot)); return clone.AsRoot; }
internal RootedProjectTree CloneProjectTreeLeafToRoot(RootedProjectTree templateTree) { var clone = ProjectTree.Create(templateTree.Caption).AddChildren(templateTree.ProjectTree.Children.Select(this.CloneProjectTreeLeafToRoot)); return(clone.AsRoot); }
private static void MeasureReport(Func <RootedProjectTree, RootedProjectTree> action, RootedProjectTree templateTree, string name) { GC.Collect(); var timer = Stopwatch.StartNew(); var result = action(templateTree); timer.Stop(); if (result.GetSelfAndDescendents().Count() != templateTree.GetSelfAndDescendents().Count()) { Console.WriteLine("FAIL: invalid clone"); } Console.WriteLine("{0} {1}", timer.Elapsed, name); }