private void SetLinkValue(RawLink value) { LinkType type = value.Type; int endId1 = value.End1Id; int endId2 = value.End2Id; switch (type) { case LinkType.EtherNet: _ethLinksMatrix[endId1, endId2] = value; break; case LinkType.RapidIO: _rioLinksMatrix[endId1, endId2] = value; break; case LinkType.GTX: GtxLinksMatrix[endId1, endId2] = value; break; default: //LinkType.LVDS LvdsLinksMatrix[endId1, endId2] = value; break; } }
protected override void SetPointers(IResizableDirectMemory memory) { _header = (LinksHeader <ulong> *)memory.Pointer; _links = (RawLink <ulong> *)memory.Pointer; SourcesTreeMethods = _createSourceTreeMethods(); TargetsTreeMethods = _createTargetTreeMethods(); UnusedLinksListMethods = new UInt64UnusedLinksListMethods(_links, _header); }
} //LVDS连接矩阵 public RawTopo(int nodeNum) { NodeArray = new RawNode[nodeNum]; _ethLinksMatrix = new RawLink[nodeNum, nodeNum]; _rioLinksMatrix = new RawLink[nodeNum, nodeNum]; GtxLinksMatrix = new RawLink[nodeNum, nodeNum]; LvdsLinksMatrix = new RawLink[nodeNum, nodeNum]; }
//添加一个RowSubLink到相关的RowLink上 private void AddSubLinkInner(LinkType type, int urlId1, int urlId2, RawSubLink sLink) { //获取一条RowLink RawLink rowLink = GetLinkValue(type, urlId1, urlId2); if (rowLink == null) { rowLink = new RawLink(type, urlId1, urlId2); SetLinkValue(rowLink); } rowLink.AddSubLine(sLink); }
//获取与RowNode相连的RowLink的集合,集合数组的下标为对端RowNode的urlId public RawLink[] GetConnectedLink(LinkType linkType, RawNode node) { RawLink[] resultLinks = new RawLink[NodeArray.Length]; for (int i = 0; i < NodeArray.Length; i++) { if ((i != node.UrlId) && (NodeArray[i].Type != EndType.VPX)) {//对端端点不能为自己,且不能为vpx端点 RawLink rLink = GetLinkValue(linkType, node.UrlId, i); if (rLink != null) { resultLinks[i] = rLink; } } } return(resultLinks); }
//按照深度优先的方式搜索所有节点 private void DFS_Node(LinkType linkType, RawNode node, int[] visitedNodes, List <RawNode> nodeList) { visitedNodes[node.UrlId] = 1; nodeList.Add(node); for (int i = 0; i < NodeArray.Length; i++) { //访问该顶点互联的其他顶点(不能是vpx端点,且端点没被访问过) if ((NodeArray[i].Type != EndType.VPX) && (visitedNodes[NodeArray[i].UrlId] == 0)) { RawLink gLink = GetLinkValue(linkType, node.UrlId, i); if (gLink != null) { DFS_Node(linkType, NodeArray[i], visitedNodes, nodeList); } } } }
protected UInt64LinksAvlBalancedTreeMethodsBase(LinksConstants <ulong> constants, RawLink <ulong> *links, LinksHeader <ulong> *header) : base(constants, (byte *)links, (byte *)header) { Links = links; Header = header; }
protected UInt32LinksRecursionlessSizeBalancedTreeMethodsBase(LinksConstants <uint> constants, RawLink <uint> *links, LinksHeader <uint> *header) : base(constants, (byte *)links, (byte *)header) { Links = links; Header = header; }
public UInt32LinksSourcesRecursionlessSizeBalancedTreeMethods(LinksConstants <uint> constants, RawLink <uint> *links, LinksHeader <uint> *header) : base(constants, links, header) { }
public UInt64LinksSourcesSizeBalancedTreeMethods(LinksConstants <ulong> constants, RawLink <ulong> *links, LinksHeader <ulong> *header) : base(constants, links, header) { }
public UInt32UnusedLinksListMethods(RawLink <uint> *links, LinksHeader <uint> *header) : base((byte *)links, (byte *)header) { _links = links; _header = header; }
protected override void ResetPointers() { base.ResetPointers(); _links = null; _header = null; }
public UInt32LinksTargetsSizeBalancedTreeMethods(LinksConstants <uint> constants, RawLink <uint> *links, LinksHeader <uint> *header) : base(constants, links, header) { }
public UInt64LinksTargetsAvlBalancedTreeMethods(LinksConstants <ulong> constants, RawLink <ulong> *links, LinksHeader <ulong> *header) : base(constants, links, header) { }