RealFoliate() private method

private RealFoliate ( ) : void
return void
示例#1
0
        internal XmlNodeOrder ComparePosition( XPathNodePointer other ) {
            //Debug.WriteLineIf( XmlTrace.traceXPathNodePointerFunctions.Enabled, "XPathNodePointer:ComparePosition(other)");
            RealFoliate();
            other.RealFoliate();
            Debug.Assert( other != null );
            if ( IsSamePosition( other ) )
                return XmlNodeOrder.Same;
            XmlNode curNode1 = null, curNode2 = null;
            //deal with namespace node first
            if ( this.NodeType == XPathNodeType.Namespace && other.NodeType == XPathNodeType.Namespace ) {
                if ( this._parentOfNS == other._parentOfNS )
                    return this.CompareNamespacePosition( other );
                //if not from the same parent
                curNode1 = this._parentOfNS;
                curNode2 = other._parentOfNS;
            }
            else if ( this.NodeType == XPathNodeType.Namespace ) {
                Debug.Assert( other.NodeType != XPathNodeType.Namespace );
                if ( this._parentOfNS == other._node ) {
                    //from the same region, NS nodes come before all other nodes
                    if ( other._column == null )
                        return XmlNodeOrder.After;
                    else
                        return XmlNodeOrder.Before;
                }
                //if not from the same region
                curNode1 = this._parentOfNS;
                curNode2 = other._node;
            } 
            else if ( other.NodeType == XPathNodeType.Namespace ) {
                Debug.Assert( this.NodeType != XPathNodeType.Namespace );
                if ( this._node == other._parentOfNS ) {
                    //from the same region
                    if ( this._column == null )
                        return XmlNodeOrder.Before;
                    else
                        return XmlNodeOrder.After;
                }
                //if not from the same region
                curNode1 = this._node;
                curNode2 = other._parentOfNS;
            }
            else {
                if ( this._node == other._node ) {
                    //compare within the same region
                    if ( this._column == other._column ) {
                        //one is the children of the other
                        Debug.Assert( this._fOnValue != other._fOnValue );
                        if ( this._fOnValue )
                            return XmlNodeOrder.After;
                        else
                            return XmlNodeOrder.Before;
                    }
                    else {
                        Debug.Assert( this.Row == other.Row ); //in the same row
                        if ( this._column == null ) 
                            return XmlNodeOrder.Before;
                        else if ( other._column == null ) 
                            return XmlNodeOrder.After;
                        else if ( this._column.Ordinal < other._column.Ordinal )
                            return XmlNodeOrder.Before;
                        else
                            return XmlNodeOrder.After;
                    }
                }
                curNode1 = this._node;
                curNode2 = other._node;
                
            }

            Debug.Assert( curNode1 != null );
            Debug.Assert( curNode2 != null );

            if (curNode1 == null || curNode2 == null) {
                return XmlNodeOrder.Unknown;
            }


            int depth1 = -1, depth2 = -1;
            XmlNode root1 = XPathNodePointer.GetRoot( curNode1, ref depth1 );
            XmlNode root2 = XPathNodePointer.GetRoot( curNode2, ref depth2 );
            if ( root1 != root2 ) 
                return XmlNodeOrder.Unknown;

            if ( depth1 > depth2 ) {
                while ( curNode1 != null && depth1 > depth2 ) {
                    curNode1 = ( ( curNode1.NodeType == XmlNodeType.Attribute ) ? ( ((XmlAttribute)curNode1).OwnerElement ) : ( curNode1.ParentNode ) );
                    depth1--;
                }
                if ( curNode1 == curNode2 )
                    return XmlNodeOrder.After;
            }
            else if ( depth2 > depth1 ) {
                while ( curNode2 != null && depth2 > depth1 ) {
                    curNode2 = ( ( curNode2.NodeType == XmlNodeType.Attribute ) ? ( ((XmlAttribute)curNode2).OwnerElement ) : ( curNode2.ParentNode ) );
                    depth2--;
                }
                if ( curNode1 == curNode2 )
                    return XmlNodeOrder.Before;
            }

            XmlNode parent1 = GetParent(curNode1);
            XmlNode parent2 = GetParent(curNode2);
            XmlNode nextNode = null;
            while ( parent1 != null && parent2 != null ) {
                if ( parent1 == parent2 ) {
                    while (curNode1 != null ) {
                        nextNode = curNode1.NextSibling;
                        if ( nextNode == curNode2 )
                            return XmlNodeOrder.Before;
                        curNode1 = nextNode;
                    }
                    return XmlNodeOrder.After;
                }
                curNode1 = parent1;
                curNode2 = parent2;
                parent1 = curNode1.ParentNode;
                parent2 = curNode2.ParentNode;
            }
            
            //logically, we shouldn't reach here
            Debug.Assert( false );
            return XmlNodeOrder.Unknown;
        }
