Author: atsushi
Date: 2005-03-15 16:34:04 -0500 (Tue, 15 Mar 2005)
New Revision: 41864

Modified:
   trunk/mcs/class/System.XML/Mono.Xml.Xsl.Operations/ChangeLog
   trunk/mcs/class/System.XML/Mono.Xml.Xsl.Operations/XslVariable.cs
   trunk/mcs/class/System.XML/Mono.Xml.Xsl/ChangeLog
   trunk/mcs/class/System.XML/Mono.Xml.Xsl/XslFunctions.cs
   trunk/mcs/class/System.XML/Mono.Xml.Xsl/XslKey.cs
   trunk/mcs/class/System.XML/System.Xml.XPath/ChangeLog
   trunk/mcs/class/System.XML/System.Xml.XPath/DefaultContext.cs
   trunk/mcs/class/System.XML/System.Xml.XPath/Expression.cs
   trunk/mcs/class/System.XML/System.Xml.XPath/Iterator.cs
Log:
2004-03-15  Atsushi Enomoto  <[EMAIL PROTECTED]>

        * DefaultContext.cs,
          Expression.cs,
          Iterator.cs : Now RequireSorting is not required in BaseIterator
          (it is now fully in Expression).
          Removed the last ListIterator .ctor() argument.

        * XslKey.cs : removed last ListIterator.ctor() argument.
          Reverted the last commit that changed internal key index change 
          from ArrayList to Hashtable. Avoid clone in CollectIndex().
          Sort results in Evaluate() before passing list to ListIterator.
        * XslFunctions.cs : removed last ListIterator.ctor() argument.

        * XslVariable.cs : removed last ListIterator.ctor() argument.



Modified: trunk/mcs/class/System.XML/Mono.Xml.Xsl/ChangeLog
===================================================================
--- trunk/mcs/class/System.XML/Mono.Xml.Xsl/ChangeLog   2005-03-15 21:31:06 UTC 
(rev 41863)
+++ trunk/mcs/class/System.XML/Mono.Xml.Xsl/ChangeLog   2005-03-15 21:34:04 UTC 
(rev 41864)
@@ -1,3 +1,11 @@
+2005-03-15  Atsushi Enomoto  <[EMAIL PROTECTED]>
+
+       * XslKey.cs : removed last ListIterator.ctor() argument.
+         Reverted the last commit that changed internal key index change 
+         from ArrayList to Hashtable. Avoid clone in CollectIndex().
+         Sort results in Evaluate() before passing list to ListIterator.
+       * XslFunctions.cs : removed last ListIterator.ctor() argument.
+
 2005-03-14  Atsushi Enomoto  <[EMAIL PROTECTED]>
 
        * XslKey.cs,

Modified: trunk/mcs/class/System.XML/Mono.Xml.Xsl/XslFunctions.cs
===================================================================
--- trunk/mcs/class/System.XML/Mono.Xml.Xsl/XslFunctions.cs     2005-03-15 
21:31:06 UTC (rev 41863)
+++ trunk/mcs/class/System.XML/Mono.Xml.Xsl/XslFunctions.cs     2005-03-15 
21:34:04 UTC (rev 41864)
@@ -277,7 +277,7 @@
                                }
                        }
                        
-                       return new ListIterator (list, xsltContext, false);
+                       return new ListIterator (list, xsltContext);
                }
        
                XPathNodeIterator GetDocument (XsltCompiledContext xsltContext, 
string arg0, string baseUri)
@@ -662,7 +662,7 @@
                        }
                        ArrayList al = new ArrayList ();
                        al.Add (nav);
-                       return new ListIterator (al, ctx, false);
+                       return new ListIterator (al, ctx);
                }
        }
 }

Modified: trunk/mcs/class/System.XML/Mono.Xml.Xsl/XslKey.cs
===================================================================
--- trunk/mcs/class/System.XML/Mono.Xml.Xsl/XslKey.cs   2005-03-15 21:31:06 UTC 
(rev 41863)
+++ trunk/mcs/class/System.XML/Mono.Xml.Xsl/XslKey.cs   2005-03-15 21:34:04 UTC 
(rev 41864)
@@ -59,14 +59,14 @@
                        return expr.Evaluate (iter);
                }
 
