Пример #1
0
        // Returns a copy of a sibling tree.  node is expected to be the first sibling.
        private TextTreeNode DeepCopyContainedNodes(TextTreeNode node)
        { 
            TextTreeNode rootClone;
            TextTreeNode previousClone; 
            TextTreeNode clone; 
            TextTreeTextElementNode elementNode;
 
            rootClone = null;
            previousClone = null;

            do 
            {
                elementNode = node as TextTreeTextElementNode; 
                if (elementNode != null) 
                {
                    clone = DeepCopy(elementNode); 
                }
                else
                {
                    clone = node.Clone(); 
                }
 
                // clone will be null in one case: if we're trying to clone an 
                // empty TextNode.  We can skip empty TextNodes (symbol count == 0)
                // because we know the clones have no TextPointer references, so 
                // an empty node serves no purpose.
                Invariant.Assert(clone != null || node is TextTreeTextNode && node.SymbolCount == 0);
                if (clone != null)
                { 
                    clone.ParentNode = previousClone;
                    if (previousClone != null) 
                    { 
                        previousClone.RightChildNode = clone;
                    } 
                    else
                    {
                        Invariant.Assert(clone.Role == SplayTreeNodeRole.LocalRoot);
                        // Remember the first clone created. 
                        rootClone = clone;
                    } 
 
                    previousClone = clone;
                } 

                node = (TextTreeNode)node.GetNextNode();
            }
            while (node != null); 

            return rootClone; 
        }