示例#2
0
        internal bool IsSamePosition( XPathNodePointer pointer ) {
            //Debug.WriteLineIf( XmlTrace.traceXPathNodePointerFunctions.Enabled, "XPathNodePointer:IsSamePosition(pointer)");
            RealFoliate();
            pointer.RealFoliate();
            AssertValid();
            pointer.AssertValid();
            if (_column == null && pointer._column == null)
                return ( pointer._node == this._node && pointer._parentOfNS == this._parentOfNS );

            return ( pointer._doc == this._doc 
                    && pointer._node == this._node 
                    && pointer._column == this._column 
                    && pointer._fOnValue == this._fOnValue 
                    && pointer._parentOfNS == this._parentOfNS );
        }
 internal bool IsSamePosition(XPathNodePointer pointer)
 {
     this.RealFoliate();
     pointer.RealFoliate();
     if ((this._column == null) && (pointer._column == null))
     {
         return ((pointer._node == this._node) && (pointer._parentOfNS == this._parentOfNS));
     }
     return ((((pointer._doc == this._doc) && (pointer._node == this._node)) && ((pointer._column == this._column) && (pointer._fOnValue == this._fOnValue))) && (pointer._parentOfNS == this._parentOfNS));
 }
示例#4
0
        internal bool IsSamePosition(XPathNodePointer pointer)
        {
            RealFoliate();
            pointer.RealFoliate();
            AssertValid();
            pointer.AssertValid();
            if (_column == null && pointer._column == null)
                return (pointer._node == _node && pointer._parentOfNS == _parentOfNS);

            return (pointer._doc == _doc
                    && pointer._node == _node
                    && pointer._column == _column
                    && pointer._fOnValue == _fOnValue
                    && pointer._parentOfNS == _parentOfNS);
        }
 internal XmlNodeOrder ComparePosition(XPathNodePointer other)
 {
     this.RealFoliate();
     other.RealFoliate();
     if (this.IsSamePosition(other))
     {
         return XmlNodeOrder.Same;
     }
     XmlNode node = null;
     XmlNode node2 = null;
     if ((this.NodeType == XPathNodeType.Namespace) && (other.NodeType == XPathNodeType.Namespace))
     {
         if (this._parentOfNS == other._parentOfNS)
         {
             return this.CompareNamespacePosition(other);
         }
         node = this._parentOfNS;
         node2 = other._parentOfNS;
     }
     else if (this.NodeType == XPathNodeType.Namespace)
     {
         if (this._parentOfNS == other._node)
         {
             if (other._column == null)
             {
                 return XmlNodeOrder.After;
             }
             return XmlNodeOrder.Before;
         }
         node = this._parentOfNS;
         node2 = other._node;
     }
     else if (other.NodeType == XPathNodeType.Namespace)
     {
         if (this._node == other._parentOfNS)
         {
             if (this._column == null)
             {
                 return XmlNodeOrder.Before;
             }
             return XmlNodeOrder.After;
         }
         node = this._node;
         node2 = other._parentOfNS;
     }
     else
     {
         if (this._node == other._node)
         {
             if (this._column == other._column)
             {
                 if (this._fOnValue)
                 {
                     return XmlNodeOrder.After;
                 }
                 return XmlNodeOrder.Before;
             }
             if (this._column == null)
             {
                 return XmlNodeOrder.Before;
             }
             if ((other._column != null) && (this._column.Ordinal < other._column.Ordinal))
             {
                 return XmlNodeOrder.Before;
             }
             return XmlNodeOrder.After;
         }
         node = this._node;
         node2 = other._node;
     }
     if ((node != null) && (node2 != null))
     {
         int depth = -1;
         int num = -1;
         XmlNode root = GetRoot(node, ref depth);
         XmlNode node6 = GetRoot(node2, ref num);
         if (root != node6)
         {
             return XmlNodeOrder.Unknown;
         }
         if (depth > num)
         {
             while ((node != null) && (depth > num))
             {
                 node = (node.NodeType == XmlNodeType.Attribute) ? ((XmlAttribute) node).OwnerElement : node.ParentNode;
                 depth--;
             }
             if (node == node2)
             {
                 return XmlNodeOrder.After;
             }
         }
         else if (num > depth)
         {
             while ((node2 != null) && (num > depth))
             {
                 node2 = (node2.NodeType == XmlNodeType.Attribute) ? ((XmlAttribute) node2).OwnerElement : node2.ParentNode;
                 num--;
             }
             if (node == node2)
             {
                 return XmlNodeOrder.Before;
             }
         }
         XmlNode parent = this.GetParent(node);
         XmlNode parentNode = this.GetParent(node2);
         XmlNode nextSibling = null;
         while ((parent != null) && (parentNode != null))
         {
             if (parent == parentNode)
             {
                 while (node != null)
                 {
                     nextSibling = node.NextSibling;
                     if (nextSibling == node2)
                     {
                         return XmlNodeOrder.Before;
                     }
                     node = nextSibling;
                 }
                 return XmlNodeOrder.After;
             }
             node = parent;
             node2 = parentNode;
             parent = node.ParentNode;
             parentNode = node2.ParentNode;
         }
     }
     return XmlNodeOrder.Unknown;
 }