-               internal override XPathNodeType EvaluatedNodeType {
-                       get { return expr.EvaluatedNodeType; }
-               }
-
-               public override XPathResultType ReturnType {
-                       get { return expr.ReturnType; }
+               internal override XPathNodeType EvaluatedNodeType {
+                       get { return expr.EvaluatedNodeType; }
                }
 
+               public override XPathResultType ReturnType {
+                       get { return expr.ReturnType; }
+               }
+
                public override bool RequireSorting {
                        get { return true; }
                }
@@ -122,10 +122,13 @@
                {
                        XPathNavigator nav = doc.Clone ();
                        nav.MoveToRoot ();
+                       XPathNavigator tmp = doc.Clone ();
 
                        do {
-                               if (nav.Matches (key.MatchPattern))
-                                       CollectIndex (nav);
+                               if (nav.Matches (key.MatchPattern)) {
+                                       tmp.MoveTo (nav);
+                                       CollectIndex (nav, tmp);
+                               }
                        } while (MoveNavigatorToNext (nav));
                }
 
@@ -140,9 +143,8 @@
                        return false;
                }
 
-               private void CollectIndex (XPathNavigator nav)
+               private void CollectIndex (XPathNavigator nav, XPathNavigator 
target)
                {
-                       XPathNavigator target = nav.Clone ();
                        XPathNodeIterator iter;
                        switch (key.UsePattern.ReturnType) {
                        case XPathResultType.NodeSet:
@@ -169,12 +171,15 @@
 
                private void AddIndex (string key, XPathNavigator target)
                {
-                       Hashtable al = map [key] as Hashtable;
+                       ArrayList al = map [key] as ArrayList;
                        if (al == null) {
-                               al = new Hashtable ();
+                               al = new ArrayList ();
                                map [key] = al;
                        }
-                       al [target] = target;
+                       for (int i = 0; i < al.Count; i++)
+                               if (((XPathNavigator) al [i]).IsSamePosition 
(target))
+                                       return;
+                       al.Add (target.Clone ());
                }
 
                public bool Matches (XPathNavigator nav, string value)
@@ -192,11 +197,11 @@
                                key.UsePattern.SetContext (null);
                        }
                        
-                       Hashtable al = map [value] as Hashtable;
+                       ArrayList al = map [value] as ArrayList;
                        if (al == null)
                                return false;
-                       foreach (XPathNavigator i in al.Values)
-                               if (i.IsSamePosition (nav))
+                       for (int i = 0; i < al.Count; i++)
+                               if (((XPathNavigator) al [i]).IsSamePosition 
(nav))
                                        return true;
                        return false;
                }
@@ -215,8 +220,8 @@
                        } else {
                                FindKeyMatch (XPathFunctions.ToString (o), 
result, iter.Current);
                        }
-                       
-                       return new ListIterator (result, (ctx), true);
+                       result.Sort (XPathNavigatorComparer.Instance);
+                       return new ListIterator (result, (ctx));
                }
                
                void FindKeyMatch (string value, ArrayList result, 
XPathNavigator context)

Modified: trunk/mcs/class/System.XML/Mono.Xml.Xsl.Operations/ChangeLog
===================================================================
--- trunk/mcs/class/System.XML/Mono.Xml.Xsl.Operations/ChangeLog        
2005-03-15 21:31:06 UTC (rev 41863)
+++ trunk/mcs/class/System.XML/Mono.Xml.Xsl.Operations/ChangeLog        
2005-03-15 21:34:04 UTC (rev 41864)
@@ -1,3 +1,7 @@
+2005-03-15  Atsushi Enomoto  <[EMAIL PROTECTED]>
+
+       * XslVariable.cs : removed last ListIterator.ctor() argument.
+
 2005-03-09  Atsushi Enomoto  <[EMAIL PROTECTED]>
 
        * XslText.cs : whitespace nodes should be written at any time, once

