2008-10-06 Atsushi Enomoto <atsushi@ximian.com>
authorAtsushi Eno <atsushieno@gmail.com>
Mon, 6 Oct 2008 09:43:14 +0000 (09:43 -0000)
committerAtsushi Eno <atsushieno@gmail.com>
Mon, 6 Oct 2008 09:43:14 +0000 (09:43 -0000)
* Expression.cs, Iterator.cs : ChildIterator is not a SimpleIterator
  now. And reduced extra clone when the context node has no child.

svn path=/branches/atsushi-200810/mcs/; revision=114931

mcs/class/System.XML/System.Xml.XPath/ChangeLog
mcs/class/System.XML/System.Xml.XPath/Expression.cs
mcs/class/System.XML/System.Xml.XPath/Iterator.cs

index 632a6766b5131220803fce89c97f7019bda61d7a..1a6b351f0382d4981d0a5d36ec117277a31e67d6 100644 (file)
@@ -1,3 +1,8 @@
+2008-10-06  Atsushi Enomoto <atsushi@ximian.com>
+
+       * Expression.cs, Iterator.cs : ChildIterator is not a SimpleIterator
+         now. And reduced extra clone when the context node has no child.
+
 2008-10-03  Atsushi Enomoto <atsushi@ximian.com>
 
        * Iterator.cs : now we do not seem to need clone in
index 398246f91d85104137252bf75ca5b14ec2d3133a..b92419aabbded969ff83ecd4143e3280e50816ee 100644 (file)
@@ -1394,7 +1394,7 @@ namespace System.Xml.XPath
                        }
                }
                public Axes Axis { get { return _axis; }}
-               public virtual SimpleIterator Evaluate (BaseIterator iter)
+               public BaseIterator Evaluate (BaseIterator iter)
                {
                        switch (_axis)
                        {
@@ -1441,7 +1441,7 @@ namespace System.Xml.XPath
                public AxisSpecifier Axis { get { return _axis; }}
                public override object Evaluate (BaseIterator iter)
                {
-                       SimpleIterator iterAxis = _axis.Evaluate (iter);
+                       BaseIterator iterAxis = _axis.Evaluate (iter);
                        return new AxisIterator (iterAxis, this);
                }
                
index 837b6a40b2a9d66c49c94887b35317f1c9134136..98ae03c16955d0fd54a0c06ce6dbaf66e02fcf7c 100644 (file)
@@ -101,6 +101,12 @@ namespace System.Xml.XPath
 
                public abstract bool MoveNextCore ();
 
+               internal XPathNavigator PeekNext ()
+               {
+                       XPathNodeIterator i = Clone ();
+                       return i.MoveNext () ? i.Current : null;
+               }
+
                public override string ToString ()
                {
                        if (Current != null)
@@ -281,25 +287,38 @@ namespace System.Xml.XPath
                }
        }
 
-       internal class ChildIterator : SimpleIterator
+       internal class ChildIterator : BaseIterator
        {
-               public ChildIterator (BaseIterator iter) : base (iter) {}
-               private ChildIterator (ChildIterator other) : base (other, true) {}
+               XPathNavigator _nav;
+
+               public ChildIterator (BaseIterator iter) : base (iter.NamespaceManager) 
+               {
+                       _nav = iter.CurrentPosition == 0 ? iter.PeekNext () : iter.Current;
+                       if (_nav != null && _nav.HasChildren)
+                               _nav = _nav.Clone ();
+                       else
+                               _nav = null;
+               }
+               private ChildIterator (ChildIterator other) : base (other)
+               {
+                       _nav = other._nav == null ? null : other._nav.Clone ();
+               }
+
                public override XPathNodeIterator Clone () { return new ChildIterator (this); }
+
                public override bool MoveNextCore ()
                {
-                       bool fSuccess = (CurrentPosition == 0) ? _nav.MoveToFirstChild () : _nav.MoveToNext ();
-//                     if (fSuccess) {
-//                             Current.MoveTo (_nav);
-//                     }
-                       return fSuccess;
+                       if (_nav == null)
+                               return false;
+
+                       return (CurrentPosition == 0) ? _nav.MoveToFirstChild () : _nav.MoveToNext ();
                }
 
                public override XPathNavigator Current {
                        get {
-                               if (CurrentPosition > 0)
-                                       base.Current.MoveTo (_nav);
-                               return base.Current;
+                               if (CurrentPosition == 0)
+                                       return null;
+                               return _nav;
                        }
                }
        }
@@ -769,13 +788,13 @@ namespace System.Xml.XPath
 
        internal class AxisIterator : BaseIterator
        {
-               private SimpleIterator _iter;
+               private BaseIterator _iter;
                private NodeTest _test;
                        
                //string name, ns;
                //XPathNodeType matchType;
 
-               public AxisIterator (SimpleIterator iter, NodeTest test) : base (iter.NamespaceManager)
+               public AxisIterator (BaseIterator iter, NodeTest test) : base (iter.NamespaceManager)
                {
                        _iter = iter;
                        _test = test;
@@ -789,7 +808,7 @@ namespace System.Xml.XPath
 
                private AxisIterator (AxisIterator other) : base (other)
                {
-                       _iter = (SimpleIterator) other._iter.Clone ();
+                       _iter = (BaseIterator) other._iter.Clone ();
                        _test = other._test;
                        //name = other.name;
                        //ns = other.ns;