using System.Collections.Generic; using Collections.Pooled; namespace MoonTools.Graph { abstract public class Graph where TNode : System.IEquatable { protected HashSet nodes = new HashSet(); protected Dictionary> neighbors = new Dictionary>(); public IEnumerable Nodes => nodes; public int Order => nodes.Count; public void AddNode(TNode node) { if (!Exists(node)) { nodes.Add(node); neighbors.Add(node, new PooledSet(ClearMode.Always)); } } public void AddNodes(params TNode[] nodes) { foreach (var node in nodes) { AddNode(node); } } public int Degree(TNode node) { CheckNodes(node); return neighbors[node].Count; } public bool Exists(TNode node) { return nodes.Contains(node); } public IEnumerable Neighbors(TNode node) { CheckNodes(node); return neighbors[node]; } protected void CheckNodes(params TNode[] givenNodes) { foreach (var node in givenNodes) { if (!Exists(node)) { throw new System.ArgumentException($"Vertex {node} does not exist in the graph"); } } } public virtual void Clear() { nodes.Clear(); neighbors.Clear(); } } }