예제 #1
0
        void DFS_VISIT(Vertex <T> v)
        {
            CycleChecker.Add(v, true);
            Console.WriteLine("Node visited : " + v.Data.ToString());
            foreach (var n in v.Neighbors)
            {
                //
                if (GraphType == TypeOfGraph.Directed && CycleChecker.ContainsKey(n) && CycleChecker[n])
                {
                    IsThereACycle = true;
                }
                if (Visited.ContainsKey(n))
                {
                    //This node is visited (n) and its not v's parent means there exist a cycle in undirected graph
                    if (GraphType == TypeOfGraph.Undirected && Visited[v] != n)
                    {
                        IsThereACycle = true;
                    }
                    continue;
                }

                Visited.Add(n, v);
                DFS_VISIT(n);
            }
            CycleChecker[v] = false;
        }
예제 #2
0
        public override Entity Resolve(Entity owner, string key, bool fallback = false)
        {
            using (cycleChecker = cycleChecker?.SpawnChild() ?? new CycleChecker <Resolution>(ExceptionTexts.ContentProviderCycle,
                                                                                              () => cycleChecker = null))
            {
                fallback = false;
                IEntityContentProvider provider = GetContentProvider();
                if (provider == null)
                {
                    fallback = true;
                    provider = GetContentProvider();
                }
                if (provider == null)
                {
                    throw new ContentProviderException(key, owner);
                }

                cycleChecker.AddItem(new Resolution(owner, key, provider));
                return(provider.Resolve(owner, key, fallback));
            }

            IEntityContentProvider GetContentProvider()
            {
                return(contentResolvers.Where(r => !cycleChecker.HasItem(new Resolution(owner, key, r)))
                       .FirstOrDefault(r => r.CanResolve(owner, key, fallback))
                       ?? contentResolvers.FirstOrDefault(r => r.CanResolve(owner, key, fallback)));
            }
        }
예제 #3
0
        public void Test_Has_SelfLoop()
        {
            Graph graph = new Graph(1);

            graph.AddEdge(0, 0);

            Assert.True(CycleChecker.HasCycle(graph));
        }
예제 #4
0
        public void Test_NoCycle()
        {
            Graph graph = new Graph(3);

            graph.AddEdge(0, 1);
            graph.AddEdge(1, 2);

            Assert.False(CycleChecker.HasCycle(graph));
        }
예제 #5
0
        public void Test_Has_ParallelEdge()
        {
            Graph graph = new Graph(2);

            graph.AddEdge(0, 1);
            graph.AddEdge(0, 1);

            Assert.True(CycleChecker.HasCycle(graph));
        }
예제 #6
0
        public void Test_NoCycle()
        {
            Digraph graph = new Digraph(3);

            graph.AddEdge(0, 1);
            graph.AddEdge(0, 2);

            CycleChecker checker = CycleChecker.Create(graph);

            Assert.False(checker.HasCycle);
        }
예제 #7
0
        public void Test_HasCycle()
        {
            Digraph graph = new Digraph(3);

            graph.AddEdge(0, 1);
            graph.AddEdge(1, 2);
            graph.AddEdge(2, 0);

            CycleChecker checker = CycleChecker.Create(graph);

            Assert.True(checker.HasCycle);
        }
예제 #8
0
        public void Test_GetCycle()
        {
            Digraph graph = new Digraph(3);

            graph.AddEdge(0, 1);
            graph.AddEdge(1, 2);
            graph.AddEdge(2, 0);

            CycleChecker checker = CycleChecker.Create(graph);

            AssertUtilities.Sequence(new Int32[4] {
                2, 0, 1, 2
            }, checker.GetCycle());
        }
예제 #9
0
        public override bool CanResolve(Entity owner, string key, bool fallback = false)
        {
            if (cycleChecker?.HasItem(new Resolution(owner, key)) == true)
            {
                //break cycles before they form
                return(false);
            }
            using (canCycleChecker = canCycleChecker?.SpawnChild() ?? new CycleChecker <Resolution>(ExceptionTexts.ContentProviderCycle,
                                                                                                    () => canCycleChecker = null))
            {
                Resolution resolution = new Resolution(owner, key);
                canCycleChecker.AddItem(resolution);
                bool result = contentResolvers.Any(r => r.CanResolve(owner, key, false));
                if (!result)
                {
                    canCycleChecker.RemoveAfter(resolution);
                    result = contentResolvers.Any(r => r.CanResolve(owner, key, true));
                }

                return(result);
            }
        }