示例#1
0
        private XmlDiffNode HTFindAndRemoveMatchingNode(
            Hashtable hashtable,
            XmlDiffNodeListHead nodeListHead,
            XmlDiffNode nodeToMatch)
        {
            var first = nodeListHead._first;
            var node  = first._node;

            if (this.IdenticalSubtrees(node, nodeToMatch))
            {
                if (first._next == null)
                {
                    hashtable.Remove(node.HashValue);
                }
                else
                {
                    nodeListHead._first = first._next;
                }
                return(node);
            }
            while (first._next != null)
            {
                if (this.IdenticalSubtrees(first._node, nodeToMatch))
                {
                    first._next = first._next._next;
                    if (first._next == null)
                    {
                        nodeListHead._last = first;
                    }
                    return(node);
                }
            }
            return(null);
        }
示例#2
0
        private void AddNodeToHashTable(Hashtable hashtable, XmlDiffNode node)
        {
            var hashValue        = node.HashValue;
            var diffNodeListHead = (XmlDiffNodeListHead)hashtable[hashValue];

            if (diffNodeListHead == null)
            {
                hashtable[hashValue] = new XmlDiffNodeListHead(new XmlDiffNodeListMember(node, null));
            }
            else
            {
                var diffNodeListMember = new XmlDiffNodeListMember(node, null);
                diffNodeListHead._last._next = diffNodeListMember;
                diffNodeListHead._last       = diffNodeListMember;
            }
        }
示例#3
0
    private XmlDiffNode HTFindAndRemoveMatchingNode( Hashtable hashtable, XmlDiffNodeListHead nodeListHead, XmlDiffNode nodeToMatch )
    {
        Debug.Assert( hashtable != null );
        Debug.Assert( nodeListHead != null );

        // find matching node in the list
        XmlDiffNodeListMember nodeList = nodeListHead._first;
        XmlDiffNode node = nodeList._node;
        if ( IdenticalSubtrees( node, nodeToMatch ) ) {
            // remove the node itself
            if ( nodeList._next == null ) {
                hashtable.Remove( node.HashValue );
            }
            else {
                Debug.Assert( nodeListHead._first != nodeListHead._last );
                nodeListHead._first = nodeList._next;
            }
            return node;
        } 
        else {
            while ( nodeList._next != null ) {
                if ( IdenticalSubtrees( nodeList._node, nodeToMatch ) ) {
                    nodeList._next = nodeList._next._next;
                    if ( nodeList._next == null ) {
                        nodeListHead._last = nodeList;
                    }
                    return node;
                }
            }
            return null;
        }
    }
示例#4
0
    private void AddNodeToHashTable( Hashtable hashtable, XmlDiffNode node )
    {
        Debug.Assert( hashtable != null );
        Debug.Assert( node != null );
        Debug.Assert( node.NodeType != XmlDiffNodeType.ShrankNode );

        ulong hashValue = node.HashValue;

        XmlDiffNodeListHead nodeListHead = (XmlDiffNodeListHead) hashtable[ hashValue ];
        if ( nodeListHead == null ) {
            hashtable[ hashValue ] = new XmlDiffNodeListHead( new XmlDiffNodeListMember( node, null ) ); 
        }
        else 
        {
            XmlDiffNodeListMember newMember = new XmlDiffNodeListMember( node, null );
            nodeListHead._last._next = newMember;
            nodeListHead._last = newMember;
        }
    }