Merge branch 'sgen-disable-gc'
[mono.git] / mcs / class / System.XML / Mono.Xml.Schema / XsdKeyTable.cs
index d2fe936e27a10669cadeb41685eb9f4069e2e9e5..0c3a2a3a0cc3539d743f960cc374c5013a49f655 100644 (file)
 //
 //     (C)2003 Atsushi Enomoto
 //
-using System;\r
-using System.Collections;\r
-using System.Collections.Specialized;\r
-using System.Xml;\r
-using System.Xml.Schema;\r
-\r
-namespace Mono.Xml.Schema\r
-{\r
-       // Created per constraining element.\r
-       public class XsdKeyTable\r
-       {\r
-               private XsdIdentitySelector selector;\r
-               private XmlSchemaIdentityConstraint source;\r
-               private XmlQualifiedName qname;\r
-               private XmlQualifiedName refKeyName;\r
-\r
-               public ArrayList Entries = new ArrayList ();\r
-               public ArrayList FinishedEntries = new ArrayList ();\r
-\r
-               public int StartDepth;\r
-               public XsdKeyTable ReferencedKey;\r
-\r
-               public XsdKeyTable (XmlSchemaIdentityConstraint source, XmlReader reader)\r
-               {\r
-                       Reset (source, reader);\r
-               }\r
-\r
-               public XmlQualifiedName QualifiedName {\r
-                       get { return qname; }\r
-               }\r
-\r
-               public XmlQualifiedName RefKeyName {\r
-                       get { return refKeyName; }\r
-               }\r
-\r
-               public XmlSchemaIdentityConstraint SourceSchemaIdentity {\r
-                       get { return source; }\r
-               }\r
-\r
-               public XsdIdentitySelector Selector {\r
-                       get { return selector; }\r
-               }\r
-\r
-               public void Reset (XmlSchemaIdentityConstraint source, XmlReader reader)\r
-               {\r
-                       this.source = source;\r
-                       this.selector = source.CompiledSelector;\r
-                       this.qname = source.QualifiedName;\r
-                       XmlSchemaKeyref kr = source as XmlSchemaKeyref;\r
-                       if (kr != null)\r
-                               this.refKeyName = kr.Refer;\r
-                       StartDepth = 0;\r
-               }\r
-\r
-               // In this method, attributes are ignored.\r
-               public XsdIdentityPath SelectorMatches (ArrayList qnameStack, XmlReader reader)\r
-               {\r
-                       foreach (XsdIdentityPath path in Selector.Paths) {\r
-                               // Only "." hits.\r
-                               if (reader.Depth == this.StartDepth) {\r
-                                       if (path.OrderedSteps.Length == 0)\r
-                                               return path;\r
-                                       else\r
-                                               continue;\r
-                               }\r
-                               // It does not hit as yet (too shallow to hit).\r
-                               if (reader.Depth - this.StartDepth < path.OrderedSteps.Length - 1)\r
-                                       continue;\r
-\r
-                               int iter = path.OrderedSteps.Length;\r
-                               if (path.OrderedSteps [iter-1].IsAttribute)\r
-                                       iter--;\r
-\r
-                               if (path.Descendants && reader.Depth < this.StartDepth + iter)\r
-                                       continue;\r
-                               else if (!path.Descendants && reader.Depth != this.StartDepth + iter)\r
-                                       continue;\r
-\r
-                               iter--;\r
-\r
-                               XsdIdentityStep step;\r
-                               for (int x = 0; x <= iter; x++, iter--) {\r
-                                       step = path.OrderedSteps [iter - x];\r
-                                       if (step.IsAnyName)\r
-                                               continue;\r
-                                       XmlQualifiedName qname = (XmlQualifiedName) qnameStack [qnameStack.Count - x - 1];\r
-                                       if (step.NsName != null && qname.Namespace == step.NsName)\r
-                                               continue;\r
-                                       if (step.Name == qname.Name && step.Namespace == qname.Namespace)\r
-                                               continue;\r
-                                       else\r
-                                               break;\r
-                               }\r
-                               if (iter >= 0)  // i.e. did not match against the path.\r
-                                       continue;\r
-                               return path;\r
-                       }\r
-                       return null;\r
-               }\r
-       }\r
-}\r
+
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+using System;
+using System.Collections;
+using System.Collections.Specialized;
+using System.Xml;
+using System.Xml.Schema;
+
+namespace Mono.Xml.Schema
+{
+       internal class XsdKeyEntryCollection : CollectionBase
+       {
+               public void Add (XsdKeyEntry entry)
+               {
+                       List.Add (entry);
+               }
+
+               public XsdKeyEntry this [int i] {
+                       get { return (XsdKeyEntry) List [i]; }
+                       set { List [i] = value; }
+               }
+       }
+
+       // Created per constraining element.
+       internal class XsdKeyTable
+       {
+               // FIXME: no need after #70419
+               public readonly bool alwaysTrue = true;
+
+               private XsdIdentitySelector selector;
+               private XmlSchemaIdentityConstraint source;
+               private XmlQualifiedName qname;
+               private XmlQualifiedName refKeyName;
+
+               public XsdKeyEntryCollection Entries =
+                       new XsdKeyEntryCollection ();
+               public XsdKeyEntryCollection FinishedEntries =
+                       new XsdKeyEntryCollection ();
+
+               public int StartDepth;
+               public XsdKeyTable ReferencedKey;
+
+               public XsdKeyTable (XmlSchemaIdentityConstraint source)
+               {
+                       Reset (source);
+               }
+
+               public XmlQualifiedName QualifiedName {
+                       get { return qname; }
+               }
+
+               public XmlQualifiedName RefKeyName {
+                       get { return refKeyName; }
+               }
+
+               public XmlSchemaIdentityConstraint SourceSchemaIdentity {
+                       get { return source; }
+               }
+
+               public XsdIdentitySelector Selector {
+                       get { return selector; }
+               }
+
+               public void Reset (XmlSchemaIdentityConstraint source)
+               {
+                       this.source = source;
+                       this.selector = source.CompiledSelector;
+                       this.qname = source.QualifiedName;
+                       XmlSchemaKeyref kr = source as XmlSchemaKeyref;
+                       if (kr != null)
+                               this.refKeyName = kr.Refer;
+                       StartDepth = 0;
+               }
+
+               // In this method, attributes are ignored.
+               public XsdIdentityPath SelectorMatches (ArrayList qnameStack, int depth)
+               {
+                       for (int i = 0; i < Selector.Paths.Length; i++) {
+                               XsdIdentityPath path = Selector.Paths [i];
+                               // Only "." hits.
+                               if (depth == this.StartDepth) {
+                                       if (path.OrderedSteps.Length == 0)
+                                               return path;
+                                       else
+                                               continue;
+                               }
+                               // It does not hit as yet (too shallow to hit).
+                               if (depth - this.StartDepth < path.OrderedSteps.Length - 1)
+                                       continue;
+
+                               int iter = path.OrderedSteps.Length;
+                               if (path.OrderedSteps [iter-1].IsAttribute)
+                                       iter--;
+
+                               if (path.Descendants && depth < this.StartDepth + iter)
+                                       continue;
+                               else if (!path.Descendants && depth != this.StartDepth + iter)
+                                       continue;
+
+                               iter--;
+
+                               XsdIdentityStep step;
+                               for (int x = 0; 0 <= iter; x++, iter--) {
+                                       step = path.OrderedSteps [iter];
+                                       if (step.IsAnyName)
+                                               continue;
+                                       XmlQualifiedName qname = (XmlQualifiedName) qnameStack [qnameStack.Count - x - 1];
+                                       if (step.NsName != null && qname.Namespace == step.NsName)
+                                               continue;
+                                       if (step.Name == qname.Name && step.Namespace == qname.Namespace)
+                                               continue;
+                                       if (alwaysTrue)
+                                               break;
+                               }
+                               if (iter >= 0)  // i.e. did not match against the path.
+                                       continue;
+                               return path;
+                       }
+                       return null;
+               }
+       }
+}