public void CreateFromFibTable(FibTable table) { Root = new FibTreeNode(null); Labels.Clear(); foreach (FibEntry entry in table) { FibTreeNode node = Root; for (int i = 0; i < entry.BinaryForm.Length; i++) { int edgeLabel = entry.BinaryForm[i] - (int)'0'; if (node.GetChild(edgeLabel) == null) { node.AddChild(edgeLabel); } node = node.GetChild(edgeLabel); } FibTreeLabel label = Labels.GetLabelByNextHop(entry.NextHop); if (label == null) { label = Labels.AddLabelForNextHop(entry.NextHop); } node.Label = label; } TreeChanged?.Invoke(); }
private void addChildrenWithStride(FibTreeNode to, FibTreeNode from, Dictionary <FibTreeNode, CompressData> compressData) { if (from.Label != null) { FibTreeLabel label = Labels.GetLabelByNextHop(from.Label.NextHop); if (label == null) { label = Labels.AddLabelForNextHop(from.Label.NextHop); } to.Label = label; } if (from.Children.Count == 0) { return; } List <FibTreeNode> childrenToAdd = from.GetChildrenAtLevel(compressData[from].OptimalStride); foreach (FibTreeNode childToAdd in childrenToAdd) { FibTreeNode newNode = to.AddChild(getConcatenatedEdgeLabelBetweenNodes(from, childToAdd)); addChildrenWithStride(newNode, childToAdd, compressData); } }
private void copyNodeAndChildrens(FibTreeNode to, FibTreeNode from) { foreach (KeyValuePair <string, FibTreeNode> child in from.Children) { FibTreeNode newNode = to.AddChild(child.Key); copyNodeAndChildrens(newNode, child.Value); } if (from.Label != null) { FibTreeLabel label = Labels.GetLabelByNextHop(from.Label.NextHop); if (label == null) { label = Labels.AddLabelForNextHop(from.Label.NextHop); } to.Label = label; } }
private void normalize_CreateLeaves(FibTreeNode node, FibTreeLabel nearestLabel) { if (node.Children.Count == 0) { return; } if (node.Label != null) { nearestLabel = node.Label; } if (node.Children.Count == 1) { string notExistingEdgeLabel = string.Format("{0}", (int)'1' - (int)node.Children.ToList()[0].Key[0]); node.AddChild(notExistingEdgeLabel, nearestLabel); } normalize_CreateLeaves(node.GetChild(0), nearestLabel); normalize_CreateLeaves(node.GetChild(1), nearestLabel); }