Ejemplo n.º 1
0
        /// <summary>
        /// Builds an AcyclicGraph from the included systems
        /// </summary>
        private AcyclicGraph <UTinySystem.Reference> GetSystemGraph()
        {
            var graph = new AcyclicGraph <UTinySystem.Reference>();

            // Add all systems
            foreach (var module in EnumerateDependencies())
            {
                foreach (var systemRef in module.Systems)
                {
                    graph.Add(systemRef);
                }
            }

            // Connect all first level dependencies
            foreach (var node in graph.Nodes.ToList())
            {
                var systemRef = node.Data;
                var system    = systemRef.Dereference(Registry);

                foreach (var dependencyRef in system.ExecuteAfter)
                {
                    var depedencyNode = graph.GetOrAdd(dependencyRef);
                    graph.AddDirectedConnection(node, depedencyNode);
                }

                foreach (var dependencyRef in system.ExecuteBefore)
                {
                    var depedencyNode = graph.GetOrAdd(dependencyRef);
                    graph.AddDirectedConnection(depedencyNode, node);
                }
            }

            return(graph);
        }
            public static IEnumerable <Reference> DepthFirst(IEnumerable <UTinyType> types)
            {
                var graph = new AcyclicGraph <Reference>();

                // Push all types into the graph
                foreach (var type in types)
                {
                    graph.Add((Reference)type);
                }

                // Connect types
                foreach (var type in types)
                {
                    var typeNode = graph.GetOrAdd((Reference)type);

                    foreach (var fieldType in EnumerateFieldTypes(type))
                    {
                        var fieldTypeNode = graph.GetOrAdd(fieldType);
                        graph.AddDirectedConnection(typeNode, fieldTypeNode);
                    }
                }

                var result = new List <Reference>();

                AcyclicGraphIterator.DepthFirst.Execute(graph, type =>
                {
                    result.Add(type);
                });

                return(result);
            }