Ejemplo n.º 1
0
        internal RootedProjectTree CloneProjectTreeRootToLeafWithoutBuilders(RootedProjectTree templateTree)
        {
            var root             = RootedProjectTree.Create(templateTree.Caption);
            var rootWithChildren = RecursiveAddChildren(templateTree.ProjectTree, root);

            return(rootWithChildren);
        }
Ejemplo n.º 2
0
        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;
 }
Ejemplo n.º 4
0
        internal RootedProjectTree CloneProjectTreeRootToLeafWithBuilders(RootedProjectTree templateTree)
        {
            var rootBuilder = ProjectTree.Create(templateTree.Caption).ToBuilder();

            RecursiveAddChildren(templateTree.ProjectTree, rootBuilder);
            var root = rootBuilder.ToImmutable();

            return(root.AsRoot);
        }
Ejemplo n.º 5
0
        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");
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 7
0
        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;
 }
Ejemplo n.º 11
0
        internal RootedProjectTree CloneProjectTreeLeafToRoot(RootedProjectTree templateTree)
        {
            var clone = ProjectTree.Create(templateTree.Caption).AddChildren(templateTree.ProjectTree.Children.Select(this.CloneProjectTreeLeafToRoot));

            return(clone.AsRoot);
        }
Ejemplo n.º 12
0
        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);
        }