Modified: trunk/mcs/class/System.XML/Mono.Xml.Xsl.Operations/XslVariable.cs
===================================================================
--- trunk/mcs/class/System.XML/Mono.Xml.Xsl.Operations/XslVariable.cs   
2005-03-15 21:31:06 UTC (rev 41863)
+++ trunk/mcs/class/System.XML/Mono.Xml.Xsl.Operations/XslVariable.cs   
2005-03-15 21:34:04 UTC (rev 41864)
@@ -95,7 +95,7 @@
                                        XPathNodeIterator iter = 
(XPathNodeIterator) o;
                                        while (iter.MoveNext ())
                                                al.Add (iter.Current.Clone ());
-                                       o = new ListIterator (al, 
p.XPathContext, false);
+                                       o = new ListIterator (al, 
p.XPathContext);
                                }
                                return o;
                        } else if (content != null) {

Modified: trunk/mcs/class/System.XML/System.Xml.XPath/ChangeLog
===================================================================
--- trunk/mcs/class/System.XML/System.Xml.XPath/ChangeLog       2005-03-15 
21:31:06 UTC (rev 41863)
+++ trunk/mcs/class/System.XML/System.Xml.XPath/ChangeLog       2005-03-15 
21:34:04 UTC (rev 41864)
@@ -1,5 +1,13 @@
 2004-03-15  Atsushi Enomoto  <[EMAIL PROTECTED]>
 
+       * DefaultContext.cs,
+         Expression.cs,
+         Iterator.cs : Now RequireSorting is not required in BaseIterator
+         (it is now fully in Expression).
+         Removed the last ListIterator .ctor() argument.
+
+2004-03-15  Atsushi Enomoto  <[EMAIL PROTECTED]>
+
        * XPathNavigator.cs : In ComparePosition(), make use of IsDescendant().
 
 2004-03-14  Atsushi Enomoto  <[EMAIL PROTECTED]>

Modified: trunk/mcs/class/System.XML/System.Xml.XPath/DefaultContext.cs
===================================================================
--- trunk/mcs/class/System.XML/System.Xml.XPath/DefaultContext.cs       
2005-03-15 21:31:06 UTC (rev 41863)
+++ trunk/mcs/class/System.XML/System.Xml.XPath/DefaultContext.cs       
2005-03-15 21:34:04 UTC (rev 41864)
@@ -305,7 +305,7 @@
                                        rgNodes.Add (n.Clone ());
 
                        rgNodes.Sort (XPathNavigatorComparer.Instance);
-                       return new ListIterator (iter, rgNodes, true);
+                       return new ListIterator (iter, rgNodes);
                }
 
                public override string ToString ()

Modified: trunk/mcs/class/System.XML/System.Xml.XPath/Expression.cs
===================================================================
--- trunk/mcs/class/System.XML/System.Xml.XPath/Expression.cs   2005-03-15 
21:31:06 UTC (rev 41863)
+++ trunk/mcs/class/System.XML/System.Xml.XPath/Expression.cs   2005-03-15 
21:34:04 UTC (rev 41864)
@@ -238,7 +238,7 @@
                                        XPathSortElement elt = 
(XPathSortElement) rgElts [iResult];
                                        rgResults [iResult] = elt.Navigator;
                                }
-                               return new ListIterator (iter, rgResults, 
false);
+                               return new ListIterator (iter, rgResults);
                        }
 
                        class XPathSortElement

Modified: trunk/mcs/class/System.XML/System.Xml.XPath/Iterator.cs
===================================================================
--- trunk/mcs/class/System.XML/System.Xml.XPath/Iterator.cs     2005-03-15 
21:31:06 UTC (rev 41863)
+++ trunk/mcs/class/System.XML/System.Xml.XPath/Iterator.cs     2005-03-15 
21:34:04 UTC (rev 41864)
@@ -64,13 +64,11 @@
                        get { return _nsm; }
                        set { _nsm = value; }
                }
