コード例 #1
0
            /// <summary>
            /// Perform a deep copy of a path consisting of linked nodes
            /// </summary>
            /// <param name="curFirstNode">First node of the current path</param>
            /// <returns>First node of the copied path</returns>
            static TrainpathNode DeepCopyOfLinkedNodes(TrainpathNode curFirstNode)
            {
                if (curFirstNode == null)
                {
                    return(null);
                }

                TrainpathNode newFirstNode = curFirstNode.ShallowCopyNoLinks();

                TrainpathNode curMainNode   = curFirstNode;
                TrainpathNode newMainNode   = newFirstNode;
                TrainpathNode curSidingNode = null;
                TrainpathNode newSidingNode = null;
                TrainpathNode newNextMainNode;

                while (curMainNode.NextMainNode != null)
                {
                    // in case there is a passing path, follow that first.
                    // At the end of the path, curSidingNode will be the main Node to link again to
                    if (curMainNode.NextSidingNode != null)
                    {
                        curSidingNode = curMainNode;
                        newSidingNode = newMainNode;
                        while (curSidingNode.NextSidingNode != null)
                        {
                            newSidingNode.NextSidingNode          = curSidingNode.NextSidingNode.ShallowCopyNoLinks();
                            newSidingNode.NextSidingNode.PrevNode = newSidingNode;

                            curSidingNode = curSidingNode.NextSidingNode;
                            newSidingNode = newSidingNode.NextSidingNode;
                        }
                    }

                    if (curSidingNode == curMainNode.NextMainNode)
                    {
                        // We need to relink to the end of a siding path. The corresponding node has already been created
                        newNextMainNode = newSidingNode;
                        curSidingNode   = null; // no linking needed anymore
                    }
                    else
                    {
                        newNextMainNode = curMainNode.NextMainNode.ShallowCopyNoLinks();
                    }
                    newNextMainNode.PrevNode = newMainNode;
                    newMainNode.NextMainNode = newNextMainNode;

                    curMainNode = curMainNode.NextMainNode;
                    newMainNode = newMainNode.NextMainNode;
                }

                return(newFirstNode);
            }