public void Add(string topic, T node) { string[] parts = Topic.Split(topic); var current = this; string currentTopic = ""; foreach (var part in parts) { currentTopic += "/" + part; if (Topic.IsWildcard(part)) { current.nodesAsterisk.Add(node); return; } if (!current.HasSubtopic(part)) { current.subtopics.Add(part, Router <T> .ForTopic(currentTopic)); } current = current.subtopics[part]; } current.nodes.Add(node); }
public ICollection <T> NodesFor(string topic) { string[] parts = Topic.Split(topic); var current = this; HashSet <T> nodes = new HashSet <T>(); foreach (var part in parts) { nodes.UnionWith(current.nodesAsterisk); if (!current.HasSubtopic(part)) { return(nodes); } current = current.subtopics[part]; } nodes.UnionWith(current.nodes); return(nodes); }
public bool HasNodesFor(string topic) { string[] parts = Topic.Split(topic); var current = this; foreach (var part in parts) { if (current.nodesAsterisk.Count > 0) { return(true); } if (!current.HasSubtopic(part)) { return(false); } current = current.subtopics[part]; } return(current.nodes.Count > 0); }
public void Remove(string topic, T node) { string[] parts = Topic.Split(topic); var current = this; foreach (var part in parts) { if (Topic.IsWildcard(part)) { current.nodesAsterisk.Remove(node); } if (!current.HasSubtopic(part)) { // No subscriber has subscribed the topic // Still, that's weird. return; } current = current.subtopics[part]; } current.nodes.Remove(node); }