예제 #1
0
        protected V RemoveEntryForKey(Key1 key1, Key2 key2, Key3 key3)
        {
            int hash = Hash(ExtractHash(key1, key2, key3));

            Tuple3KeyEntry <Key1, Key2, Key3, V>[] table = this.table;
            int i = hash & (table.Length - 1);
            Tuple3KeyEntry <Key1, Key2, Key3, V> entry = table[i];

            if (entry != null)
            {
                if (EqualKeys(key1, key2, key3, entry))
                {
                    table[i] = entry.GetNextEntry();
                    V value = entry.GetValue();
                    EntryRemoved(entry);
                    return(value);
                }
                Tuple3KeyEntry <Key1, Key2, Key3, V> prevEntry = entry;
                entry = entry.GetNextEntry();
                while (entry != null)
                {
                    if (EqualKeys(key1, key2, key3, entry))
                    {
                        prevEntry.SetNextEntry(entry.GetNextEntry());
                        V value = entry.GetValue();
                        EntryRemoved(entry);
                        return(value);
                    }
                    prevEntry = entry;
                    entry     = entry.GetNextEntry();
                }
            }
            return(default(V));
        }
예제 #2
0
        protected void Transfer(Tuple3KeyEntry <Key1, Key2, Key3, V>[] newTable)
        {
            int newCapacityMinus1 = newTable.Length - 1;

            Tuple3KeyEntry <Key1, Key2, Key3, V>[] table = this.table;

            for (int a = table.Length; a-- > 0;)
            {
                Tuple3KeyEntry <Key1, Key2, Key3, V> entry = table[a], next;
                while (entry != null)
                {
                    next = entry.GetNextEntry();
                    int i = entry.GetHash() & newCapacityMinus1;
                    entry.SetNextEntry(newTable[i]);
                    newTable[i] = entry;
                    entry       = next;
                }
            }
        }
예제 #3
0
        public bool RemoveIfValue(Key1 key1, Key2 key2, Key3 key3, V value)
        {
            int hash = Hash(ExtractHash(key1, key2, key3));

            Tuple3KeyEntry <Key1, Key2, Key3, V>[] table = this.table;
            int i = hash & (table.Length - 1);
            Tuple3KeyEntry <Key1, Key2, Key3, V> entry = table[i];

            if (entry != null)
            {
                if (EqualKeys(key1, key2, key3, entry))
                {
                    table[i] = entry.GetNextEntry();
                    V existingValue = entry.GetValue();
                    if (!Object.ReferenceEquals(existingValue, value)) // Test if reference identical
                    {
                        return(false);
                    }
                    EntryRemoved(entry);
                    return(true);
                }
                Tuple3KeyEntry <Key1, Key2, Key3, V> prevEntry = entry;
                entry = entry.GetNextEntry();
                while (entry != null)
                {
                    if (EqualKeys(key1, key2, key3, entry))
                    {
                        prevEntry.SetNextEntry(entry.GetNextEntry());
                        V existingValue = entry.GetValue();
                        if (!Object.ReferenceEquals(existingValue, value)) // Test if reference identical
                        {
                            return(false);
                        }
                        EntryRemoved(entry);
                        return(true);
                    }
                    prevEntry = entry;
                    entry     = entry.GetNextEntry();
                }
            }
            return(false);
        }