-               
+
                public virtual bool ReverseAxis {
                        get { return false; }
                }
 
-               public abstract bool RequireSorting { get; }
-
                public virtual int ComparablePosition {
                        get {
                                if (ReverseAxis) {
@@ -139,10 +137,6 @@
                public override XPathNavigator Current {
                        get { return iter.Current; }
                }
-
-               public override bool RequireSorting {
-                       get { return true; }
-               }
        }
 
        internal abstract class SimpleIterator : BaseIterator
@@ -193,8 +187,6 @@
                public override XPathNavigator Current {
                        get { return _nav; }
                }
-
-               public override bool RequireSorting { get { return false; } }
        }
 
        internal class NullIterator : SelfIterator
@@ -213,6 +205,7 @@
        internal class ParensIterator : BaseIterator
        {
                BaseIterator _iter;
+
                public ParensIterator (BaseIterator iter) : base 
(iter.NamespaceManager) 
                {
                        _iter = iter;
@@ -229,8 +222,6 @@
 
                public override XPathNavigator Current { get { return 
_iter.Current; }}
 
-               public override bool RequireSorting { get { return 
_iter.RequireSorting; } }
-
                public override int Count { get { return _iter.Count; } }
        }
 
@@ -258,8 +249,6 @@
                }
 
                public override bool ReverseAxis { get { return true; } }
-
-               public override bool RequireSorting { get { return false; } }
        }
 
        internal class ChildIterator : SimpleIterator
@@ -275,8 +264,6 @@
                        }
                        return fSuccess;
                }
-
-               public override bool RequireSorting { get { return false; } }
        }
 
        internal class FollowingSiblingIterator : SimpleIterator
@@ -299,8 +286,6 @@
                        }
                        return false;
                }
-
-               public override bool RequireSorting { get { return false; } }
        }
 
        internal class PrecedingSiblingIterator : SimpleIterator
@@ -358,8 +343,6 @@
                public override bool ReverseAxis {
                        get { return true; }
                }
-
-               public override bool RequireSorting { get { return true; } }
        }
 
        internal class AncestorIterator : SimpleIterator
@@ -423,8 +406,6 @@
                        get { return true; }
                }
 
-               public override bool RequireSorting { get { return true; } }
-
                public override int Count {
                        get {
                                if (navigators == null)
@@ -500,8 +481,6 @@
                        get { return true; }
                }
 
-               public override bool RequireSorting { get { return true; } }
-
                public override int Count {
                        get {
                                if (navigators == null)
@@ -551,8 +530,6 @@
                        _finished = true;
                        return false;
                }
-
-               public override bool RequireSorting { get { return false; } }
        }
 
        internal class DescendantOrSelfIterator : SimpleIterator
@@ -600,8 +577,6 @@
                        _finished = true;
                        return false;
                }
-
-               public override bool RequireSorting { get { return false; } }
        }
 
        internal class FollowingIterator : SimpleIterator
@@ -660,8 +635,6 @@
                        _finished = true;
                        return false;
                }
-
-               public override bool RequireSorting { get { return false; } }
        }
 
        internal class PrecedingIterator : SimpleIterator
@@ -717,8 +690,6 @@
                public override bool ReverseAxis {
                        get { return true; }
                }
-
-               public override bool RequireSorting { get { return true; } }
        }
 
        internal class NamespaceIterator : SimpleIterator
@@ -745,7 +716,6 @@
                }
 
                public override bool ReverseAxis { get { return true; } }
-               public override bool RequireSorting { get { return false; } }
        }
 
        internal class AttributeIterator : SimpleIterator
@@ -770,8 +740,6 @@
                        }
                        return false;                   
                }
-
-               public override bool RequireSorting { get { return true; } }
        }
 
        internal class AxisIterator : BaseIterator
