/// <summary> /// Removes the directed edge between two vertices. This operation is thread-safe. Its complexity is in O(1). If an edge /// is removed this operation will fire an OnEdgeRemoved event. /// </summary> /// <param name="source"></param> /// <param name="target"></param> public void RemoveDirectedEdge(Vertex source, Vertex target) { if (_rwl.IsReadLockHeld) throw new Exception("Synchronization error. You are probably trying to change the graph while iterating through its edges or vertices!"); _rwl.EnterWriteLock(); Edge toRemove = source.GetEdgeToSuccessor(target); // if such an edge exists if (toRemove != null && _edges.ContainsKey(toRemove.ID)) { // an undirected edge becomes directed if (toRemove.EdgeType == EdgeType.Undirected && toRemove.A == source && toRemove.B == target) { toRemove.EdgeType = EdgeType.DirectedBA; toRemove.A.ChangeEdgeRegistration(toRemove); toRemove.B.ChangeEdgeRegistration(toRemove); } // an undirected edge becomes directed else if (toRemove.EdgeType == EdgeType.Undirected && toRemove.B == source && toRemove.A == target) { toRemove.EdgeType = EdgeType.DirectedAB; toRemove.A.ChangeEdgeRegistration(toRemove); toRemove.B.ChangeEdgeRegistration(toRemove); } // a directed edge is removed else if (toRemove.Source == source && toRemove.Target == target) { _edges.Remove(toRemove.ID); toRemove.A.UnregisterEdge(toRemove); toRemove.B.UnregisterEdge(toRemove); } } _rwl.ExitWriteLock(); if (OnEdgeRemoved != null && toRemove!=null) OnEdgeRemoved(toRemove); }
/// <summary> /// Removes any directed or undirected edge between two vertices. This operation is thread-safe. Its complexity is in O(1). If an edge /// is removed this operation will fire an OnEdgeRemoved event. /// </summary> /// <param name="source"></param> /// <param name="target"></param> public void RemoveEdge(Vertex source, Vertex target) { if (_rwl.IsReadLockHeld) throw new Exception("Synchronization error. You are probably trying to change the graph while iterating through its edges or vertices!"); _rwl.EnterWriteLock(); Edge toRemove = source.GetEdgeToSuccessor(target); // Remove edge if it exists if (toRemove != null && _edges.ContainsKey(toRemove.ID)) { _edges.Remove(toRemove.ID); toRemove.Source.UnregisterEdge(toRemove); toRemove.Target.UnregisterEdge(toRemove); } _rwl.ExitWriteLock(); }