using System; using System.Collections.Generic; namespace SmartNav.Graph; public sealed class NavGraph { private readonly Dictionary _nodes = new Dictionary(); private readonly Dictionary> _adjacency = new Dictionary>(); private readonly Dictionary> _territoryIndex = new Dictionary>(); public IReadOnlyDictionary Nodes => _nodes; public IReadOnlyDictionary> Adjacency => _adjacency; public IReadOnlyDictionary> TerritoryIndex => _territoryIndex; public int NodeCount => _nodes.Count; public int EdgeCount { get { int num = 0; foreach (List value in _adjacency.Values) { num += value.Count; } return num; } } public void AddNode(NavNode node) { bool num = !_nodes.ContainsKey(node.Id); _nodes[node.Id] = node; if (num) { _adjacency[node.Id] = new List(); if (!_territoryIndex.TryGetValue(node.TerritoryId, out List value)) { value = new List(); _territoryIndex[node.TerritoryId] = value; } value.Add(node.Id); } } public void AddEdge(NavEdge edge) { if (!_adjacency.TryGetValue(edge.FromNodeId, out List value)) { value = new List(); _adjacency[edge.FromNodeId] = value; } value.Add(edge); } public void ReplaceEdge(NavEdge edge) { if (!_adjacency.TryGetValue(edge.FromNodeId, out List value)) { value = new List(); _adjacency[edge.FromNodeId] = value; } value.RemoveAll((NavEdge e) => e.ToNodeId == edge.ToNodeId && e.EdgeType == edge.EdgeType); value.Add(edge); } public void RemoveEdges(string fromNodeId, Predicate predicate) { if (_adjacency.TryGetValue(fromNodeId, out List value)) { value.RemoveAll(predicate); } } public NavNode? GetNode(string nodeId) { if (!_nodes.TryGetValue(nodeId, out NavNode value)) { return null; } return value; } public IReadOnlyList GetEdges(string nodeId) { if (!_adjacency.TryGetValue(nodeId, out List value)) { return new List(); } return value; } public IReadOnlyList GetNodesInTerritory(uint territoryId) { if (!_territoryIndex.TryGetValue(territoryId, out List value)) { return new List(); } return value; } }