@@ -820,8 +788,6 @@
                public override bool ReverseAxis {
                        get { return _iter.ReverseAxis; }
                }
-
-               public override bool RequireSorting { get { return 
_iter.RequireSorting; } }
        }
 
        internal class SimpleSlashIterator : BaseIterator
@@ -865,11 +831,6 @@
                public override XPathNavigator Current {
                        get { return _current; }
                }
-
-               public override bool RequireSorting {
-                       // It always does not need to be sorted.
-                       get { return false; }
-               }
        }
 
        internal class SlashIterator : BaseIterator
@@ -1027,11 +988,6 @@
                        }
                }
 
-               public override bool RequireSorting {
-                       // It always does not need to be sorted.
-                       get { return false; }
-               }
-
                public override int Count { get { return _navStore == null ? 
base.Count : _navStore.Count; } }
        }
 
@@ -1096,36 +1052,30 @@
                public override bool ReverseAxis {
                        get { return _iter.ReverseAxis; }
                }
-
-               public override bool RequireSorting { get { return 
_iter.RequireSorting; } }
        }
 
        internal class ListIterator : BaseIterator
        {
                private IList _list;
-               bool _requireSorting;
 
-               public ListIterator (BaseIterator iter, IList list, bool 
requireSorting) : base (iter.NamespaceManager)
+               public ListIterator (BaseIterator iter, IList list) : base 
(iter.NamespaceManager)
                {
                        if (!(list is ICloneable))
                                throw new ArgumentException ("Target enumerator 
must be cloneable.");
                        _list = list;
-                       _requireSorting = requireSorting;
                }
                
-               public ListIterator (IList list, NSResolver nsm, bool 
requireSorting) : base (nsm)
+               public ListIterator (IList list, NSResolver nsm) : base (nsm)
                {
                        if (!(list is ICloneable))
                                throw new ArgumentException ("Target enumerator 
must be cloneable.");
                        _list = list;
-                       _requireSorting = requireSorting;
                }
 
                private ListIterator (ListIterator other) : base (other)
                {
                        ICloneable listClone = other._list as ICloneable;
                        _list = (IList) listClone.Clone ();
-                       _requireSorting = other._requireSorting;
                }
                public override XPathNodeIterator Clone () { return new 
ListIterator (this); }
 
@@ -1143,8 +1093,6 @@
                        }
                }
 
-               public override bool RequireSorting { get { return 
_requireSorting; } }
-
                public override int Count { get { return _list.Count; } }
        }
 
@@ -1225,7 +1173,54 @@
                {
                        get { return _current; }
                }
+       }
 
-               public override bool RequireSorting { get { return 
_left.RequireSorting || _right.RequireSorting; } }
+       internal class OrderedIterator : BaseIterator
+       {
+               BaseIterator iter;
+               ArrayList list;
+               int index = -1;
+
+               public OrderedIterator (BaseIterator iter)
+                       : base (iter.NamespaceManager)
+               {
+//                     if (iter.Ordered)
+                       if (false)
+                               this.iter = iter;
+                       else {
+                               list = new ArrayList ();
+                               while (iter.MoveNext ())
+                                       list.Add (iter.Current);
+                               list.Sort (XPathNavigatorComparer.Instance);
+                       }
+               }
+
+               private OrderedIterator (OrderedIterator other, bool dummy)
+                       : base (other)
+               {
+                       if (other.iter != null)
+                               iter = (BaseIterator) other.iter.Clone ();
+                       list = other.list;
+                       index = other.index;
+               }
+
+               public override XPathNodeIterator Clone ()
+               {
+                       return new OrderedIterator (this);
+               }
+
+               public override bool MoveNextCore ()
+               {
+                       if (iter != null)
+                               return iter.MoveNext ();
+                       else if (index++ < list.Count)
+                               return true;
+                       index--;
+                       return false;
+               }
+
+               public override XPathNavigator Current {
+                       get { return iter != null ? iter.Current : index < 0 ? 
null : (XPathNavigator) list [index]; }
+               }
        }
 }

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to