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)); }
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; } } }
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); }