private InnerNode<K, V> putExisting(K key, int hash, int hashBits, int slot, V value, MutableValueInt newValue) { final K[] keys2 = Arrays.copyOf(keys, keys.length); final Object[] subNodes2 = Arrays.copyOf(subNodes, subNodes.length); final Object previousValue = subNodes2[slot]; if (previousValue instanceof Node) { // insert recursively assert keys[slot] == null; subNodes2[slot] = ((Node<K, V>) previousValue).put(key, hash, hashBits, value, newValue); } else if (keys[slot].equals(key)) { // replace the existing entry subNodes2[slot] = value; } else { // hash collision final K previousKey = keys[slot]; final int previousHash = previousKey.hashCode() >>> (TOTAL_HASH_BITS - hashBits); Node<K, V> subNode = newSubNode(hashBits); subNode = subNode.put(previousKey, previousHash, hashBits, (V) previousValue, newValue); subNode = subNode.put(key, hash, hashBits, value, newValue); keys2[slot] = null; subNodes2[slot] = subNode; } return new InnerNode<>(mask, keys2, subNodes2); }
final Object[] subNodes2 = Arrays.copyOf(subNodes, subNodes.length); subNodes2[slot] = removed; return new InnerNode<>(mask, keys2, subNodes2); } else if (keys[slot].equals(key)) {
private InnerNode<K, V> putNew(K key, int hash6, int slot, V value) { final long mask2 = mask | (1L << hash6); final K[] keys2 = insertElement(keys, key, slot); final Object[] subNodes2 = insertElement(subNodes, value, slot); return new InnerNode<>(mask2, keys2, subNodes2); }
/** * Create a new empty map. */ public CopyOnWriteHashMap() { this(new InnerNode<K, V>(), 0); }
private InnerNode<K, V> putNew(K key, int hash6, int slot, V value) { final long mask2 = mask | (1L << hash6); final K[] keys2 = insertElement(keys, key, slot); final Object[] subNodes2 = insertElement(subNodes, value, slot); return new InnerNode<>(mask2, keys2, subNodes2); }
private InnerNode<K, V> removeSlot(int hash6, int slot) { final long mask2 = mask & ~(1L << hash6); final K[] keys2 = removeArrayElement(keys, slot); final Object[] subNodes2 = removeArrayElement(subNodes, slot); return new InnerNode<>(mask2, keys2, subNodes2); }
private InnerNode<K, V> putNew(K key, int hash6, int slot, V value) { final long mask2 = mask | (1L << hash6); final K[] keys2 = insertElement(keys, key, slot); final Object[] subNodes2 = insertElement(subNodes, value, slot); return new InnerNode<>(mask2, keys2, subNodes2); }
/** * Create a new empty map. */ public CopyOnWriteHashMap() { this(new InnerNode<K, V>(), 0); }
private InnerNode<K, V> putNew(K key, int hash6, int slot, V value) { final long mask2 = mask | (1L << hash6); final K[] keys2 = insertElement(keys, key, slot); final Object[] subNodes2 = insertElement(subNodes, value, slot); return new InnerNode<>(mask2, keys2, subNodes2); }
/** * Create a new empty map. */ public CopyOnWriteHashMap() { this(new InnerNode<K, V>(), 0); }
private InnerNode<K, V> removeSlot(int hash6, int slot) { final long mask2 = mask & ~(1L << hash6); final K[] keys2 = removeArrayElement(keys, slot); final Object[] subNodes2 = removeArrayElement(subNodes, slot); return new InnerNode<>(mask2, keys2, subNodes2); }
/** * Create a new empty map. */ public CopyOnWriteHashMap() { this(new InnerNode<K, V>(), 0); }
private Node<K, V> newSubNode(int hashBits) { if (hashBits <= 0) { return new Leaf<K, V>(); } else { return new InnerNode<K, V>(); } }
private InnerNode<K, V> removeSlot(int hash6, int slot) { final long mask2 = mask & ~(1L << hash6); final K[] keys2 = removeArrayElement(keys, slot); final Object[] subNodes2 = removeArrayElement(subNodes, slot); return new InnerNode<>(mask2, keys2, subNodes2); }
private InnerNode<K, V> removeSlot(int hash6, int slot) { final long mask2 = mask & ~(1L << hash6); final K[] keys2 = removeArrayElement(keys, slot); final Object[] subNodes2 = removeArrayElement(subNodes, slot); return new InnerNode<>(mask2, keys2, subNodes2); }
private Node<K, V> newSubNode(int hashBits) { if (hashBits <= 0) { return new Leaf<K, V>(); } else { return new InnerNode<K, V>(); } }
private InnerNode<K, V> putNew(K key, int hash6, int slot, V value) { final long mask2 = mask | (1L << hash6); final K[] keys2 = insertElement(keys, key, slot); final Object[] subNodes2 = insertElement(subNodes, value, slot); return new InnerNode<>(mask2, keys2, subNodes2); }
/** * Create a new empty map. */ public CopyOnWriteHashMap() { this(new InnerNode<K, V>(), 0); }
private InnerNode<K, V> removeSlot(int hash6, int slot) { final long mask2 = mask & ~(1L << hash6); final K[] keys2 = removeArrayElement(keys, slot); final Object[] subNodes2 = removeArrayElement(subNodes, slot); return new InnerNode<>(mask2, keys2, subNodes2); }
private Node<K, V> newSubNode(int hashBits) { if (hashBits <= 0) { return new Leaf<K, V>(); } else { return new InnerNode<K, V>(); } }