/// <summary>
        /// チャッターエントリーを追加する
        /// </summary>
        /// <param name="nodeEntry">チャッターエントリー</param>
        /// <returns>追加に成功した場合は true</returns>
        public bool AddFlatNodeEntry(MieChatterNodeEntry nodeEntry)
        {
            if (this.FlatNodes.ContainsKey(nodeEntry.NodeID))
            {
                //// このノードはすでに登録済み。
                return(false);
            }
            else
            {
                //// FlatNodeに追加する。
                this.FlatNodes.Add(nodeEntry.NodeID, nodeEntry);
                if (nodeEntry.IsRootNode)
                {
                    if (this.NodeEntry == null)
                    {
                        this.NodeEntry = nodeEntry;
                    }
                    else
                    {
                        var msg = $"Duplicate root node({nodeEntry.NodeID}).";
                        logger.Error(msg);
                    }
                }

                return(true);
            }
        }
Esempio n. 2
0
        /// <summary>
        /// 番兵用ノードを作成する。
        /// 番兵なのでToNodeは存在させない。
        /// </summary>
        /// <param name="nodeID">番兵用ノードのNodeID</param>
        /// <param name="fromID">番兵用ノードのToID</param>
        /// <returns>番兵用ノード</returns>
        public static MieChatterNodeEntry CreateStopNode(int nodeID, int fromID)
        {
            MieChatterNodeEntry node = new MieChatterNodeEntry(
                NNodeType.Unknown,
                nodeID,
                false);

            node.Attribute = NNodeAttribute.StopNode;
            node.AddFromNodeID(fromID);

            return(node);
        }
Esempio n. 3
0
 /// <summary>
 /// チャッターリンクエントリーを追加する。追加に成功した場合は true を返す。
 /// </summary>
 /// <param name="nodeEntry">チャッターリンクエントリー</param>
 /// <returns>追加の成否</returns>
 public bool AddNodeEntry(MieChatterNodeEntry nodeEntry)
 {
     if (this.Nodes.ContainsKey(nodeEntry.NodeID))
     {
         //// このノードはすでに登録済みのためスキップ
         return(false);
     }
     else
     {
         this.Nodes.Add(nodeEntry.NodeID, nodeEntry);
         return(true);
     }
 }
        /// <summary>
        /// ノードのリンク情報を構築する。
        /// </summary>
        public void BuildLink()
        {
            HashSet <int> flatTo = new HashSet <int>();

            foreach (var link in this.Links)
            {
                var fromNode = this.GetNode(link.FromeNode);

                if (fromNode == null)
                {
                    continue;
                }

                //// ルートノードを登録
                if (fromNode.IsRootNode)
                {
                    if (this.NodeEntry.GetNode(fromNode.NodeID) != null)
                    {
                        //// すでに登録済み:無視。
                    }
                    else
                    {
                        if (this.NodeEntry == null)
                        {
                            this.NodeEntry = fromNode;
                        }
                    }
                }

                //// 子ノードを登録
                var toNode = this.GetNode(link.ToNode);
                //// リンクの無限循環を防止するため、すでにリンク先が登録されていた場合は、リンクを追加しない。
                if (flatTo.Add(link.ToNode))
                {
                    //// 未登録
                    fromNode.AddNodeEntry(toNode);
                }
                else
                {
                    //// すでに登録済みの場合は番兵ノードを追加する。
                    var stopNode = MieChatterNodeEntry.CreateStopNode(link.ToNode, link.FromeNode);
                    stopNode.AddFromNodeID(link.FromeNode);

                    fromNode.AddNodeEntry(stopNode);
                }

                toNode.AddFromNodeID(link.FromeNode);
            }
        }