1 //------------------------------------------------------------------------------
2 // <copyright file="DomNameTable.cs" company="Microsoft">
3 // Copyright (c) Microsoft Corporation. All rights reserved.
5 // <owner current="true" primary="true">Microsoft</owner>
6 //------------------------------------------------------------------------------
9 using System.Diagnostics;
10 using System.Xml.Schema;
12 namespace System.Xml {
14 internal class DomNameTable {
18 XmlDocument ownerDocument;
19 XmlNameTable nameTable;
21 const int InitialSize = 64; // must be a power of two
23 public DomNameTable( XmlDocument document ) {
24 ownerDocument = document;
25 nameTable = document.NameTable;
26 entries = new XmlName[InitialSize];
27 mask = InitialSize - 1;
28 Debug.Assert( ( entries.Length & mask ) == 0 ); // entries.Length must be a power of two
31 public XmlName GetName(string prefix, string localName, string ns, IXmlSchemaInfo schemaInfo) {
33 prefix = string.Empty;
39 int hashCode = XmlName.GetHashCode(localName);
41 for (XmlName e = entries[hashCode & mask]; e != null; e = e.next) {
42 if (e.HashCode == hashCode
43 && ((object)e.LocalName == (object)localName
44 || e.LocalName.Equals(localName))
45 && ((object)e.Prefix == (object)prefix
46 || e.Prefix.Equals(prefix))
47 && ((object)e.NamespaceURI == (object)ns
48 || e.NamespaceURI.Equals(ns))
49 && e.Equals(schemaInfo)) {
56 public XmlName AddName(string prefix, string localName, string ns, IXmlSchemaInfo schemaInfo) {
58 prefix = string.Empty;
64 int hashCode = XmlName.GetHashCode(localName);
66 for (XmlName e = entries[hashCode & mask]; e != null; e = e.next) {
67 if (e.HashCode == hashCode
68 && ((object)e.LocalName == (object)localName
69 || e.LocalName.Equals(localName))
70 && ((object)e.Prefix == (object)prefix
71 || e.Prefix.Equals(prefix))
72 && ((object)e.NamespaceURI == (object)ns
73 || e.NamespaceURI.Equals(ns))
74 && e.Equals(schemaInfo)) {
79 prefix = nameTable.Add(prefix);
80 localName = nameTable.Add(localName);
81 ns = nameTable.Add(ns);
82 int index = hashCode & mask;
83 XmlName name = XmlName.Create(prefix, localName, ns, hashCode, ownerDocument, entries[index], schemaInfo);
84 entries[index] = name;
86 if (count++ == mask) {
94 int newMask = mask * 2 + 1;
95 XmlName[] oldEntries = entries;
96 XmlName[] newEntries = new XmlName[newMask+1];
98 // use oldEntries.Length to eliminate the rangecheck
99 for ( int i = 0; i < oldEntries.Length; i++ ) {
100 XmlName name = oldEntries[i];
101 while ( name != null ) {
102 int newIndex = name.HashCode & newMask;
103 XmlName tmp = name.next;
104 name.next = newEntries[newIndex];
105 newEntries[newIndex] = name;
109 entries = newEntries;