예제 #1
0
        /// <summary>
        ///     Perform the topological sort algorithm on our graph
        /// </summary>
        private IList TopologicalSort(DependencyMap dependents, DependencyMap precedents, IList sources)
        {
            var   q                = new Queue(sources);
            IList output           = new ArrayList();
            IList directDependents = new ArrayList();

            while (q.Count > 0)
            {
                var n = (Reference)q.Dequeue();
                output.Add(n);

                directDependents.Clear();
                dependents.GetDirectDependents(n, directDependents);

                foreach (Reference m in directDependents)
                {
                    dependents.RemoveDependency(n, m);
                    precedents.RemoveDependency(m, n);
                    if (precedents.ContainsTail(m) == false)
                    {
                        q.Enqueue(m);
                    }
                }
            }

            // We assume no circular references
            return(output);
        }
예제 #2
0
        private void RemoveNonSourcesFromRoots(IList roots, DependencyMap precedents)
        {
            var arr = new Reference[roots.Count];

            roots.CopyTo(arr, 0);

            for (int i = 0; i <= arr.Length - 1; i++)
            {
                Reference root = arr[i];
                if (precedents.ContainsTail(root))
                {
                    roots.Remove(root);
                }
            }
        }