예제 #1
0
        public override string Get(string array)
        {
            if (array == null)
            {
                throw new ArgumentNullException("value");
            }
            if (array.Length == 0)
            {
                return("");
            }
            int length = array.Length;

            for (int index = 0; index < array.Length; ++index)
            {
                length += length << 7 ^ (int)array[index];
            }
            int num1 = length - (length >> 17);
            int num2 = num1 - (num1 >> 11);
            int num3 = num2 - (num2 >> 5);

            for (NameTable.Entry entry = this.entries[num3 & this.mask]; entry != null; entry = entry.next)
            {
                if (entry.hashCode == num3 && string.Compare(entry.str, array) == 0)
                {
                    return(entry.str);
                }
            }
            return((string)null);
        }
예제 #2
0
        public override string Add(char[] array, int offset, int length)
        {
            if (length == 0)
            {
                return("");
            }
            int num1 = length;
            int num2 = num1 + (num1 << 7 ^ (int)array[offset]);
            int num3 = offset + length;

            for (int index = offset + 1; index < num3; ++index)
            {
                num2 += num2 << 7 ^ (int)array[index];
            }
            int num4     = num2 - (num2 >> 17);
            int num5     = num4 - (num4 >> 11);
            int hashCode = num5 - (num5 >> 5);

            for (NameTable.Entry entry = this.entries[hashCode & this.mask]; entry != null; entry = entry.next)
            {
                if (entry.hashCode == hashCode && NameTable.TextEquals(entry.str, array, offset))
                {
                    return(entry.str);
                }
            }
            return(this.AddEntry(new string(array, offset, length), hashCode));
        }
예제 #3
0
        private string AddEntry(string str, int hashCode)
        {
            int index = hashCode & this.mask;

            NameTable.Entry entry = new NameTable.Entry(str, hashCode, this.entries[index]);
            this.entries[index] = entry;
            if (this.count++ == this.mask)
            {
                this.Grow();
            }
            return(entry.str);
        }
예제 #4
0
        private void Grow()
        {
            int num = this.mask * 2 + 1;

            NameTable.Entry[] entries    = this.entries;
            NameTable.Entry[] entryArray = new NameTable.Entry[num + 1];
            NameTable.Entry   next;
            for (int index1 = 0; index1 < entries.Length; ++index1)
            {
                for (NameTable.Entry entry = entries[index1]; entry != null; entry = next)
                {
                    int index2 = entry.hashCode & num;
                    next               = entry.next;
                    entry.next         = entryArray[index2];
                    entryArray[index2] = entry;
                }
            }
            this.entries = entryArray;
            this.mask    = num;
        }
예제 #5
0
 internal Entry(string str, int hashCode, NameTable.Entry next)
 {
     this.str      = str;
     this.hashCode = hashCode;
     this.next     = next;
 }