package com.alibaba.middleware.race.sync.utils; import com.koloboke.collect.impl.AbstractEntry; import com.koloboke.collect.impl.AbstractIntValueView; import com.koloboke.collect.impl.AbstractLongKeyView; import com.koloboke.collect.impl.AbstractSetView; import java.lang.reflect.Array; import java.util.Arrays; import java.util.Collection; import com.koloboke.collect.impl.CommonObjCollectionOps; import java.util.ConcurrentModificationException; import com.koloboke.function.Consumer; import com.koloboke.collect.impl.Containers; import com.koloboke.collect.Equivalence; import javax.annotation.Generated; import com.koloboke.collect.impl.hash.Hash; import com.koloboke.collect.hash.HashConfig; import com.koloboke.collect.impl.hash.HashConfigWrapper; import com.koloboke.collect.set.hash.HashLongSet; import com.koloboke.collect.set.hash.HashObjSet; import com.koloboke.function.IntBinaryOperator; import com.koloboke.collect.IntCollection; import com.koloboke.function.IntConsumer; import com.koloboke.collect.IntCursor; import com.koloboke.collect.IntIterator; import com.koloboke.function.IntPredicate; import com.koloboke.collect.set.IntSet; import com.koloboke.collect.impl.InternalLongCollectionOps; import com.koloboke.collect.impl.InternalLongIntMapOps; import com.koloboke.collect.impl.InternalObjCollectionOps; import com.koloboke.collect.impl.hash.LHash; import com.koloboke.collect.impl.hash.LHashCapacities; import com.koloboke.collect.impl.LongArrays; import com.koloboke.collect.LongCollection; import com.koloboke.function.LongConsumer; import com.koloboke.collect.LongCursor; import com.koloboke.function.LongIntConsumer; import com.koloboke.collect.map.LongIntCursor; import com.koloboke.collect.map.LongIntMap; import com.koloboke.function.LongIntPredicate; import com.koloboke.function.LongIntToIntFunction; import com.koloboke.collect.LongIterator; import com.koloboke.function.LongPredicate; import com.koloboke.collect.set.LongSet; import com.koloboke.function.LongToIntFunction; import java.util.Map; import com.koloboke.collect.impl.Maths; import java.util.NoSuchElementException; import javax.annotation.Nonnull; import com.koloboke.collect.ObjCollection; import com.koloboke.collect.ObjCursor; import com.koloboke.collect.ObjIterator; import com.koloboke.collect.set.ObjSet; import com.koloboke.function.Predicate; import com.koloboke.collect.impl.Primitives; import java.util.Random; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import com.koloboke.collect.impl.ThreadLocalRandom; @Generated(value = "com.koloboke.compile.processor.KolobokeCollectionProcessor") @SuppressFBWarnings(value = { "IA_AMBIGUOUS_INVOCATION_OF_INHERITED_OR_OUTER_METHOD" }) @SuppressWarnings(value = { "all" , "unsafe" , "deprecation" , "overloads" , "rawtypes" }) final class KolobokeLongIntHashMap extends LongIntHashMap { KolobokeLongIntHashMap(int expectedSize) { this.init(DEFAULT_CONFIG_WRAPPER, expectedSize); } static void verifyConfig(HashConfig config) { if ((config.getGrowthFactor()) != 2.0) { throw new IllegalArgumentException(((((((config + " passed, HashConfig for a hashtable\n") + "implementation with linear probing must have growthFactor of 2.0.\n") + "A Koloboke Compile-generated hashtable implementation could have\n") + "a different growth factor, if the implemented type is annotated with\n") + "@com.koloboke.compile.hash.algo.openaddressing.QuadraticProbing or\n") + "@com.koloboke.compile.hash.algo.openaddressing.DoubleHashing")); } } int[] values; long freeValue; @Nonnull public final HashConfig hashConfig() { return configWrapper().config(); } long[] set; @Override public long sizeAsLong() { return ((long) (size())); } public final boolean noRemoved() { return true; } public final boolean isEmpty() { return (size()) == 0; } public final boolean containsKey(Object key) { return contains(key); } public final int freeSlots() { return (capacity()) - (size()); } private HashConfigWrapper configWrapper; @Nonnull public long[] keys() { return set; } public boolean containsKey(long key) { return contains(key); } int size; public final int removedSlots() { return 0; } private int maxSize; private int modCount = 0; public int capacity() { return set.length; } int valueIndex(int value) { if (KolobokeLongIntHashMap.this.isEmpty()) return -1; int index = -1; int mc = modCount(); long free = freeValue; long[] keys = set; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { if ((keys[i]) != free) { if (value == (vals[i])) { index = i; break; } } } if (mc != (modCount())) throw new ConcurrentModificationException(); return index; } @Nonnull public HashLongSet keySet() { return new KolobokeLongIntHashMap.KeyView(); } public final double currentLoad() { return ((double) (size())) / ((double) (capacity())); } final void init(HashConfigWrapper configWrapper, int size, long freeValue) { KolobokeLongIntHashMap.this.freeValue = freeValue; init(configWrapper, size); } public void forEach(Consumer<? super Long> action) { if (action == null) throw new NullPointerException(); if (KolobokeLongIntHashMap.this.isEmpty()) return ; int mc = modCount(); long free = freeValue; long[] keys = set; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { action.accept(key); } } if (mc != (modCount())) throw new ConcurrentModificationException(); } public final HashConfigWrapper configWrapper() { return configWrapper; } class KeyView extends AbstractLongKeyView implements HashLongSet , InternalLongCollectionOps , KolobokeLongIntHashMap.Support.SeparateKVLongLHash { @Nonnull @Override public HashConfig hashConfig() { return KolobokeLongIntHashMap.this.hashConfig(); } @Override public HashConfigWrapper configWrapper() { return KolobokeLongIntHashMap.this.configWrapper(); } @Override public int size() { return KolobokeLongIntHashMap.this.size(); } @Override public double currentLoad() { return KolobokeLongIntHashMap.this.currentLoad(); } @Override public long freeValue() { return KolobokeLongIntHashMap.this.freeValue(); } @Override public boolean supportRemoved() { return KolobokeLongIntHashMap.this.supportRemoved(); } @Override public long removedValue() { return KolobokeLongIntHashMap.this.removedValue(); } @Nonnull @Override public long[] keys() { return KolobokeLongIntHashMap.this.keys(); } @Override public int capacity() { return KolobokeLongIntHashMap.this.capacity(); } @Override public int freeSlots() { return KolobokeLongIntHashMap.this.freeSlots(); } @Override public boolean noRemoved() { return KolobokeLongIntHashMap.this.noRemoved(); } @Override public int removedSlots() { return KolobokeLongIntHashMap.this.removedSlots(); } @Override public int modCount() { return KolobokeLongIntHashMap.this.modCount(); } @Override public final boolean contains(Object o) { return KolobokeLongIntHashMap.this.contains(o); } @Override public boolean contains(long key) { return KolobokeLongIntHashMap.this.contains(key); } public void forEach(Consumer<? super Long> action) { KolobokeLongIntHashMap.this.forEach(action); } @Override public void forEach(LongConsumer action) { KolobokeLongIntHashMap.this.forEach(action); } @Override public boolean forEachWhile(LongPredicate predicate) { return KolobokeLongIntHashMap.this.forEachWhile(predicate); } @Override public boolean allContainingIn(LongCollection c) { return KolobokeLongIntHashMap.this.allContainingIn(c); } @Override public boolean reverseAddAllTo(LongCollection c) { return KolobokeLongIntHashMap.this.reverseAddAllTo(c); } @Override public boolean reverseRemoveAllFrom(LongSet s) { return KolobokeLongIntHashMap.this.reverseRemoveAllFrom(s); } @Override @Nonnull public LongIterator iterator() { return KolobokeLongIntHashMap.this.iterator(); } @Override @Nonnull public LongCursor cursor() { return setCursor(); } @Override @Nonnull public Object[] toArray() { return KolobokeLongIntHashMap.this.toArray(); } @Override @Nonnull public <T> T[] toArray(@Nonnull T[] a) { return KolobokeLongIntHashMap.this.toArray(a); } @Override public long[] toLongArray() { return KolobokeLongIntHashMap.this.toLongArray(); } @Override public long[] toArray(long[] a) { return KolobokeLongIntHashMap.this.toArray(a); } @Override public int hashCode() { return setHashCode(); } @Override public String toString() { return setToString(); } @Override public boolean shrink() { return KolobokeLongIntHashMap.this.shrink(); } @Override public final boolean remove(Object o) { return justRemove(((Long) (o))); } @Override public boolean removeLong(long v) { return justRemove(v); } public boolean removeIf(Predicate<? super Long> filter) { return KolobokeLongIntHashMap.this.removeIf(filter); } @Override public boolean removeIf(LongPredicate filter) { return KolobokeLongIntHashMap.this.removeIf(filter); } @Override public boolean removeAll(@Nonnull Collection<?> c) { if (c instanceof LongCollection) { if (c instanceof InternalLongCollectionOps) { InternalLongCollectionOps c2 = ((InternalLongCollectionOps) (c)); if ((c2.size()) < (KolobokeLongIntHashMap.KeyView.this.size())) { return c2.reverseRemoveAllFrom(KolobokeLongIntHashMap.KeyView.this); } } return KolobokeLongIntHashMap.this.removeAll(KolobokeLongIntHashMap.KeyView.this, ((LongCollection) (c))); } return KolobokeLongIntHashMap.this.removeAll(KolobokeLongIntHashMap.KeyView.this, c); } @Override public boolean retainAll(@Nonnull Collection<?> c) { return KolobokeLongIntHashMap.this.retainAll(KolobokeLongIntHashMap.KeyView.this, c); } @Override public void clear() { KolobokeLongIntHashMap.this.clear(); } } public long freeValue() { return freeValue; } @Override public final int size() { return size; } public boolean supportRemoved() { return false; } public final int modCount() { return modCount; } final void incrementModCount() { (modCount)++; } public long removedValue() { throw new UnsupportedOperationException(); } @Override public boolean containsValue(int value) { return (valueIndex(value)) >= 0; } public void forEach(LongConsumer action) { if (action == null) throw new NullPointerException(); if (KolobokeLongIntHashMap.this.isEmpty()) return ; int mc = modCount(); long free = freeValue; long[] keys = set; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { action.accept(key); } } if (mc != (modCount())) throw new ConcurrentModificationException(); } public boolean contains(Object key) { return contains(((Long) (key)).longValue()); } boolean removeValue(int value) { int index = valueIndex(value); if (index >= 0) { removeAt(index); return true; } else { return false; } } public boolean containsEntry(long key, int value) { int index = index(key); if (index >= 0) { return (values[index]) == value; } else { return false; } } public boolean contains(long key) { return (index(key)) >= 0; } int index(long key) { long free; if (key != (free = freeValue)) { long[] keys = set; int capacityMask; int index; long cur; if ((cur = keys[(index = (LHash.SeparateKVLongKeyMixing.mix(key)) & (capacityMask = (keys.length) - 1))]) == key) { return index; } else { if (cur == free) { return -1; } else { while (true) { if ((cur = keys[(index = (index - 1) & capacityMask)]) == key) { return index; } else if (cur == free) { return -1; } } } } } else { return -1; } } final void init(HashConfigWrapper configWrapper, int size) { KolobokeLongIntHashMap.verifyConfig(configWrapper.config()); KolobokeLongIntHashMap.this.configWrapper = configWrapper; KolobokeLongIntHashMap.this.size = 0; internalInit(targetCapacity(size)); } @Override public boolean containsValue(Object value) { return containsValue(((Integer) (value)).intValue()); } public boolean forEachWhile(LongPredicate predicate) { if (predicate == null) throw new NullPointerException(); if (KolobokeLongIntHashMap.this.isEmpty()) return true; boolean terminated = false; int mc = modCount(); long free = freeValue; long[] keys = set; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { if (!(predicate.test(key))) { terminated = true; break; } } } if (mc != (modCount())) throw new ConcurrentModificationException(); return !terminated; } @Override public Integer get(Object key) { int index = index(((Long) (key))); if (index >= 0) { return values[index]; } else { return null; } } int insert(long key, int value) { long free; if (key == (free = freeValue)) { free = changeFree(); } long[] keys = set; int capacityMask; int index; long cur; keyAbsent : if ((cur = keys[(index = (LHash.SeparateKVLongKeyMixing.mix(key)) & (capacityMask = (keys.length) - 1))]) != free) { if (cur == key) { return index; } else { while (true) { if ((cur = keys[(index = (index - 1) & capacityMask)]) == free) { break keyAbsent; } else if (cur == key) { return index; } } } } incrementModCount(); keys[index] = key; values[index] = value; postInsertHook(); return -1; } private void internalInit(int capacity) { assert Maths.isPowerOf2(capacity); maxSize = maxSize(capacity); allocateArrays(capacity); } private int maxSize(int capacity) { return !(isMaxCapacity(capacity)) ? configWrapper.maxSize(capacity) : capacity - 1; } @Override public int get(long key) { int index = index(key); if (index >= 0) { return values[index]; } else { return defaultValue(); } } private long findNewFreeOrRemoved() { long free = KolobokeLongIntHashMap.this.freeValue; Random random = ThreadLocalRandom.current(); long newFree; { do { newFree = ((long) (random.nextLong())); } while ((newFree == free) || ((index(newFree)) >= 0) ); } return newFree; } public boolean allContainingIn(LongCollection c) { if (KolobokeLongIntHashMap.this.isEmpty()) return true; boolean containsAll = true; int mc = modCount(); long free = freeValue; long[] keys = set; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { if (!(c.contains(key))) { containsAll = false; break; } } } if (mc != (modCount())) throw new ConcurrentModificationException(); return containsAll; } @Override public Integer getOrDefault(Object key, Integer defaultValue) { int index = index(((Long) (key))); if (index >= 0) { return values[index]; } else { return defaultValue; } } void allocateArrays(int capacity) { _MutableSeparateKVLongLHashSO_allocateArrays(capacity); values = new int[capacity]; } @Override public int getOrDefault(long key, int defaultValue) { int index = index(key); if (index >= 0) { return values[index]; } else { return defaultValue; } } long changeFree() { int mc = modCount(); long newFree = findNewFreeOrRemoved(); incrementModCount(); mc++; LongArrays.replaceAll(set, freeValue, newFree); KolobokeLongIntHashMap.this.freeValue = newFree; if (mc != (modCount())) throw new ConcurrentModificationException(); return newFree; } public boolean reverseAddAllTo(LongCollection c) { if (KolobokeLongIntHashMap.this.isEmpty()) return false; boolean changed = false; int mc = modCount(); long free = freeValue; long[] keys = set; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { changed |= c.add(key); } } if (mc != (modCount())) throw new ConcurrentModificationException(); return changed; } final void initForRehash(int newCapacity) { (modCount)++; internalInit(newCapacity); } private void _MutableSeparateKVLongLHashSO_allocateArrays(int capacity) { set = new long[capacity]; if ((freeValue) != 0) Arrays.fill(set, freeValue); } private void _MutableLHash_clear() { (modCount)++; size = 0; } private void _MutableSeparateKVLongLHashSO_clear() { _MutableLHash_clear(); Arrays.fill(set, freeValue); } public boolean reverseRemoveAllFrom(LongSet s) { if ((KolobokeLongIntHashMap.this.isEmpty()) || (s.isEmpty())) return false; boolean changed = false; int mc = modCount(); long free = freeValue; long[] keys = set; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { changed |= s.removeLong(key); } } if (mc != (modCount())) throw new ConcurrentModificationException(); return changed; } @Override public void forEach(LongIntConsumer action) { if (action == null) throw new NullPointerException(); if (KolobokeLongIntHashMap.this.isEmpty()) return ; int mc = modCount(); long free = freeValue; long[] keys = set; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { action.accept(key, vals[i]); } } if (mc != (modCount())) throw new ConcurrentModificationException(); } @Override public boolean shrink() { int newCapacity = targetCapacity(size); if (newCapacity < (capacity())) { rehash(newCapacity); return true; } else { return false; } } private boolean tryRehashForExpansion(int newCapacity) { if (newCapacity > (capacity())) { rehash(newCapacity); return true; } else { return false; } } @Override public boolean forEachWhile(LongIntPredicate predicate) { if (predicate == null) throw new NullPointerException(); if (KolobokeLongIntHashMap.this.isEmpty()) return true; boolean terminated = false; int mc = modCount(); long free = freeValue; long[] keys = set; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { if (!(predicate.test(key, vals[i]))) { terminated = true; break; } } } if (mc != (modCount())) throw new ConcurrentModificationException(); return !terminated; } @Override public final boolean ensureCapacity(long minSize) { int intMinSize = ((int) (Math.min(minSize, ((long) (Integer.MAX_VALUE))))); if (minSize < 0L) throw new IllegalArgumentException((("Min size should be positive, " + minSize) + " given.")); return (intMinSize > (maxSize)) && (tryRehashForExpansion(targetCapacity(intMinSize))); } @Nonnull public Object[] toArray() { int size = size(); Object[] result = new Object[size]; if (size == 0) return result; int resultIndex = 0; int mc = modCount(); long free = freeValue; long[] keys = set; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { result[(resultIndex++)] = key; } } if (mc != (modCount())) throw new ConcurrentModificationException(); return result; } final void postRemoveHook() { (size)--; } final void postInsertHook() { if ((++(size)) > (maxSize)) { int capacity = capacity(); if (!(isMaxCapacity(capacity))) { rehash((capacity << 1)); } } } @Nonnull @Override public LongIntCursor cursor() { int mc = modCount(); return new KolobokeLongIntHashMap.NoRemovedMapCursor(mc); } @SuppressWarnings(value = "unchecked") @Nonnull public <T> T[] toArray(@Nonnull T[] a) { int size = size(); if ((a.length) < size) { Class<?> elementType = a.getClass().getComponentType(); a = ((T[]) (Array.newInstance(elementType, size))); } if (size == 0) { if ((a.length) > 0) a[0] = null; return a; } int resultIndex = 0; int mc = modCount(); long free = freeValue; long[] keys = set; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { a[(resultIndex++)] = ((T) (Long.valueOf(key))); } } if (mc != (modCount())) throw new ConcurrentModificationException(); if ((a.length) > resultIndex) a[resultIndex] = null; return a; } private static boolean identical(Object a, Object b) { return a == b; } boolean doubleSizedArrays() { return false; } private int targetCapacity(int size) { return LHashCapacities.capacity(configWrapper, size, doubleSizedArrays()); } @SuppressFBWarnings(value = "BC_IMPOSSIBLE_CAST") @SuppressWarnings(value = "unchecked") public boolean containsAllEntries(Map<?, ?> m) { if (KolobokeLongIntHashMap.identical(KolobokeLongIntHashMap.this, m)) throw new IllegalArgumentException(); if (m instanceof LongIntMap) { LongIntMap m2 = ((LongIntMap) (m)); if ((KolobokeLongIntHashMap.this.size()) < (m2.size())) return false; if ((InternalLongIntMapOps.class.isAssignableFrom(getClass())) && (m2 instanceof InternalLongIntMapOps)) { return ((InternalLongIntMapOps) (m2)).allEntriesContainingIn(((InternalLongIntMapOps) (InternalLongIntMapOps.class.cast(KolobokeLongIntHashMap.this)))); } return m2.forEachWhile(new LongIntPredicate() { @Override public boolean test(long a, int b) { return containsEntry(a, b); } }); } for (Map.Entry<?, ?> e : m.entrySet()) { if (!(containsEntry(((Long) (e.getKey())), ((Integer) (e.getValue()))))) return false; } return true; } private boolean isMaxCapacity(int capacity) { return LHashCapacities.isMaxCapacity(capacity, doubleSizedArrays()); } @Nonnull public long[] toLongArray() { int size = size(); long[] result = new long[size]; if (size == 0) return result; int resultIndex = 0; int mc = modCount(); long free = freeValue; long[] keys = set; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { result[(resultIndex++)] = key; } } if (mc != (modCount())) throw new ConcurrentModificationException(); return result; } @Nonnull public long[] toArray(long[] a) { int size = size(); if ((a.length) < size) a = new long[size]; if (size == 0) { if ((a.length) > 0) a[0] = 0L; return a; } int resultIndex = 0; int mc = modCount(); long free = freeValue; long[] keys = set; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { a[(resultIndex++)] = key; } } if (mc != (modCount())) throw new ConcurrentModificationException(); if ((a.length) > resultIndex) a[resultIndex] = 0L; return a; } public int setHashCode() { int hashCode = 0; int mc = modCount(); long free = freeValue; long[] keys = set; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { hashCode += ((int) (key ^ (key >>> 32))); } } if (mc != (modCount())) throw new ConcurrentModificationException(); return hashCode; } @Override @Nonnull public HashObjSet<Map.Entry<Long, Integer>> entrySet() { return new KolobokeLongIntHashMap.EntryView(); } @SuppressFBWarnings(value = "EC_UNRELATED_TYPES_USING_POINTER_EQUALITY") public String setToString() { if (KolobokeLongIntHashMap.this.isEmpty()) return "[]"; StringBuilder sb = new StringBuilder(); int elementCount = 0; int mc = modCount(); long free = freeValue; long[] keys = set; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { sb.append(' ').append(key).append(','); if ((++elementCount) == 8) { int expectedLength = (sb.length()) * ((size()) / 8); sb.ensureCapacity((expectedLength + (expectedLength / 2))); } } } if (mc != (modCount())) throw new ConcurrentModificationException(); sb.setCharAt(0, '['); sb.setCharAt(((sb.length()) - 1), ']'); return sb.toString(); } @Override @Nonnull public IntCollection values() { return new KolobokeLongIntHashMap.ValueView(); } @Override public boolean equals(Object o) { if ((KolobokeLongIntHashMap.this) == o) { return true; } if (!(o instanceof Map)) { return false; } Map<?, ?> that = ((Map<?, ?>) (o)); if ((that.size()) != (KolobokeLongIntHashMap.this.size())) { return false; } try { return KolobokeLongIntHashMap.this.containsAllEntries(that); } catch (ClassCastException e) { return false; } catch (NullPointerException e) { return false; } } @Override public int hashCode() { int hashCode = 0; int mc = modCount(); long free = freeValue; long[] keys = set; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { hashCode += ((int) ((key ^ (key >>> 32)))) ^ (vals[i]); } } if (mc != (modCount())) throw new ConcurrentModificationException(); return hashCode; } @SuppressFBWarnings(value = "EC_UNRELATED_TYPES_USING_POINTER_EQUALITY") @Override public String toString() { if (KolobokeLongIntHashMap.this.isEmpty()) return "{}"; StringBuilder sb = new StringBuilder(); int elementCount = 0; int mc = modCount(); long free = freeValue; long[] keys = set; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { sb.append(' '); sb.append(key); sb.append('='); sb.append(vals[i]); sb.append(','); if ((++elementCount) == 8) { int expectedLength = (sb.length()) * ((size()) / 8); sb.ensureCapacity((expectedLength + (expectedLength / 2))); } } } if (mc != (modCount())) throw new ConcurrentModificationException(); sb.setCharAt(0, '{'); sb.setCharAt(((sb.length()) - 1), '}'); return sb.toString(); } private final static Logger logger = Logger.SERVER_LOGGER; void rehash(int newCapacity) { logger.warn("Rehash! current size = %d", size); int mc = modCount(); long free = freeValue; long[] keys = set; int[] vals = values; initForRehash(newCapacity); mc++; long[] newKeys = set; int capacityMask = (newKeys.length) - 1; int[] newVals = values; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { int index; if ((newKeys[(index = (LHash.SeparateKVLongKeyMixing.mix(key)) & capacityMask)]) != free) { while (true) { if ((newKeys[(index = (index - 1) & capacityMask)]) == free) { break; } } } newKeys[index] = key; newVals[index] = vals[i]; } } if (mc != (modCount())) throw new ConcurrentModificationException(); } @Override public Integer put(Long key, Integer value) { int index = insert(key, value); if (index < 0) { return null; } else { int[] vals = values; int prevValue = vals[index]; vals[index] = value; return prevValue; } } @Override public int put(long key, int value) { int index = insert(key, value); if (index < 0) { return defaultValue(); } else { int[] vals = values; int prevValue = vals[index]; vals[index] = value; return prevValue; } } @Override public Integer putIfAbsent(Long key, Integer value) { int index = insert(key, value); if (index < 0) { return null; } else { return values[index]; } } @Override public int putIfAbsent(long key, int value) { int index = insert(key, value); if (index < 0) { return defaultValue(); } else { return values[index]; } } public void justPut(long key, int value) { int index = insert(key, value); if (index < 0) { return ; } else { values[index] = value; return ; } } @Override public int compute(long key, LongIntToIntFunction remappingFunction) { if (remappingFunction == null) throw new NullPointerException(); long free; if (key == (free = freeValue)) { free = changeFree(); } long[] keys = set; int[] vals = values; int capacityMask; int index; long cur; keyPresent : if ((cur = keys[(index = (LHash.SeparateKVLongKeyMixing.mix(key)) & (capacityMask = (keys.length) - 1))]) != key) { keyAbsent : if (cur != free) { while (true) { if ((cur = keys[(index = (index - 1) & capacityMask)]) == key) { break keyPresent; } else if (cur == free) { break keyAbsent; } } } int newValue = remappingFunction.applyAsInt(key, defaultValue()); incrementModCount(); keys[index] = key; vals[index] = newValue; postInsertHook(); return newValue; } int newValue = remappingFunction.applyAsInt(key, vals[index]); vals[index] = newValue; return newValue; } @Override public int computeIfAbsent(long key, LongToIntFunction mappingFunction) { if (mappingFunction == null) throw new NullPointerException(); long free; if (key == (free = freeValue)) { free = changeFree(); } long[] keys = set; int[] vals = values; int capacityMask; int index; long cur; if ((cur = keys[(index = (LHash.SeparateKVLongKeyMixing.mix(key)) & (capacityMask = (keys.length) - 1))]) == key) { return vals[index]; } else { keyAbsent : if (cur != free) { while (true) { if ((cur = keys[(index = (index - 1) & capacityMask)]) == key) { return vals[index]; } else if (cur == free) { break keyAbsent; } } } int value = mappingFunction.applyAsInt(key); incrementModCount(); keys[index] = key; vals[index] = value; postInsertHook(); return value; } } @Override public int computeIfPresent(long key, LongIntToIntFunction remappingFunction) { if (remappingFunction == null) throw new NullPointerException(); int index = index(key); if (index >= 0) { int[] vals = values; int newValue = remappingFunction.applyAsInt(key, vals[index]); vals[index] = newValue; return newValue; } else { return defaultValue(); } } @Override public int merge(long key, int value, IntBinaryOperator remappingFunction) { if (remappingFunction == null) throw new NullPointerException(); long free; if (key == (free = freeValue)) { free = changeFree(); } long[] keys = set; int[] vals = values; int capacityMask; int index; long cur; keyPresent : if ((cur = keys[(index = (LHash.SeparateKVLongKeyMixing.mix(key)) & (capacityMask = (keys.length) - 1))]) != key) { keyAbsent : if (cur != free) { while (true) { if ((cur = keys[(index = (index - 1) & capacityMask)]) == key) { break keyPresent; } else if (cur == free) { break keyAbsent; } } } incrementModCount(); keys[index] = key; vals[index] = value; postInsertHook(); return value; } int newValue = remappingFunction.applyAsInt(vals[index], value); vals[index] = newValue; return newValue; } @Override public int addValue(long key, int value) { long free; if (key == (free = freeValue)) { free = changeFree(); } long[] keys = set; int[] vals = values; int capacityMask; int index; long cur; keyPresent : if ((cur = keys[(index = (LHash.SeparateKVLongKeyMixing.mix(key)) & (capacityMask = (keys.length) - 1))]) != key) { keyAbsent : if (cur != free) { while (true) { if ((cur = keys[(index = (index - 1) & capacityMask)]) == key) { break keyPresent; } else if (cur == free) { break keyAbsent; } } } int newValue = (defaultValue()) + value; incrementModCount(); keys[index] = key; vals[index] = newValue; postInsertHook(); return newValue; } int newValue = (vals[index]) + value; vals[index] = newValue; return newValue; } class NoRemovedIterator implements LongIterator { long[] keys; final long free; final int capacityMask; int expectedModCount; int index = -1; int nextIndex; long next; NoRemovedIterator(int mc) { expectedModCount = mc; long[] keys = KolobokeLongIntHashMap.NoRemovedIterator.this.keys = set; capacityMask = (keys.length) - 1; long free = this.free = freeValue; int nextI = keys.length; while ((--nextI) >= 0) { long key; if ((key = keys[nextI]) != free) { next = key; break; } } nextIndex = nextI; } @Override public long nextLong() { if ((expectedModCount) == (modCount())) { int nextI; if ((nextI = nextIndex) >= 0) { index = nextI; long[] keys = KolobokeLongIntHashMap.NoRemovedIterator.this.keys; long free = KolobokeLongIntHashMap.NoRemovedIterator.this.free; long prev = next; while ((--nextI) >= 0) { long key; if ((key = keys[nextI]) != free) { next = key; break; } } nextIndex = nextI; return prev; } else { throw new NoSuchElementException(); } } else { throw new ConcurrentModificationException(); } } public void forEachRemaining(Consumer<? super Long> action) { if (action == null) throw new NullPointerException(); int mc = expectedModCount; long[] keys = KolobokeLongIntHashMap.NoRemovedIterator.this.keys; long free = KolobokeLongIntHashMap.NoRemovedIterator.this.free; int nextI = nextIndex; for (int i = nextI; i >= 0; i--) { long key; if ((key = keys[i]) != free) { action.accept(key); } } if ((nextI != (nextIndex)) || (mc != (modCount()))) { throw new ConcurrentModificationException(); } index = nextIndex = -1; } @Override public void forEachRemaining(LongConsumer action) { if (action == null) throw new NullPointerException(); int mc = expectedModCount; long[] keys = KolobokeLongIntHashMap.NoRemovedIterator.this.keys; long free = KolobokeLongIntHashMap.NoRemovedIterator.this.free; int nextI = nextIndex; for (int i = nextI; i >= 0; i--) { long key; if ((key = keys[i]) != free) { action.accept(key); } } if ((nextI != (nextIndex)) || (mc != (modCount()))) { throw new ConcurrentModificationException(); } index = nextIndex = -1; } @Override public boolean hasNext() { return (nextIndex) >= 0; } @Override public Long next() { return nextLong(); } @Override public void remove() { int index; if ((index = KolobokeLongIntHashMap.NoRemovedIterator.this.index) >= 0) { if (((expectedModCount)++) == (modCount())) { KolobokeLongIntHashMap.NoRemovedIterator.this.index = -1; long[] keys = KolobokeLongIntHashMap.NoRemovedIterator.this.keys; if (keys == (set)) { int capacityMask = KolobokeLongIntHashMap.NoRemovedIterator.this.capacityMask; incrementModCount(); int indexToRemove = index; int indexToShift = indexToRemove; int shiftDistance = 1; while (true) { indexToShift = (indexToShift - 1) & capacityMask; long keyToShift; if ((keyToShift = keys[indexToShift]) == (free)) { break; } if ((((LHash.SeparateKVLongKeyMixing.mix(keyToShift)) - indexToShift) & capacityMask) >= shiftDistance) { if ((KolobokeLongIntHashMap.NoRemovedIterator.this.keys) == keys) { if (indexToShift > indexToRemove) { int slotsToCopy; if ((slotsToCopy = (nextIndex) + 1) > 0) { KolobokeLongIntHashMap.NoRemovedIterator.this.keys = Arrays.copyOf(keys, slotsToCopy); if (indexToRemove < slotsToCopy) { KolobokeLongIntHashMap.NoRemovedIterator.this.keys[indexToRemove] = free; } } } else if (indexToRemove == index) { KolobokeLongIntHashMap.NoRemovedIterator.this.nextIndex = index; if (indexToShift < (index - 1)) { KolobokeLongIntHashMap.NoRemovedIterator.this.next = keyToShift; } } } keys[indexToRemove] = keyToShift; indexToRemove = indexToShift; shiftDistance = 1; } else { shiftDistance++; if (indexToShift == (1 + index)) { throw new ConcurrentModificationException(); } } } keys[indexToRemove] = free; postRemoveHook(); } else { justRemove(keys[index]); } } else { throw new ConcurrentModificationException(); } } else { throw new IllegalStateException(); } } } @Override public int addValue(long key, int addition, int initialValue) { long free; if (key == (free = freeValue)) { free = changeFree(); } long[] keys = set; int[] vals = values; int capacityMask; int index; long cur; keyPresent : if ((cur = keys[(index = (LHash.SeparateKVLongKeyMixing.mix(key)) & (capacityMask = (keys.length) - 1))]) != key) { keyAbsent : if (cur != free) { while (true) { if ((cur = keys[(index = (index - 1) & capacityMask)]) == key) { break keyPresent; } else if (cur == free) { break keyAbsent; } } } int newValue = initialValue + addition; incrementModCount(); keys[index] = key; vals[index] = newValue; postInsertHook(); return newValue; } int newValue = (vals[index]) + addition; vals[index] = newValue; return newValue; } @SuppressFBWarnings(value = "BC_IMPOSSIBLE_CAST") @Override public void putAll(@Nonnull Map<? extends Long, ? extends Integer> m) { if (KolobokeLongIntHashMap.identical(KolobokeLongIntHashMap.this, m)) throw new IllegalArgumentException(); long maxPossibleSize = (sizeAsLong()) + (Containers.sizeAsLong(m)); ensureCapacity(maxPossibleSize); if (m instanceof LongIntMap) { if ((InternalLongIntMapOps.class.isAssignableFrom(getClass())) && (m instanceof InternalLongIntMapOps)) { ((InternalLongIntMapOps) (m)).reversePutAllTo(((InternalLongIntMapOps) (InternalLongIntMapOps.class.cast(KolobokeLongIntHashMap.this)))); } else { ((LongIntMap) (m)).forEach(new LongIntConsumer() { @Override public void accept(long key, int value) { justPut(key, value); } }); } } else { for (Map.Entry<? extends Long, ? extends Integer> e : m.entrySet()) { justPut(e.getKey(), e.getValue()); } } } @Override public Integer replace(Long key, Integer value) { int index = index(key); if (index >= 0) { int[] vals = values; int oldValue = vals[index]; vals[index] = value; return oldValue; } else { return null; } } @Override public int replace(long key, int value) { int index = index(key); if (index >= 0) { int[] vals = values; int oldValue = vals[index]; vals[index] = value; return oldValue; } else { return defaultValue(); } } @Override public boolean replace(Long key, Integer oldValue, Integer newValue) { return replace(key.longValue(), oldValue.intValue(), newValue.intValue()); } @Override public boolean replace(long key, int oldValue, int newValue) { int index = index(key); if (index >= 0) { int[] vals = values; if ((vals[index]) == oldValue) { vals[index] = newValue; return true; } else { return false; } } else { return false; } } class NoRemovedCursor implements LongCursor { long[] keys; final long free; final int capacityMask; int expectedModCount; int index; long curKey; NoRemovedCursor(int mc) { expectedModCount = mc; long[] keys = KolobokeLongIntHashMap.NoRemovedCursor.this.keys = set; capacityMask = (keys.length) - 1; index = keys.length; long free = this.free = freeValue; curKey = free; } @Override public void forEachForward(LongConsumer action) { if (action == null) throw new NullPointerException(); int mc = expectedModCount; long[] keys = KolobokeLongIntHashMap.NoRemovedCursor.this.keys; long free = KolobokeLongIntHashMap.NoRemovedCursor.this.free; int index = KolobokeLongIntHashMap.NoRemovedCursor.this.index; for (int i = index - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { action.accept(key); } } if ((index != (KolobokeLongIntHashMap.NoRemovedCursor.this.index)) || (mc != (modCount()))) { throw new ConcurrentModificationException(); } KolobokeLongIntHashMap.NoRemovedCursor.this.index = -1; curKey = free; } @Override public long elem() { long curKey; if ((curKey = KolobokeLongIntHashMap.NoRemovedCursor.this.curKey) != (free)) { return curKey; } else { throw new IllegalStateException(); } } @Override public boolean moveNext() { if ((expectedModCount) == (modCount())) { long[] keys = KolobokeLongIntHashMap.NoRemovedCursor.this.keys; long free = KolobokeLongIntHashMap.NoRemovedCursor.this.free; for (int i = (index) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { index = i; curKey = key; return true; } } curKey = free; index = -1; return false; } else { throw new ConcurrentModificationException(); } } @Override public void remove() { long curKey; long free; if ((curKey = KolobokeLongIntHashMap.NoRemovedCursor.this.curKey) != (free = KolobokeLongIntHashMap.NoRemovedCursor.this.free)) { if (((expectedModCount)++) == (modCount())) { KolobokeLongIntHashMap.NoRemovedCursor.this.curKey = free; int index = KolobokeLongIntHashMap.NoRemovedCursor.this.index; long[] keys = KolobokeLongIntHashMap.NoRemovedCursor.this.keys; if (keys == (set)) { int capacityMask = KolobokeLongIntHashMap.NoRemovedCursor.this.capacityMask; incrementModCount(); int indexToRemove = index; int indexToShift = indexToRemove; int shiftDistance = 1; while (true) { indexToShift = (indexToShift - 1) & capacityMask; long keyToShift; if ((keyToShift = keys[indexToShift]) == free) { break; } if ((((LHash.SeparateKVLongKeyMixing.mix(keyToShift)) - indexToShift) & capacityMask) >= shiftDistance) { if ((KolobokeLongIntHashMap.NoRemovedCursor.this.keys) == keys) { if (indexToShift > indexToRemove) { int slotsToCopy; if ((slotsToCopy = index) > 0) { KolobokeLongIntHashMap.NoRemovedCursor.this.keys = Arrays.copyOf(keys, slotsToCopy); if (indexToRemove < slotsToCopy) { KolobokeLongIntHashMap.NoRemovedCursor.this.keys[indexToRemove] = free; } } } else if (indexToRemove == index) { KolobokeLongIntHashMap.NoRemovedCursor.this.index = ++index; } } keys[indexToRemove] = keyToShift; indexToRemove = indexToShift; shiftDistance = 1; } else { shiftDistance++; if (indexToShift == (1 + index)) { throw new ConcurrentModificationException(); } } } keys[indexToRemove] = free; postRemoveHook(); } else { justRemove(curKey); } } else { throw new ConcurrentModificationException(); } } else { throw new IllegalStateException(); } } } @Override public void replaceAll(LongIntToIntFunction function) { if (function == null) throw new NullPointerException(); if (KolobokeLongIntHashMap.this.isEmpty()) return ; int mc = modCount(); long free = freeValue; long[] keys = set; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { vals[i] = function.applyAsInt(key, vals[i]); } } if (mc != (modCount())) throw new ConcurrentModificationException(); } @Override public void clear() { doClear(); } private void doClear() { int mc = (modCount()) + 1; _MutableSeparateKVLongLHashSO_clear(); if (mc != (modCount())) throw new ConcurrentModificationException(); } void removeAt(int index) { long free = freeValue; long[] keys = set; int[] vals = values; int capacityMask = (keys.length) - 1; incrementModCount(); int indexToRemove = index; int indexToShift = indexToRemove; int shiftDistance = 1; while (true) { indexToShift = (indexToShift - 1) & capacityMask; long keyToShift; if ((keyToShift = keys[indexToShift]) == free) { break; } if ((((LHash.SeparateKVLongKeyMixing.mix(keyToShift)) - indexToShift) & capacityMask) >= shiftDistance) { keys[indexToRemove] = keyToShift; vals[indexToRemove] = vals[indexToShift]; indexToRemove = indexToShift; shiftDistance = 1; } else { shiftDistance++; if (indexToShift == (1 + index)) { throw new ConcurrentModificationException(); } } } keys[indexToRemove] = free; postRemoveHook(); } @Override public Integer remove(Object key) { long k = ((Long) (key)); long free; if (k != (free = freeValue)) { long[] keys = set; int capacityMask = (keys.length) - 1; int index; long cur; keyPresent : if ((cur = keys[(index = (LHash.SeparateKVLongKeyMixing.mix(k)) & capacityMask)]) != k) { if (cur == free) { return null; } else { while (true) { if ((cur = keys[(index = (index - 1) & capacityMask)]) == k) { break keyPresent; } else if (cur == free) { return null; } } } } int[] vals = values; int val = vals[index]; incrementModCount(); int indexToRemove = index; int indexToShift = indexToRemove; int shiftDistance = 1; while (true) { indexToShift = (indexToShift - 1) & capacityMask; long keyToShift; if ((keyToShift = keys[indexToShift]) == free) { break; } if ((((LHash.SeparateKVLongKeyMixing.mix(keyToShift)) - indexToShift) & capacityMask) >= shiftDistance) { keys[indexToRemove] = keyToShift; vals[indexToRemove] = vals[indexToShift]; indexToRemove = indexToShift; shiftDistance = 1; } else { shiftDistance++; if (indexToShift == (1 + index)) { throw new ConcurrentModificationException(); } } } keys[indexToRemove] = free; postRemoveHook(); return val; } else { return null; } } public boolean justRemove(long key) { long free; if (key != (free = freeValue)) { long[] keys = set; int capacityMask = (keys.length) - 1; int index; long cur; keyPresent : if ((cur = keys[(index = (LHash.SeparateKVLongKeyMixing.mix(key)) & capacityMask)]) != key) { if (cur == free) { return false; } else { while (true) { if ((cur = keys[(index = (index - 1) & capacityMask)]) == key) { break keyPresent; } else if (cur == free) { return false; } } } } int[] vals = values; incrementModCount(); int indexToRemove = index; int indexToShift = indexToRemove; int shiftDistance = 1; while (true) { indexToShift = (indexToShift - 1) & capacityMask; long keyToShift; if ((keyToShift = keys[indexToShift]) == free) { break; } if ((((LHash.SeparateKVLongKeyMixing.mix(keyToShift)) - indexToShift) & capacityMask) >= shiftDistance) { keys[indexToRemove] = keyToShift; vals[indexToRemove] = vals[indexToShift]; indexToRemove = indexToShift; shiftDistance = 1; } else { shiftDistance++; if (indexToShift == (1 + index)) { throw new ConcurrentModificationException(); } } } keys[indexToRemove] = free; postRemoveHook(); return true; } else { return false; } } @Override public int remove(long key) { long free; if (key != (free = freeValue)) { long[] keys = set; int capacityMask = (keys.length) - 1; int index; long cur; keyPresent : if ((cur = keys[(index = (LHash.SeparateKVLongKeyMixing.mix(key)) & capacityMask)]) != key) { if (cur == free) { return defaultValue(); } else { while (true) { if ((cur = keys[(index = (index - 1) & capacityMask)]) == key) { break keyPresent; } else if (cur == free) { return defaultValue(); } } } } int[] vals = values; int val = vals[index]; incrementModCount(); int indexToRemove = index; int indexToShift = indexToRemove; int shiftDistance = 1; while (true) { indexToShift = (indexToShift - 1) & capacityMask; long keyToShift; if ((keyToShift = keys[indexToShift]) == free) { break; } if ((((LHash.SeparateKVLongKeyMixing.mix(keyToShift)) - indexToShift) & capacityMask) >= shiftDistance) { keys[indexToRemove] = keyToShift; vals[indexToRemove] = vals[indexToShift]; indexToRemove = indexToShift; shiftDistance = 1; } else { shiftDistance++; if (indexToShift == (1 + index)) { throw new ConcurrentModificationException(); } } } keys[indexToRemove] = free; postRemoveHook(); return val; } else { return defaultValue(); } } @Override public boolean remove(Object key, Object value) { return remove(((Long) (key)).longValue(), ((Integer) (value)).intValue()); } @Override public boolean remove(long key, int value) { long free; if (key != (free = freeValue)) { long[] keys = set; int capacityMask = (keys.length) - 1; int index; long cur; keyPresent : if ((cur = keys[(index = (LHash.SeparateKVLongKeyMixing.mix(key)) & capacityMask)]) != key) { if (cur == free) { return false; } else { while (true) { if ((cur = keys[(index = (index - 1) & capacityMask)]) == key) { break keyPresent; } else if (cur == free) { return false; } } } } int[] vals = values; if ((vals[index]) == value) { incrementModCount(); int indexToRemove = index; int indexToShift = indexToRemove; int shiftDistance = 1; while (true) { indexToShift = (indexToShift - 1) & capacityMask; long keyToShift; if ((keyToShift = keys[indexToShift]) == free) { break; } if ((((LHash.SeparateKVLongKeyMixing.mix(keyToShift)) - indexToShift) & capacityMask) >= shiftDistance) { keys[indexToRemove] = keyToShift; vals[indexToRemove] = vals[indexToShift]; indexToRemove = indexToShift; shiftDistance = 1; } else { shiftDistance++; if (indexToShift == (1 + index)) { throw new ConcurrentModificationException(); } } } keys[indexToRemove] = free; postRemoveHook(); return true; } else { return false; } } else { return false; } } @Override public boolean removeIf(LongIntPredicate filter) { if (filter == null) throw new NullPointerException(); if (KolobokeLongIntHashMap.this.isEmpty()) return false; boolean changed = false; int mc = modCount(); long free = freeValue; long[] keys = set; int capacityMask = (keys.length) - 1; int firstDelayedRemoved = -1; long delayedRemoved = 0L; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { if (filter.test(key, vals[i])) { incrementModCount(); mc++; closeDeletion : if (firstDelayedRemoved < 0) { int indexToRemove = i; int indexToShift = indexToRemove; int shiftDistance = 1; while (true) { indexToShift = (indexToShift - 1) & capacityMask; long keyToShift; if ((keyToShift = keys[indexToShift]) == free) { break; } if ((((LHash.SeparateKVLongKeyMixing.mix(keyToShift)) - indexToShift) & capacityMask) >= shiftDistance) { if (indexToShift > indexToRemove) { firstDelayedRemoved = i; delayedRemoved = key; keys[indexToRemove] = key; break closeDeletion; } if (indexToRemove == i) { i++; } keys[indexToRemove] = keyToShift; vals[indexToRemove] = vals[indexToShift]; indexToRemove = indexToShift; shiftDistance = 1; } else { shiftDistance++; if (indexToShift == (1 + i)) { throw new ConcurrentModificationException(); } } } keys[indexToRemove] = free; postRemoveHook(); } else { keys[i] = delayedRemoved; } changed = true; } } } if (firstDelayedRemoved >= 0) { closeDelayedRemoved(firstDelayedRemoved, delayedRemoved); } if (mc != (modCount())) throw new ConcurrentModificationException(); return changed; } public boolean removeIf(Predicate<? super Long> filter) { if (filter == null) throw new NullPointerException(); if (KolobokeLongIntHashMap.this.isEmpty()) return false; boolean changed = false; int mc = modCount(); long free = freeValue; long[] keys = set; int capacityMask = (keys.length) - 1; int firstDelayedRemoved = -1; long delayedRemoved = 0L; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { if (filter.test(key)) { incrementModCount(); mc++; closeDeletion : if (firstDelayedRemoved < 0) { int indexToRemove = i; int indexToShift = indexToRemove; int shiftDistance = 1; while (true) { indexToShift = (indexToShift - 1) & capacityMask; long keyToShift; if ((keyToShift = keys[indexToShift]) == free) { break; } if ((((LHash.SeparateKVLongKeyMixing.mix(keyToShift)) - indexToShift) & capacityMask) >= shiftDistance) { if (indexToShift > indexToRemove) { firstDelayedRemoved = i; delayedRemoved = key; keys[indexToRemove] = key; break closeDeletion; } if (indexToRemove == i) { i++; } keys[indexToRemove] = keyToShift; vals[indexToRemove] = vals[indexToShift]; indexToRemove = indexToShift; shiftDistance = 1; } else { shiftDistance++; if (indexToShift == (1 + i)) { throw new ConcurrentModificationException(); } } } keys[indexToRemove] = free; postRemoveHook(); } else { keys[i] = delayedRemoved; } changed = true; } } } if (firstDelayedRemoved >= 0) { closeDelayedRemoved(firstDelayedRemoved, delayedRemoved); } if (mc != (modCount())) throw new ConcurrentModificationException(); return changed; } public boolean removeIf(LongPredicate filter) { if (filter == null) throw new NullPointerException(); if (KolobokeLongIntHashMap.this.isEmpty()) return false; boolean changed = false; int mc = modCount(); long free = freeValue; long[] keys = set; int capacityMask = (keys.length) - 1; int firstDelayedRemoved = -1; long delayedRemoved = 0L; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { if (filter.test(key)) { incrementModCount(); mc++; closeDeletion : if (firstDelayedRemoved < 0) { int indexToRemove = i; int indexToShift = indexToRemove; int shiftDistance = 1; while (true) { indexToShift = (indexToShift - 1) & capacityMask; long keyToShift; if ((keyToShift = keys[indexToShift]) == free) { break; } if ((((LHash.SeparateKVLongKeyMixing.mix(keyToShift)) - indexToShift) & capacityMask) >= shiftDistance) { if (indexToShift > indexToRemove) { firstDelayedRemoved = i; delayedRemoved = key; keys[indexToRemove] = key; break closeDeletion; } if (indexToRemove == i) { i++; } keys[indexToRemove] = keyToShift; vals[indexToRemove] = vals[indexToShift]; indexToRemove = indexToShift; shiftDistance = 1; } else { shiftDistance++; if (indexToShift == (1 + i)) { throw new ConcurrentModificationException(); } } } keys[indexToRemove] = free; postRemoveHook(); } else { keys[i] = delayedRemoved; } changed = true; } } } if (firstDelayedRemoved >= 0) { closeDelayedRemoved(firstDelayedRemoved, delayedRemoved); } if (mc != (modCount())) throw new ConcurrentModificationException(); return changed; } @SuppressFBWarnings(value = "EC_UNRELATED_TYPES_USING_POINTER_EQUALITY") public boolean removeAll(@Nonnull HashLongSet thisC, @Nonnull Collection<?> c) { if (thisC == ((Object) (c))) throw new IllegalArgumentException(); if ((KolobokeLongIntHashMap.this.isEmpty()) || (c.isEmpty())) return false; boolean changed = false; int mc = modCount(); long free = freeValue; long[] keys = set; int capacityMask = (keys.length) - 1; int firstDelayedRemoved = -1; long delayedRemoved = 0L; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { if (c.contains(key)) { incrementModCount(); mc++; closeDeletion : if (firstDelayedRemoved < 0) { int indexToRemove = i; int indexToShift = indexToRemove; int shiftDistance = 1; while (true) { indexToShift = (indexToShift - 1) & capacityMask; long keyToShift; if ((keyToShift = keys[indexToShift]) == free) { break; } if ((((LHash.SeparateKVLongKeyMixing.mix(keyToShift)) - indexToShift) & capacityMask) >= shiftDistance) { if (indexToShift > indexToRemove) { firstDelayedRemoved = i; delayedRemoved = key; keys[indexToRemove] = key; break closeDeletion; } if (indexToRemove == i) { i++; } keys[indexToRemove] = keyToShift; vals[indexToRemove] = vals[indexToShift]; indexToRemove = indexToShift; shiftDistance = 1; } else { shiftDistance++; if (indexToShift == (1 + i)) { throw new ConcurrentModificationException(); } } } keys[indexToRemove] = free; postRemoveHook(); } else { keys[i] = delayedRemoved; } changed = true; } } } if (firstDelayedRemoved >= 0) { closeDelayedRemoved(firstDelayedRemoved, delayedRemoved); } if (mc != (modCount())) throw new ConcurrentModificationException(); return changed; } boolean removeAll(@Nonnull HashLongSet thisC, @Nonnull LongCollection c) { if (thisC == ((Object) (c))) throw new IllegalArgumentException(); if ((KolobokeLongIntHashMap.this.isEmpty()) || (c.isEmpty())) return false; boolean changed = false; int mc = modCount(); long free = freeValue; long[] keys = set; int capacityMask = (keys.length) - 1; int firstDelayedRemoved = -1; long delayedRemoved = 0L; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { if (c.contains(key)) { incrementModCount(); mc++; closeDeletion : if (firstDelayedRemoved < 0) { int indexToRemove = i; int indexToShift = indexToRemove; int shiftDistance = 1; while (true) { indexToShift = (indexToShift - 1) & capacityMask; long keyToShift; if ((keyToShift = keys[indexToShift]) == free) { break; } if ((((LHash.SeparateKVLongKeyMixing.mix(keyToShift)) - indexToShift) & capacityMask) >= shiftDistance) { if (indexToShift > indexToRemove) { firstDelayedRemoved = i; delayedRemoved = key; keys[indexToRemove] = key; break closeDeletion; } if (indexToRemove == i) { i++; } keys[indexToRemove] = keyToShift; vals[indexToRemove] = vals[indexToShift]; indexToRemove = indexToShift; shiftDistance = 1; } else { shiftDistance++; if (indexToShift == (1 + i)) { throw new ConcurrentModificationException(); } } } keys[indexToRemove] = free; postRemoveHook(); } else { keys[i] = delayedRemoved; } changed = true; } } } if (firstDelayedRemoved >= 0) { closeDelayedRemoved(firstDelayedRemoved, delayedRemoved); } if (mc != (modCount())) throw new ConcurrentModificationException(); return changed; } @SuppressFBWarnings(value = "EC_UNRELATED_TYPES_USING_POINTER_EQUALITY") public boolean retainAll(@Nonnull HashLongSet thisC, @Nonnull Collection<?> c) { if (c instanceof LongCollection) return retainAll(thisC, ((LongCollection) (c))); if (thisC == ((Object) (c))) throw new IllegalArgumentException(); if (KolobokeLongIntHashMap.this.isEmpty()) return false; if (c.isEmpty()) { clear(); return true; } boolean changed = false; int mc = modCount(); long free = freeValue; long[] keys = set; int capacityMask = (keys.length) - 1; int firstDelayedRemoved = -1; long delayedRemoved = 0L; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { if (!(c.contains(key))) { incrementModCount(); mc++; closeDeletion : if (firstDelayedRemoved < 0) { int indexToRemove = i; int indexToShift = indexToRemove; int shiftDistance = 1; while (true) { indexToShift = (indexToShift - 1) & capacityMask; long keyToShift; if ((keyToShift = keys[indexToShift]) == free) { break; } if ((((LHash.SeparateKVLongKeyMixing.mix(keyToShift)) - indexToShift) & capacityMask) >= shiftDistance) { if (indexToShift > indexToRemove) { firstDelayedRemoved = i; delayedRemoved = key; keys[indexToRemove] = key; break closeDeletion; } if (indexToRemove == i) { i++; } keys[indexToRemove] = keyToShift; vals[indexToRemove] = vals[indexToShift]; indexToRemove = indexToShift; shiftDistance = 1; } else { shiftDistance++; if (indexToShift == (1 + i)) { throw new ConcurrentModificationException(); } } } keys[indexToRemove] = free; postRemoveHook(); } else { keys[i] = delayedRemoved; } changed = true; } } } if (firstDelayedRemoved >= 0) { closeDelayedRemoved(firstDelayedRemoved, delayedRemoved); } if (mc != (modCount())) throw new ConcurrentModificationException(); return changed; } private boolean retainAll(@Nonnull HashLongSet thisC, @Nonnull LongCollection c) { if (thisC == ((Object) (c))) throw new IllegalArgumentException(); if (KolobokeLongIntHashMap.this.isEmpty()) return false; if (c.isEmpty()) { clear(); return true; } boolean changed = false; int mc = modCount(); long free = freeValue; long[] keys = set; int capacityMask = (keys.length) - 1; int firstDelayedRemoved = -1; long delayedRemoved = 0L; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { if (!(c.contains(key))) { incrementModCount(); mc++; closeDeletion : if (firstDelayedRemoved < 0) { int indexToRemove = i; int indexToShift = indexToRemove; int shiftDistance = 1; while (true) { indexToShift = (indexToShift - 1) & capacityMask; long keyToShift; if ((keyToShift = keys[indexToShift]) == free) { break; } if ((((LHash.SeparateKVLongKeyMixing.mix(keyToShift)) - indexToShift) & capacityMask) >= shiftDistance) { if (indexToShift > indexToRemove) { firstDelayedRemoved = i; delayedRemoved = key; keys[indexToRemove] = key; break closeDeletion; } if (indexToRemove == i) { i++; } keys[indexToRemove] = keyToShift; vals[indexToRemove] = vals[indexToShift]; indexToRemove = indexToShift; shiftDistance = 1; } else { shiftDistance++; if (indexToShift == (1 + i)) { throw new ConcurrentModificationException(); } } } keys[indexToRemove] = free; postRemoveHook(); } else { keys[i] = delayedRemoved; } changed = true; } } } if (firstDelayedRemoved >= 0) { closeDelayedRemoved(firstDelayedRemoved, delayedRemoved); } if (mc != (modCount())) throw new ConcurrentModificationException(); return changed; } void closeDelayedRemoved(int firstDelayedRemoved, long delayedRemoved) { long free = freeValue; long[] keys = set; int[] vals = values; int capacityMask = (keys.length) - 1; for (int i = firstDelayedRemoved; i >= 0; i--) { if ((keys[i]) == delayedRemoved) { int indexToRemove = i; int indexToShift = indexToRemove; int shiftDistance = 1; while (true) { indexToShift = (indexToShift - 1) & capacityMask; long keyToShift; if ((keyToShift = keys[indexToShift]) == free) { break; } if ((keyToShift != delayedRemoved) && ((((LHash.SeparateKVLongKeyMixing.mix(keyToShift)) - indexToShift) & capacityMask) >= shiftDistance)) { keys[indexToRemove] = keyToShift; vals[indexToRemove] = vals[indexToShift]; indexToRemove = indexToShift; shiftDistance = 1; } else { shiftDistance++; if (indexToShift == (1 + i)) { throw new ConcurrentModificationException(); } } } keys[indexToRemove] = free; postRemoveHook(); } } } public LongIterator iterator() { int mc = modCount(); return new KolobokeLongIntHashMap.NoRemovedKeyIterator(mc); } public LongCursor setCursor() { int mc = modCount(); return new KolobokeLongIntHashMap.NoRemovedKeyCursor(mc); } class NoRemovedKeyIterator extends KolobokeLongIntHashMap.NoRemovedIterator { int[] vals; private NoRemovedKeyIterator(int mc) { super(mc); vals = values; } @Override public void remove() { int index; if ((index = KolobokeLongIntHashMap.NoRemovedKeyIterator.this.index) >= 0) { if (((expectedModCount)++) == (modCount())) { KolobokeLongIntHashMap.NoRemovedKeyIterator.this.index = -1; long[] keys = KolobokeLongIntHashMap.NoRemovedKeyIterator.this.keys; int[] vals = KolobokeLongIntHashMap.NoRemovedKeyIterator.this.vals; if (keys == (set)) { int capacityMask = KolobokeLongIntHashMap.NoRemovedKeyIterator.this.capacityMask; incrementModCount(); int indexToRemove = index; int indexToShift = indexToRemove; int shiftDistance = 1; while (true) { indexToShift = (indexToShift - 1) & capacityMask; long keyToShift; if ((keyToShift = keys[indexToShift]) == (free)) { break; } if ((((LHash.SeparateKVLongKeyMixing.mix(keyToShift)) - indexToShift) & capacityMask) >= shiftDistance) { if ((KolobokeLongIntHashMap.NoRemovedKeyIterator.this.keys) == keys) { if (indexToShift > indexToRemove) { int slotsToCopy; if ((slotsToCopy = (nextIndex) + 1) > 0) { KolobokeLongIntHashMap.NoRemovedKeyIterator.this.keys = Arrays.copyOf(keys, slotsToCopy); KolobokeLongIntHashMap.NoRemovedKeyIterator.this.vals = Arrays.copyOf(vals, slotsToCopy); if (indexToRemove < slotsToCopy) { KolobokeLongIntHashMap.NoRemovedKeyIterator.this.keys[indexToRemove] = free; } } } else if (indexToRemove == index) { KolobokeLongIntHashMap.NoRemovedKeyIterator.this.nextIndex = index; if (indexToShift < (index - 1)) { KolobokeLongIntHashMap.NoRemovedKeyIterator.this.next = keyToShift; } } } keys[indexToRemove] = keyToShift; vals[indexToRemove] = vals[indexToShift]; indexToRemove = indexToShift; shiftDistance = 1; } else { shiftDistance++; if (indexToShift == (1 + index)) { throw new ConcurrentModificationException(); } } } keys[indexToRemove] = free; postRemoveHook(); } else { justRemove(keys[index]); } } else { throw new ConcurrentModificationException(); } } else { throw new IllegalStateException(); } } } class NoRemovedKeyCursor extends KolobokeLongIntHashMap.NoRemovedCursor { int[] vals; private NoRemovedKeyCursor(int mc) { super(mc); vals = values; } @Override public void remove() { long curKey; long free; if ((curKey = KolobokeLongIntHashMap.NoRemovedKeyCursor.this.curKey) != (free = KolobokeLongIntHashMap.NoRemovedKeyCursor.this.free)) { if (((expectedModCount)++) == (modCount())) { KolobokeLongIntHashMap.NoRemovedKeyCursor.this.curKey = free; int index = KolobokeLongIntHashMap.NoRemovedKeyCursor.this.index; long[] keys = KolobokeLongIntHashMap.NoRemovedKeyCursor.this.keys; int[] vals = KolobokeLongIntHashMap.NoRemovedKeyCursor.this.vals; if (keys == (set)) { int capacityMask = KolobokeLongIntHashMap.NoRemovedKeyCursor.this.capacityMask; incrementModCount(); int indexToRemove = index; int indexToShift = indexToRemove; int shiftDistance = 1; while (true) { indexToShift = (indexToShift - 1) & capacityMask; long keyToShift; if ((keyToShift = keys[indexToShift]) == free) { break; } if ((((LHash.SeparateKVLongKeyMixing.mix(keyToShift)) - indexToShift) & capacityMask) >= shiftDistance) { if ((KolobokeLongIntHashMap.NoRemovedKeyCursor.this.keys) == keys) { if (indexToShift > indexToRemove) { int slotsToCopy; if ((slotsToCopy = index) > 0) { KolobokeLongIntHashMap.NoRemovedKeyCursor.this.keys = Arrays.copyOf(keys, slotsToCopy); KolobokeLongIntHashMap.NoRemovedKeyCursor.this.vals = Arrays.copyOf(vals, slotsToCopy); if (indexToRemove < slotsToCopy) { KolobokeLongIntHashMap.NoRemovedKeyCursor.this.keys[indexToRemove] = free; } } } else if (indexToRemove == index) { KolobokeLongIntHashMap.NoRemovedKeyCursor.this.index = ++index; } } keys[indexToRemove] = keyToShift; vals[indexToRemove] = vals[indexToShift]; indexToRemove = indexToShift; shiftDistance = 1; } else { shiftDistance++; if (indexToShift == (1 + index)) { throw new ConcurrentModificationException(); } } } keys[indexToRemove] = free; postRemoveHook(); } else { justRemove(curKey); } } else { throw new ConcurrentModificationException(); } } else { throw new IllegalStateException(); } } } class EntryView extends AbstractSetView<Map.Entry<Long, Integer>> implements HashObjSet<Map.Entry<Long, Integer>> , InternalObjCollectionOps<Map.Entry<Long, Integer>> { @Nonnull @Override public Equivalence<Map.Entry<Long, Integer>> equivalence() { return Equivalence.entryEquivalence(Equivalence.<Long>defaultEquality(), Equivalence.<Integer>defaultEquality()); } @Nonnull @Override public HashConfig hashConfig() { return KolobokeLongIntHashMap.this.hashConfig(); } @Override public int size() { return size; } @Override public double currentLoad() { return KolobokeLongIntHashMap.this.currentLoad(); } @Override @SuppressWarnings(value = "unchecked") public boolean contains(Object o) { try { Map.Entry<Long, Integer> e = ((Map.Entry<Long, Integer>) (o)); return containsEntry(e.getKey(), e.getValue()); } catch (NullPointerException e) { return false; } catch (ClassCastException e) { return false; } } @Override @Nonnull public final Object[] toArray() { int size = size(); Object[] result = new Object[size]; if (size == 0) return result; int resultIndex = 0; int mc = modCount(); long free = freeValue; long[] keys = set; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { result[(resultIndex++)] = new KolobokeLongIntHashMap.MutableEntry(mc, i, key, vals[i]); } } if (mc != (modCount())) throw new ConcurrentModificationException(); return result; } @Override @SuppressWarnings(value = "unchecked") @Nonnull public final <T> T[] toArray(@Nonnull T[] a) { int size = size(); if ((a.length) < size) { Class<?> elementType = a.getClass().getComponentType(); a = ((T[]) (Array.newInstance(elementType, size))); } if (size == 0) { if ((a.length) > 0) a[0] = null; return a; } int resultIndex = 0; int mc = modCount(); long free = freeValue; long[] keys = set; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { a[(resultIndex++)] = ((T) (new KolobokeLongIntHashMap.MutableEntry(mc, i, key, vals[i]))); } } if (mc != (modCount())) throw new ConcurrentModificationException(); if ((a.length) > resultIndex) a[resultIndex] = null; return a; } @Override public final void forEach(@Nonnull Consumer<? super Map.Entry<Long, Integer>> action) { if (action == null) throw new NullPointerException(); if (KolobokeLongIntHashMap.EntryView.this.isEmpty()) return ; int mc = modCount(); long free = freeValue; long[] keys = set; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { action.accept(new KolobokeLongIntHashMap.MutableEntry(mc, i, key, vals[i])); } } if (mc != (modCount())) throw new ConcurrentModificationException(); } @Override public boolean forEachWhile(@Nonnull Predicate<? super Map.Entry<Long, Integer>> predicate) { if (predicate == null) throw new NullPointerException(); if (KolobokeLongIntHashMap.EntryView.this.isEmpty()) return true; boolean terminated = false; int mc = modCount(); long free = freeValue; long[] keys = set; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { if (!(predicate.test(new KolobokeLongIntHashMap.MutableEntry(mc, i, key, vals[i])))) { terminated = true; break; } } } if (mc != (modCount())) throw new ConcurrentModificationException(); return !terminated; } @Override @Nonnull public ObjIterator<Map.Entry<Long, Integer>> iterator() { int mc = modCount(); return new KolobokeLongIntHashMap.NoRemovedEntryIterator(mc); } @Nonnull @Override public ObjCursor<Map.Entry<Long, Integer>> cursor() { int mc = modCount(); return new KolobokeLongIntHashMap.NoRemovedEntryCursor(mc); } @Override public final boolean containsAll(@Nonnull Collection<?> c) { return CommonObjCollectionOps.containsAll(KolobokeLongIntHashMap.EntryView.this, c); } @Override public final boolean allContainingIn(ObjCollection<?> c) { if (KolobokeLongIntHashMap.EntryView.this.isEmpty()) return true; boolean containsAll = true; KolobokeLongIntHashMap.ReusableEntry e = new KolobokeLongIntHashMap.ReusableEntry(); int mc = modCount(); long free = freeValue; long[] keys = set; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { if (!(c.contains(e.with(key, vals[i])))) { containsAll = false; break; } } } if (mc != (modCount())) throw new ConcurrentModificationException(); return containsAll; } @Override public boolean reverseRemoveAllFrom(ObjSet<?> s) { if ((KolobokeLongIntHashMap.EntryView.this.isEmpty()) || (s.isEmpty())) return false; boolean changed = false; KolobokeLongIntHashMap.ReusableEntry e = new KolobokeLongIntHashMap.ReusableEntry(); int mc = modCount(); long free = freeValue; long[] keys = set; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { changed |= s.remove(e.with(key, vals[i])); } } if (mc != (modCount())) throw new ConcurrentModificationException(); return changed; } @Override public final boolean reverseAddAllTo(ObjCollection<? super Map.Entry<Long, Integer>> c) { if (KolobokeLongIntHashMap.EntryView.this.isEmpty()) return false; boolean changed = false; int mc = modCount(); long free = freeValue; long[] keys = set; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { changed |= c.add(new KolobokeLongIntHashMap.MutableEntry(mc, i, key, vals[i])); } } if (mc != (modCount())) throw new ConcurrentModificationException(); return changed; } public int hashCode() { return KolobokeLongIntHashMap.this.hashCode(); } @SuppressFBWarnings(value = "EC_UNRELATED_TYPES_USING_POINTER_EQUALITY") @Override public String toString() { if (KolobokeLongIntHashMap.EntryView.this.isEmpty()) return "[]"; StringBuilder sb = new StringBuilder(); int elementCount = 0; int mc = modCount(); long free = freeValue; long[] keys = set; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { sb.append(' '); sb.append(key); sb.append('='); sb.append(vals[i]); sb.append(','); if ((++elementCount) == 8) { int expectedLength = (sb.length()) * ((size()) / 8); sb.ensureCapacity((expectedLength + (expectedLength / 2))); } } } if (mc != (modCount())) throw new ConcurrentModificationException(); sb.setCharAt(0, '['); sb.setCharAt(((sb.length()) - 1), ']'); return sb.toString(); } @Override public boolean shrink() { return KolobokeLongIntHashMap.this.shrink(); } @Override @SuppressWarnings(value = "unchecked") public boolean remove(Object o) { try { Map.Entry<Long, Integer> e = ((Map.Entry<Long, Integer>) (o)); long key = e.getKey(); int value = e.getValue(); return KolobokeLongIntHashMap.this.remove(key, value); } catch (NullPointerException e) { return false; } catch (ClassCastException e) { return false; } } @Override public final boolean removeIf(@Nonnull Predicate<? super Map.Entry<Long, Integer>> filter) { if (filter == null) throw new NullPointerException(); if (KolobokeLongIntHashMap.EntryView.this.isEmpty()) return false; boolean changed = false; int mc = modCount(); long free = freeValue; long[] keys = set; int capacityMask = (keys.length) - 1; int firstDelayedRemoved = -1; long delayedRemoved = 0L; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { if (filter.test(new KolobokeLongIntHashMap.MutableEntry(mc, i, key, vals[i]))) { incrementModCount(); mc++; closeDeletion : if (firstDelayedRemoved < 0) { int indexToRemove = i; int indexToShift = indexToRemove; int shiftDistance = 1; while (true) { indexToShift = (indexToShift - 1) & capacityMask; long keyToShift; if ((keyToShift = keys[indexToShift]) == free) { break; } if ((((LHash.SeparateKVLongKeyMixing.mix(keyToShift)) - indexToShift) & capacityMask) >= shiftDistance) { if (indexToShift > indexToRemove) { firstDelayedRemoved = i; delayedRemoved = key; keys[indexToRemove] = key; break closeDeletion; } if (indexToRemove == i) { i++; } keys[indexToRemove] = keyToShift; vals[indexToRemove] = vals[indexToShift]; indexToRemove = indexToShift; shiftDistance = 1; } else { shiftDistance++; if (indexToShift == (1 + i)) { throw new ConcurrentModificationException(); } } } keys[indexToRemove] = free; postRemoveHook(); } else { keys[i] = delayedRemoved; } changed = true; } } } if (firstDelayedRemoved >= 0) { closeDelayedRemoved(firstDelayedRemoved, delayedRemoved); } if (mc != (modCount())) throw new ConcurrentModificationException(); return changed; } @SuppressWarnings(value = "unchecked") @Override public final boolean removeAll(@Nonnull Collection<?> c) { if (c instanceof InternalObjCollectionOps) { InternalObjCollectionOps c2 = ((InternalObjCollectionOps) (c)); if ((equivalence().equals(c2.equivalence())) && ((c2.size()) < (KolobokeLongIntHashMap.EntryView.this.size()))) { c2.reverseRemoveAllFrom(KolobokeLongIntHashMap.EntryView.this); } } if ((KolobokeLongIntHashMap.EntryView.this) == ((Object) (c))) throw new IllegalArgumentException(); if ((KolobokeLongIntHashMap.EntryView.this.isEmpty()) || (c.isEmpty())) return false; boolean changed = false; KolobokeLongIntHashMap.ReusableEntry e = new KolobokeLongIntHashMap.ReusableEntry(); int mc = modCount(); long free = freeValue; long[] keys = set; int capacityMask = (keys.length) - 1; int firstDelayedRemoved = -1; long delayedRemoved = 0L; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { if (c.contains(e.with(key, vals[i]))) { incrementModCount(); mc++; closeDeletion : if (firstDelayedRemoved < 0) { int indexToRemove = i; int indexToShift = indexToRemove; int shiftDistance = 1; while (true) { indexToShift = (indexToShift - 1) & capacityMask; long keyToShift; if ((keyToShift = keys[indexToShift]) == free) { break; } if ((((LHash.SeparateKVLongKeyMixing.mix(keyToShift)) - indexToShift) & capacityMask) >= shiftDistance) { if (indexToShift > indexToRemove) { firstDelayedRemoved = i; delayedRemoved = key; keys[indexToRemove] = key; break closeDeletion; } if (indexToRemove == i) { i++; } keys[indexToRemove] = keyToShift; vals[indexToRemove] = vals[indexToShift]; indexToRemove = indexToShift; shiftDistance = 1; } else { shiftDistance++; if (indexToShift == (1 + i)) { throw new ConcurrentModificationException(); } } } keys[indexToRemove] = free; postRemoveHook(); } else { keys[i] = delayedRemoved; } changed = true; } } } if (firstDelayedRemoved >= 0) { closeDelayedRemoved(firstDelayedRemoved, delayedRemoved); } if (mc != (modCount())) throw new ConcurrentModificationException(); return changed; } @Override public final boolean retainAll(@Nonnull Collection<?> c) { if ((KolobokeLongIntHashMap.EntryView.this) == ((Object) (c))) throw new IllegalArgumentException(); if (KolobokeLongIntHashMap.EntryView.this.isEmpty()) return false; if (c.isEmpty()) { clear(); return true; } boolean changed = false; KolobokeLongIntHashMap.ReusableEntry e = new KolobokeLongIntHashMap.ReusableEntry(); int mc = modCount(); long free = freeValue; long[] keys = set; int capacityMask = (keys.length) - 1; int firstDelayedRemoved = -1; long delayedRemoved = 0L; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { if (!(c.contains(e.with(key, vals[i])))) { incrementModCount(); mc++; closeDeletion : if (firstDelayedRemoved < 0) { int indexToRemove = i; int indexToShift = indexToRemove; int shiftDistance = 1; while (true) { indexToShift = (indexToShift - 1) & capacityMask; long keyToShift; if ((keyToShift = keys[indexToShift]) == free) { break; } if ((((LHash.SeparateKVLongKeyMixing.mix(keyToShift)) - indexToShift) & capacityMask) >= shiftDistance) { if (indexToShift > indexToRemove) { firstDelayedRemoved = i; delayedRemoved = key; keys[indexToRemove] = key; break closeDeletion; } if (indexToRemove == i) { i++; } keys[indexToRemove] = keyToShift; vals[indexToRemove] = vals[indexToShift]; indexToRemove = indexToShift; shiftDistance = 1; } else { shiftDistance++; if (indexToShift == (1 + i)) { throw new ConcurrentModificationException(); } } } keys[indexToRemove] = free; postRemoveHook(); } else { keys[i] = delayedRemoved; } changed = true; } } } if (firstDelayedRemoved >= 0) { closeDelayedRemoved(firstDelayedRemoved, delayedRemoved); } if (mc != (modCount())) throw new ConcurrentModificationException(); return changed; } @Override public void clear() { KolobokeLongIntHashMap.this.doClear(); } } abstract class LongIntEntry extends AbstractEntry<Long, Integer> { abstract long key(); @Override public final Long getKey() { return key(); } abstract int value(); @Override public final Integer getValue() { return value(); } @SuppressWarnings(value = "unchecked") @Override public boolean equals(Object o) { Map.Entry e2; long k2; int v2; try { e2 = ((Map.Entry) (o)); k2 = ((Long) (e2.getKey())); v2 = ((Integer) (e2.getValue())); return ((key()) == k2) && ((value()) == v2); } catch (ClassCastException e) { return false; } catch (NullPointerException e) { return false; } } @Override public int hashCode() { return (Primitives.hashCode(key())) ^ (Primitives.hashCode(value())); } } class MutableEntry extends KolobokeLongIntHashMap.LongIntEntry { final int modCount; private final int index; final long key; private int value; MutableEntry(int modCount, int index, long key, int value) { this.modCount = modCount; this.index = index; this.key = key; KolobokeLongIntHashMap.MutableEntry.this.value = value; } @Override public long key() { return key; } @Override public int value() { return value; } @Override public Integer setValue(Integer newValue) { if ((modCount) != (modCount())) throw new IllegalStateException(); int oldValue = value; int unwrappedNewValue = newValue; value = unwrappedNewValue; updateValueInTable(unwrappedNewValue); return oldValue; } void updateValueInTable(int newValue) { values[index] = newValue; } } class ReusableEntry extends KolobokeLongIntHashMap.LongIntEntry { private long key; private int value; KolobokeLongIntHashMap.ReusableEntry with(long key, int value) { KolobokeLongIntHashMap.ReusableEntry.this.key = key; KolobokeLongIntHashMap.ReusableEntry.this.value = value; return KolobokeLongIntHashMap.ReusableEntry.this; } @Override public long key() { return key; } @Override public int value() { return value; } } class ValueView extends AbstractIntValueView { @Override public int size() { return KolobokeLongIntHashMap.this.size(); } @Override public boolean shrink() { return KolobokeLongIntHashMap.this.shrink(); } @Override public boolean contains(Object o) { return KolobokeLongIntHashMap.this.containsValue(o); } @Override public boolean contains(int v) { return KolobokeLongIntHashMap.this.containsValue(v); } public void forEach(Consumer<? super Integer> action) { if (action == null) throw new NullPointerException(); if (KolobokeLongIntHashMap.ValueView.this.isEmpty()) return ; int mc = modCount(); long free = freeValue; long[] keys = set; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { if ((keys[i]) != free) { action.accept(vals[i]); } } if (mc != (modCount())) throw new ConcurrentModificationException(); } @Override public void forEach(IntConsumer action) { if (action == null) throw new NullPointerException(); if (KolobokeLongIntHashMap.ValueView.this.isEmpty()) return ; int mc = modCount(); long free = freeValue; long[] keys = set; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { if ((keys[i]) != free) { action.accept(vals[i]); } } if (mc != (modCount())) throw new ConcurrentModificationException(); } @Override public boolean forEachWhile(IntPredicate predicate) { if (predicate == null) throw new NullPointerException(); if (KolobokeLongIntHashMap.ValueView.this.isEmpty()) return true; boolean terminated = false; int mc = modCount(); long free = freeValue; long[] keys = set; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { if ((keys[i]) != free) { if (!(predicate.test(vals[i]))) { terminated = true; break; } } } if (mc != (modCount())) throw new ConcurrentModificationException(); return !terminated; } @Override public boolean allContainingIn(IntCollection c) { if (KolobokeLongIntHashMap.ValueView.this.isEmpty()) return true; boolean containsAll = true; int mc = modCount(); long free = freeValue; long[] keys = set; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { if ((keys[i]) != free) { if (!(c.contains(vals[i]))) { containsAll = false; break; } } } if (mc != (modCount())) throw new ConcurrentModificationException(); return containsAll; } @Override public boolean reverseAddAllTo(IntCollection c) { if (KolobokeLongIntHashMap.ValueView.this.isEmpty()) return false; boolean changed = false; int mc = modCount(); long free = freeValue; long[] keys = set; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { if ((keys[i]) != free) { changed |= c.add(vals[i]); } } if (mc != (modCount())) throw new ConcurrentModificationException(); return changed; } @Override public boolean reverseRemoveAllFrom(IntSet s) { if ((KolobokeLongIntHashMap.ValueView.this.isEmpty()) || (s.isEmpty())) return false; boolean changed = false; int mc = modCount(); long free = freeValue; long[] keys = set; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { if ((keys[i]) != free) { changed |= s.removeInt(vals[i]); } } if (mc != (modCount())) throw new ConcurrentModificationException(); return changed; } @Override @Nonnull public IntIterator iterator() { int mc = modCount(); return new KolobokeLongIntHashMap.NoRemovedValueIterator(mc); } @Nonnull @Override public IntCursor cursor() { int mc = modCount(); return new KolobokeLongIntHashMap.NoRemovedValueCursor(mc); } @Override @Nonnull public Object[] toArray() { int size = size(); Object[] result = new Object[size]; if (size == 0) return result; int resultIndex = 0; int mc = modCount(); long free = freeValue; long[] keys = set; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { if ((keys[i]) != free) { result[(resultIndex++)] = vals[i]; } } if (mc != (modCount())) throw new ConcurrentModificationException(); return result; } @Override @SuppressWarnings(value = "unchecked") @Nonnull public <T> T[] toArray(@Nonnull T[] a) { int size = size(); if ((a.length) < size) { Class<?> elementType = a.getClass().getComponentType(); a = ((T[]) (Array.newInstance(elementType, size))); } if (size == 0) { if ((a.length) > 0) a[0] = null; return a; } int resultIndex = 0; int mc = modCount(); long free = freeValue; long[] keys = set; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { if ((keys[i]) != free) { a[(resultIndex++)] = ((T) (Integer.valueOf(vals[i]))); } } if (mc != (modCount())) throw new ConcurrentModificationException(); if ((a.length) > resultIndex) a[resultIndex] = null; return a; } @Override public int[] toIntArray() { int size = size(); int[] result = new int[size]; if (size == 0) return result; int resultIndex = 0; int mc = modCount(); long free = freeValue; long[] keys = set; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { if ((keys[i]) != free) { result[(resultIndex++)] = vals[i]; } } if (mc != (modCount())) throw new ConcurrentModificationException(); return result; } @Override public int[] toArray(int[] a) { int size = size(); if ((a.length) < size) a = new int[size]; if (size == 0) { if ((a.length) > 0) a[0] = 0; return a; } int resultIndex = 0; int mc = modCount(); long free = freeValue; long[] keys = set; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { if ((keys[i]) != free) { a[(resultIndex++)] = vals[i]; } } if (mc != (modCount())) throw new ConcurrentModificationException(); if ((a.length) > resultIndex) a[resultIndex] = 0; return a; } @SuppressFBWarnings(value = "EC_UNRELATED_TYPES_USING_POINTER_EQUALITY") @Override public String toString() { if (KolobokeLongIntHashMap.ValueView.this.isEmpty()) return "[]"; StringBuilder sb = new StringBuilder(); int elementCount = 0; int mc = modCount(); long free = freeValue; long[] keys = set; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { if ((keys[i]) != free) { sb.append(' ').append(vals[i]).append(','); if ((++elementCount) == 8) { int expectedLength = (sb.length()) * ((size()) / 8); sb.ensureCapacity((expectedLength + (expectedLength / 2))); } } } if (mc != (modCount())) throw new ConcurrentModificationException(); sb.setCharAt(0, '['); sb.setCharAt(((sb.length()) - 1), ']'); return sb.toString(); } @Override public boolean remove(Object o) { return removeInt(((Integer) (o))); } @Override public boolean removeInt(int v) { return removeValue(v); } @Override public void clear() { KolobokeLongIntHashMap.this.clear(); } public boolean removeIf(Predicate<? super Integer> filter) { if (filter == null) throw new NullPointerException(); if (KolobokeLongIntHashMap.ValueView.this.isEmpty()) return false; boolean changed = false; int mc = modCount(); long free = freeValue; long[] keys = set; int capacityMask = (keys.length) - 1; int firstDelayedRemoved = -1; long delayedRemoved = 0L; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { if (filter.test(vals[i])) { incrementModCount(); mc++; closeDeletion : if (firstDelayedRemoved < 0) { int indexToRemove = i; int indexToShift = indexToRemove; int shiftDistance = 1; while (true) { indexToShift = (indexToShift - 1) & capacityMask; long keyToShift; if ((keyToShift = keys[indexToShift]) == free) { break; } if ((((LHash.SeparateKVLongKeyMixing.mix(keyToShift)) - indexToShift) & capacityMask) >= shiftDistance) { if (indexToShift > indexToRemove) { firstDelayedRemoved = i; delayedRemoved = key; keys[indexToRemove] = key; break closeDeletion; } if (indexToRemove == i) { i++; } keys[indexToRemove] = keyToShift; vals[indexToRemove] = vals[indexToShift]; indexToRemove = indexToShift; shiftDistance = 1; } else { shiftDistance++; if (indexToShift == (1 + i)) { throw new ConcurrentModificationException(); } } } keys[indexToRemove] = free; postRemoveHook(); } else { keys[i] = delayedRemoved; } changed = true; } } } if (firstDelayedRemoved >= 0) { closeDelayedRemoved(firstDelayedRemoved, delayedRemoved); } if (mc != (modCount())) throw new ConcurrentModificationException(); return changed; } @Override public boolean removeIf(IntPredicate filter) { if (filter == null) throw new NullPointerException(); if (KolobokeLongIntHashMap.ValueView.this.isEmpty()) return false; boolean changed = false; int mc = modCount(); long free = freeValue; long[] keys = set; int capacityMask = (keys.length) - 1; int firstDelayedRemoved = -1; long delayedRemoved = 0L; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { if (filter.test(vals[i])) { incrementModCount(); mc++; closeDeletion : if (firstDelayedRemoved < 0) { int indexToRemove = i; int indexToShift = indexToRemove; int shiftDistance = 1; while (true) { indexToShift = (indexToShift - 1) & capacityMask; long keyToShift; if ((keyToShift = keys[indexToShift]) == free) { break; } if ((((LHash.SeparateKVLongKeyMixing.mix(keyToShift)) - indexToShift) & capacityMask) >= shiftDistance) { if (indexToShift > indexToRemove) { firstDelayedRemoved = i; delayedRemoved = key; keys[indexToRemove] = key; break closeDeletion; } if (indexToRemove == i) { i++; } keys[indexToRemove] = keyToShift; vals[indexToRemove] = vals[indexToShift]; indexToRemove = indexToShift; shiftDistance = 1; } else { shiftDistance++; if (indexToShift == (1 + i)) { throw new ConcurrentModificationException(); } } } keys[indexToRemove] = free; postRemoveHook(); } else { keys[i] = delayedRemoved; } changed = true; } } } if (firstDelayedRemoved >= 0) { closeDelayedRemoved(firstDelayedRemoved, delayedRemoved); } if (mc != (modCount())) throw new ConcurrentModificationException(); return changed; } @Override public boolean removeAll(@Nonnull Collection<?> c) { if (c instanceof IntCollection) return removeAll(((IntCollection) (c))); if ((KolobokeLongIntHashMap.ValueView.this) == ((Object) (c))) throw new IllegalArgumentException(); if ((KolobokeLongIntHashMap.ValueView.this.isEmpty()) || (c.isEmpty())) return false; boolean changed = false; int mc = modCount(); long free = freeValue; long[] keys = set; int capacityMask = (keys.length) - 1; int firstDelayedRemoved = -1; long delayedRemoved = 0L; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { if (c.contains(vals[i])) { incrementModCount(); mc++; closeDeletion : if (firstDelayedRemoved < 0) { int indexToRemove = i; int indexToShift = indexToRemove; int shiftDistance = 1; while (true) { indexToShift = (indexToShift - 1) & capacityMask; long keyToShift; if ((keyToShift = keys[indexToShift]) == free) { break; } if ((((LHash.SeparateKVLongKeyMixing.mix(keyToShift)) - indexToShift) & capacityMask) >= shiftDistance) { if (indexToShift > indexToRemove) { firstDelayedRemoved = i; delayedRemoved = key; keys[indexToRemove] = key; break closeDeletion; } if (indexToRemove == i) { i++; } keys[indexToRemove] = keyToShift; vals[indexToRemove] = vals[indexToShift]; indexToRemove = indexToShift; shiftDistance = 1; } else { shiftDistance++; if (indexToShift == (1 + i)) { throw new ConcurrentModificationException(); } } } keys[indexToRemove] = free; postRemoveHook(); } else { keys[i] = delayedRemoved; } changed = true; } } } if (firstDelayedRemoved >= 0) { closeDelayedRemoved(firstDelayedRemoved, delayedRemoved); } if (mc != (modCount())) throw new ConcurrentModificationException(); return changed; } private boolean removeAll(IntCollection c) { if ((KolobokeLongIntHashMap.ValueView.this) == ((Object) (c))) throw new IllegalArgumentException(); if ((KolobokeLongIntHashMap.ValueView.this.isEmpty()) || (c.isEmpty())) return false; boolean changed = false; int mc = modCount(); long free = freeValue; long[] keys = set; int capacityMask = (keys.length) - 1; int firstDelayedRemoved = -1; long delayedRemoved = 0L; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { if (c.contains(vals[i])) { incrementModCount(); mc++; closeDeletion : if (firstDelayedRemoved < 0) { int indexToRemove = i; int indexToShift = indexToRemove; int shiftDistance = 1; while (true) { indexToShift = (indexToShift - 1) & capacityMask; long keyToShift; if ((keyToShift = keys[indexToShift]) == free) { break; } if ((((LHash.SeparateKVLongKeyMixing.mix(keyToShift)) - indexToShift) & capacityMask) >= shiftDistance) { if (indexToShift > indexToRemove) { firstDelayedRemoved = i; delayedRemoved = key; keys[indexToRemove] = key; break closeDeletion; } if (indexToRemove == i) { i++; } keys[indexToRemove] = keyToShift; vals[indexToRemove] = vals[indexToShift]; indexToRemove = indexToShift; shiftDistance = 1; } else { shiftDistance++; if (indexToShift == (1 + i)) { throw new ConcurrentModificationException(); } } } keys[indexToRemove] = free; postRemoveHook(); } else { keys[i] = delayedRemoved; } changed = true; } } } if (firstDelayedRemoved >= 0) { closeDelayedRemoved(firstDelayedRemoved, delayedRemoved); } if (mc != (modCount())) throw new ConcurrentModificationException(); return changed; } @Override public boolean retainAll(@Nonnull Collection<?> c) { if (c instanceof IntCollection) return retainAll(((IntCollection) (c))); if ((KolobokeLongIntHashMap.ValueView.this) == ((Object) (c))) throw new IllegalArgumentException(); if (KolobokeLongIntHashMap.ValueView.this.isEmpty()) return false; if (c.isEmpty()) { clear(); return true; } boolean changed = false; int mc = modCount(); long free = freeValue; long[] keys = set; int capacityMask = (keys.length) - 1; int firstDelayedRemoved = -1; long delayedRemoved = 0L; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { if (!(c.contains(vals[i]))) { incrementModCount(); mc++; closeDeletion : if (firstDelayedRemoved < 0) { int indexToRemove = i; int indexToShift = indexToRemove; int shiftDistance = 1; while (true) { indexToShift = (indexToShift - 1) & capacityMask; long keyToShift; if ((keyToShift = keys[indexToShift]) == free) { break; } if ((((LHash.SeparateKVLongKeyMixing.mix(keyToShift)) - indexToShift) & capacityMask) >= shiftDistance) { if (indexToShift > indexToRemove) { firstDelayedRemoved = i; delayedRemoved = key; keys[indexToRemove] = key; break closeDeletion; } if (indexToRemove == i) { i++; } keys[indexToRemove] = keyToShift; vals[indexToRemove] = vals[indexToShift]; indexToRemove = indexToShift; shiftDistance = 1; } else { shiftDistance++; if (indexToShift == (1 + i)) { throw new ConcurrentModificationException(); } } } keys[indexToRemove] = free; postRemoveHook(); } else { keys[i] = delayedRemoved; } changed = true; } } } if (firstDelayedRemoved >= 0) { closeDelayedRemoved(firstDelayedRemoved, delayedRemoved); } if (mc != (modCount())) throw new ConcurrentModificationException(); return changed; } private boolean retainAll(IntCollection c) { if ((KolobokeLongIntHashMap.ValueView.this) == ((Object) (c))) throw new IllegalArgumentException(); if (KolobokeLongIntHashMap.ValueView.this.isEmpty()) return false; if (c.isEmpty()) { clear(); return true; } boolean changed = false; int mc = modCount(); long free = freeValue; long[] keys = set; int capacityMask = (keys.length) - 1; int firstDelayedRemoved = -1; long delayedRemoved = 0L; int[] vals = values; for (int i = (keys.length) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { if (!(c.contains(vals[i]))) { incrementModCount(); mc++; closeDeletion : if (firstDelayedRemoved < 0) { int indexToRemove = i; int indexToShift = indexToRemove; int shiftDistance = 1; while (true) { indexToShift = (indexToShift - 1) & capacityMask; long keyToShift; if ((keyToShift = keys[indexToShift]) == free) { break; } if ((((LHash.SeparateKVLongKeyMixing.mix(keyToShift)) - indexToShift) & capacityMask) >= shiftDistance) { if (indexToShift > indexToRemove) { firstDelayedRemoved = i; delayedRemoved = key; keys[indexToRemove] = key; break closeDeletion; } if (indexToRemove == i) { i++; } keys[indexToRemove] = keyToShift; vals[indexToRemove] = vals[indexToShift]; indexToRemove = indexToShift; shiftDistance = 1; } else { shiftDistance++; if (indexToShift == (1 + i)) { throw new ConcurrentModificationException(); } } } keys[indexToRemove] = free; postRemoveHook(); } else { keys[i] = delayedRemoved; } changed = true; } } } if (firstDelayedRemoved >= 0) { closeDelayedRemoved(firstDelayedRemoved, delayedRemoved); } if (mc != (modCount())) throw new ConcurrentModificationException(); return changed; } } class NoRemovedEntryIterator implements ObjIterator<Map.Entry<Long, Integer>> { long[] keys; int[] vals; final long free; final int capacityMask; int expectedModCount; class MutableEntry2 extends KolobokeLongIntHashMap.MutableEntry { MutableEntry2(int modCount, int index, long key, int value) { super(modCount, index, key, value); } @Override void updateValueInTable(int newValue) { if ((vals) == (values)) { vals[index] = newValue; } else { justPut(key, newValue); if ((KolobokeLongIntHashMap.NoRemovedEntryIterator.MutableEntry2.this.modCount) != (modCount())) { throw new IllegalStateException(); } } } } int index = -1; int nextIndex; KolobokeLongIntHashMap.MutableEntry next; NoRemovedEntryIterator(int mc) { expectedModCount = mc; long[] keys = KolobokeLongIntHashMap.NoRemovedEntryIterator.this.keys = set; capacityMask = (keys.length) - 1; int[] vals = KolobokeLongIntHashMap.NoRemovedEntryIterator.this.vals = values; long free = this.free = freeValue; int nextI = keys.length; while ((--nextI) >= 0) { long key; if ((key = keys[nextI]) != free) { next = new KolobokeLongIntHashMap.NoRemovedEntryIterator.MutableEntry2(mc, nextI, key, vals[nextI]); break; } } nextIndex = nextI; } @Override public void forEachRemaining(@Nonnull Consumer<? super Map.Entry<Long, Integer>> action) { if (action == null) throw new NullPointerException(); int mc = expectedModCount; long[] keys = KolobokeLongIntHashMap.NoRemovedEntryIterator.this.keys; int[] vals = KolobokeLongIntHashMap.NoRemovedEntryIterator.this.vals; long free = KolobokeLongIntHashMap.NoRemovedEntryIterator.this.free; int nextI = nextIndex; for (int i = nextI; i >= 0; i--) { long key; if ((key = keys[i]) != free) { action.accept(new KolobokeLongIntHashMap.NoRemovedEntryIterator.MutableEntry2(mc, i, key, vals[i])); } } if ((nextI != (nextIndex)) || (mc != (modCount()))) { throw new ConcurrentModificationException(); } index = nextIndex = -1; } @Override public boolean hasNext() { return (nextIndex) >= 0; } @Override public Map.Entry<Long, Integer> next() { int mc; if ((mc = expectedModCount) == (modCount())) { int nextI; if ((nextI = nextIndex) >= 0) { index = nextI; long[] keys = KolobokeLongIntHashMap.NoRemovedEntryIterator.this.keys; long free = KolobokeLongIntHashMap.NoRemovedEntryIterator.this.free; KolobokeLongIntHashMap.MutableEntry prev = next; while ((--nextI) >= 0) { long key; if ((key = keys[nextI]) != free) { next = new KolobokeLongIntHashMap.NoRemovedEntryIterator.MutableEntry2(mc, nextI, key, vals[nextI]); break; } } nextIndex = nextI; return prev; } else { throw new NoSuchElementException(); } } else { throw new ConcurrentModificationException(); } } @Override public void remove() { int index; if ((index = KolobokeLongIntHashMap.NoRemovedEntryIterator.this.index) >= 0) { if (((expectedModCount)++) == (modCount())) { KolobokeLongIntHashMap.NoRemovedEntryIterator.this.index = -1; long[] keys = KolobokeLongIntHashMap.NoRemovedEntryIterator.this.keys; int[] vals = KolobokeLongIntHashMap.NoRemovedEntryIterator.this.vals; if (keys == (set)) { int capacityMask = KolobokeLongIntHashMap.NoRemovedEntryIterator.this.capacityMask; incrementModCount(); int indexToRemove = index; int indexToShift = indexToRemove; int shiftDistance = 1; while (true) { indexToShift = (indexToShift - 1) & capacityMask; long keyToShift; if ((keyToShift = keys[indexToShift]) == (free)) { break; } if ((((LHash.SeparateKVLongKeyMixing.mix(keyToShift)) - indexToShift) & capacityMask) >= shiftDistance) { if ((KolobokeLongIntHashMap.NoRemovedEntryIterator.this.keys) == keys) { if (indexToShift > indexToRemove) { int slotsToCopy; if ((slotsToCopy = (nextIndex) + 1) > 0) { KolobokeLongIntHashMap.NoRemovedEntryIterator.this.keys = Arrays.copyOf(keys, slotsToCopy); KolobokeLongIntHashMap.NoRemovedEntryIterator.this.vals = Arrays.copyOf(vals, slotsToCopy); if (indexToRemove < slotsToCopy) { KolobokeLongIntHashMap.NoRemovedEntryIterator.this.keys[indexToRemove] = free; } } } else if (indexToRemove == index) { KolobokeLongIntHashMap.NoRemovedEntryIterator.this.nextIndex = index; if (indexToShift < (index - 1)) { KolobokeLongIntHashMap.NoRemovedEntryIterator.this.next = new KolobokeLongIntHashMap.NoRemovedEntryIterator.MutableEntry2(modCount(), indexToShift, keyToShift, vals[indexToShift]); } } } keys[indexToRemove] = keyToShift; vals[indexToRemove] = vals[indexToShift]; indexToRemove = indexToShift; shiftDistance = 1; } else { shiftDistance++; if (indexToShift == (1 + index)) { throw new ConcurrentModificationException(); } } } keys[indexToRemove] = free; postRemoveHook(); } else { justRemove(keys[index]); } } else { throw new ConcurrentModificationException(); } } else { throw new IllegalStateException(); } } } class NoRemovedEntryCursor implements ObjCursor<Map.Entry<Long, Integer>> { long[] keys; int[] vals; final long free; final int capacityMask; int expectedModCount; class MutableEntry2 extends KolobokeLongIntHashMap.MutableEntry { MutableEntry2(int modCount, int index, long key, int value) { super(modCount, index, key, value); } @Override void updateValueInTable(int newValue) { if ((vals) == (values)) { vals[index] = newValue; } else { justPut(key, newValue); if ((KolobokeLongIntHashMap.NoRemovedEntryCursor.MutableEntry2.this.modCount) != (modCount())) { throw new IllegalStateException(); } } } } int index; long curKey; int curValue; NoRemovedEntryCursor(int mc) { expectedModCount = mc; long[] keys = KolobokeLongIntHashMap.NoRemovedEntryCursor.this.keys = set; capacityMask = (keys.length) - 1; index = keys.length; vals = values; long free = this.free = freeValue; curKey = free; } @Override public void forEachForward(Consumer<? super Map.Entry<Long, Integer>> action) { if (action == null) throw new NullPointerException(); int mc = expectedModCount; long[] keys = KolobokeLongIntHashMap.NoRemovedEntryCursor.this.keys; int[] vals = KolobokeLongIntHashMap.NoRemovedEntryCursor.this.vals; long free = KolobokeLongIntHashMap.NoRemovedEntryCursor.this.free; int index = KolobokeLongIntHashMap.NoRemovedEntryCursor.this.index; for (int i = index - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { action.accept(new KolobokeLongIntHashMap.NoRemovedEntryCursor.MutableEntry2(mc, i, key, vals[i])); } } if ((index != (KolobokeLongIntHashMap.NoRemovedEntryCursor.this.index)) || (mc != (modCount()))) { throw new ConcurrentModificationException(); } KolobokeLongIntHashMap.NoRemovedEntryCursor.this.index = -1; curKey = free; } @Override public Map.Entry<Long, Integer> elem() { long curKey; if ((curKey = KolobokeLongIntHashMap.NoRemovedEntryCursor.this.curKey) != (free)) { return new KolobokeLongIntHashMap.NoRemovedEntryCursor.MutableEntry2(expectedModCount, index, curKey, curValue); } else { throw new IllegalStateException(); } } @Override public boolean moveNext() { if ((expectedModCount) == (modCount())) { long[] keys = KolobokeLongIntHashMap.NoRemovedEntryCursor.this.keys; long free = KolobokeLongIntHashMap.NoRemovedEntryCursor.this.free; for (int i = (index) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { index = i; curKey = key; curValue = vals[i]; return true; } } curKey = free; index = -1; return false; } else { throw new ConcurrentModificationException(); } } @Override public void remove() { long curKey; long free; if ((curKey = KolobokeLongIntHashMap.NoRemovedEntryCursor.this.curKey) != (free = KolobokeLongIntHashMap.NoRemovedEntryCursor.this.free)) { if (((expectedModCount)++) == (modCount())) { KolobokeLongIntHashMap.NoRemovedEntryCursor.this.curKey = free; int index = KolobokeLongIntHashMap.NoRemovedEntryCursor.this.index; long[] keys = KolobokeLongIntHashMap.NoRemovedEntryCursor.this.keys; int[] vals = KolobokeLongIntHashMap.NoRemovedEntryCursor.this.vals; if (keys == (set)) { int capacityMask = KolobokeLongIntHashMap.NoRemovedEntryCursor.this.capacityMask; incrementModCount(); int indexToRemove = index; int indexToShift = indexToRemove; int shiftDistance = 1; while (true) { indexToShift = (indexToShift - 1) & capacityMask; long keyToShift; if ((keyToShift = keys[indexToShift]) == free) { break; } if ((((LHash.SeparateKVLongKeyMixing.mix(keyToShift)) - indexToShift) & capacityMask) >= shiftDistance) { if ((KolobokeLongIntHashMap.NoRemovedEntryCursor.this.keys) == keys) { if (indexToShift > indexToRemove) { int slotsToCopy; if ((slotsToCopy = index) > 0) { KolobokeLongIntHashMap.NoRemovedEntryCursor.this.keys = Arrays.copyOf(keys, slotsToCopy); KolobokeLongIntHashMap.NoRemovedEntryCursor.this.vals = Arrays.copyOf(vals, slotsToCopy); if (indexToRemove < slotsToCopy) { KolobokeLongIntHashMap.NoRemovedEntryCursor.this.keys[indexToRemove] = free; } } } else if (indexToRemove == index) { KolobokeLongIntHashMap.NoRemovedEntryCursor.this.index = ++index; } } keys[indexToRemove] = keyToShift; vals[indexToRemove] = vals[indexToShift]; indexToRemove = indexToShift; shiftDistance = 1; } else { shiftDistance++; if (indexToShift == (1 + index)) { throw new ConcurrentModificationException(); } } } keys[indexToRemove] = free; postRemoveHook(); } else { justRemove(curKey); } } else { throw new ConcurrentModificationException(); } } else { throw new IllegalStateException(); } } } class NoRemovedValueIterator implements IntIterator { long[] keys; int[] vals; final long free; final int capacityMask; int expectedModCount; int index = -1; int nextIndex; int next; NoRemovedValueIterator(int mc) { expectedModCount = mc; long[] keys = KolobokeLongIntHashMap.NoRemovedValueIterator.this.keys = set; capacityMask = (keys.length) - 1; int[] vals = KolobokeLongIntHashMap.NoRemovedValueIterator.this.vals = values; long free = this.free = freeValue; int nextI = keys.length; while ((--nextI) >= 0) { if ((keys[nextI]) != free) { next = vals[nextI]; break; } } nextIndex = nextI; } @Override public int nextInt() { if ((expectedModCount) == (modCount())) { int nextI; if ((nextI = nextIndex) >= 0) { index = nextI; long[] keys = KolobokeLongIntHashMap.NoRemovedValueIterator.this.keys; long free = KolobokeLongIntHashMap.NoRemovedValueIterator.this.free; int prev = next; while ((--nextI) >= 0) { if ((keys[nextI]) != free) { next = vals[nextI]; break; } } nextIndex = nextI; return prev; } else { throw new NoSuchElementException(); } } else { throw new ConcurrentModificationException(); } } public void forEachRemaining(Consumer<? super Integer> action) { if (action == null) throw new NullPointerException(); int mc = expectedModCount; long[] keys = KolobokeLongIntHashMap.NoRemovedValueIterator.this.keys; int[] vals = KolobokeLongIntHashMap.NoRemovedValueIterator.this.vals; long free = KolobokeLongIntHashMap.NoRemovedValueIterator.this.free; int nextI = nextIndex; for (int i = nextI; i >= 0; i--) { if ((keys[i]) != free) { action.accept(vals[i]); } } if ((nextI != (nextIndex)) || (mc != (modCount()))) { throw new ConcurrentModificationException(); } index = nextIndex = -1; } @Override public void forEachRemaining(IntConsumer action) { if (action == null) throw new NullPointerException(); int mc = expectedModCount; long[] keys = KolobokeLongIntHashMap.NoRemovedValueIterator.this.keys; int[] vals = KolobokeLongIntHashMap.NoRemovedValueIterator.this.vals; long free = KolobokeLongIntHashMap.NoRemovedValueIterator.this.free; int nextI = nextIndex; for (int i = nextI; i >= 0; i--) { if ((keys[i]) != free) { action.accept(vals[i]); } } if ((nextI != (nextIndex)) || (mc != (modCount()))) { throw new ConcurrentModificationException(); } index = nextIndex = -1; } @Override public boolean hasNext() { return (nextIndex) >= 0; } @Override public Integer next() { return nextInt(); } @Override public void remove() { int index; if ((index = KolobokeLongIntHashMap.NoRemovedValueIterator.this.index) >= 0) { if (((expectedModCount)++) == (modCount())) { KolobokeLongIntHashMap.NoRemovedValueIterator.this.index = -1; long[] keys = KolobokeLongIntHashMap.NoRemovedValueIterator.this.keys; int[] vals = KolobokeLongIntHashMap.NoRemovedValueIterator.this.vals; if (keys == (set)) { int capacityMask = KolobokeLongIntHashMap.NoRemovedValueIterator.this.capacityMask; incrementModCount(); int indexToRemove = index; int indexToShift = indexToRemove; int shiftDistance = 1; while (true) { indexToShift = (indexToShift - 1) & capacityMask; long keyToShift; if ((keyToShift = keys[indexToShift]) == (free)) { break; } if ((((LHash.SeparateKVLongKeyMixing.mix(keyToShift)) - indexToShift) & capacityMask) >= shiftDistance) { if ((KolobokeLongIntHashMap.NoRemovedValueIterator.this.keys) == keys) { if (indexToShift > indexToRemove) { int slotsToCopy; if ((slotsToCopy = (nextIndex) + 1) > 0) { KolobokeLongIntHashMap.NoRemovedValueIterator.this.keys = Arrays.copyOf(keys, slotsToCopy); KolobokeLongIntHashMap.NoRemovedValueIterator.this.vals = Arrays.copyOf(vals, slotsToCopy); if (indexToRemove < slotsToCopy) { KolobokeLongIntHashMap.NoRemovedValueIterator.this.keys[indexToRemove] = free; } } } else if (indexToRemove == index) { KolobokeLongIntHashMap.NoRemovedValueIterator.this.nextIndex = index; if (indexToShift < (index - 1)) { KolobokeLongIntHashMap.NoRemovedValueIterator.this.next = vals[indexToShift]; } } } keys[indexToRemove] = keyToShift; vals[indexToRemove] = vals[indexToShift]; indexToRemove = indexToShift; shiftDistance = 1; } else { shiftDistance++; if (indexToShift == (1 + index)) { throw new ConcurrentModificationException(); } } } keys[indexToRemove] = free; postRemoveHook(); } else { justRemove(keys[index]); } } else { throw new ConcurrentModificationException(); } } else { throw new IllegalStateException(); } } } class NoRemovedValueCursor implements IntCursor { long[] keys; int[] vals; final long free; final int capacityMask; int expectedModCount; int index; long curKey; int curValue; NoRemovedValueCursor(int mc) { expectedModCount = mc; long[] keys = KolobokeLongIntHashMap.NoRemovedValueCursor.this.keys = set; capacityMask = (keys.length) - 1; index = keys.length; vals = values; long free = this.free = freeValue; curKey = free; } @Override public void forEachForward(IntConsumer action) { if (action == null) throw new NullPointerException(); int mc = expectedModCount; long[] keys = KolobokeLongIntHashMap.NoRemovedValueCursor.this.keys; int[] vals = KolobokeLongIntHashMap.NoRemovedValueCursor.this.vals; long free = KolobokeLongIntHashMap.NoRemovedValueCursor.this.free; int index = KolobokeLongIntHashMap.NoRemovedValueCursor.this.index; for (int i = index - 1; i >= 0; i--) { if ((keys[i]) != free) { action.accept(vals[i]); } } if ((index != (KolobokeLongIntHashMap.NoRemovedValueCursor.this.index)) || (mc != (modCount()))) { throw new ConcurrentModificationException(); } KolobokeLongIntHashMap.NoRemovedValueCursor.this.index = -1; curKey = free; } @Override public int elem() { if ((curKey) != (free)) { return curValue; } else { throw new IllegalStateException(); } } @Override public boolean moveNext() { if ((expectedModCount) == (modCount())) { long[] keys = KolobokeLongIntHashMap.NoRemovedValueCursor.this.keys; long free = KolobokeLongIntHashMap.NoRemovedValueCursor.this.free; for (int i = (index) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { index = i; curKey = key; curValue = vals[i]; return true; } } curKey = free; index = -1; return false; } else { throw new ConcurrentModificationException(); } } @Override public void remove() { long curKey; long free; if ((curKey = KolobokeLongIntHashMap.NoRemovedValueCursor.this.curKey) != (free = KolobokeLongIntHashMap.NoRemovedValueCursor.this.free)) { if (((expectedModCount)++) == (modCount())) { KolobokeLongIntHashMap.NoRemovedValueCursor.this.curKey = free; int index = KolobokeLongIntHashMap.NoRemovedValueCursor.this.index; long[] keys = KolobokeLongIntHashMap.NoRemovedValueCursor.this.keys; int[] vals = KolobokeLongIntHashMap.NoRemovedValueCursor.this.vals; if (keys == (set)) { int capacityMask = KolobokeLongIntHashMap.NoRemovedValueCursor.this.capacityMask; incrementModCount(); int indexToRemove = index; int indexToShift = indexToRemove; int shiftDistance = 1; while (true) { indexToShift = (indexToShift - 1) & capacityMask; long keyToShift; if ((keyToShift = keys[indexToShift]) == free) { break; } if ((((LHash.SeparateKVLongKeyMixing.mix(keyToShift)) - indexToShift) & capacityMask) >= shiftDistance) { if ((KolobokeLongIntHashMap.NoRemovedValueCursor.this.keys) == keys) { if (indexToShift > indexToRemove) { int slotsToCopy; if ((slotsToCopy = index) > 0) { KolobokeLongIntHashMap.NoRemovedValueCursor.this.keys = Arrays.copyOf(keys, slotsToCopy); KolobokeLongIntHashMap.NoRemovedValueCursor.this.vals = Arrays.copyOf(vals, slotsToCopy); if (indexToRemove < slotsToCopy) { KolobokeLongIntHashMap.NoRemovedValueCursor.this.keys[indexToRemove] = free; } } } else if (indexToRemove == index) { KolobokeLongIntHashMap.NoRemovedValueCursor.this.index = ++index; } } keys[indexToRemove] = keyToShift; vals[indexToRemove] = vals[indexToShift]; indexToRemove = indexToShift; shiftDistance = 1; } else { shiftDistance++; if (indexToShift == (1 + index)) { throw new ConcurrentModificationException(); } } } keys[indexToRemove] = free; postRemoveHook(); } else { justRemove(curKey); } } else { throw new ConcurrentModificationException(); } } else { throw new IllegalStateException(); } } } class NoRemovedMapCursor implements LongIntCursor { long[] keys; int[] vals; final long free; final int capacityMask; int expectedModCount; int index; long curKey; int curValue; NoRemovedMapCursor(int mc) { expectedModCount = mc; long[] keys = KolobokeLongIntHashMap.NoRemovedMapCursor.this.keys = set; capacityMask = (keys.length) - 1; index = keys.length; vals = values; long free = this.free = freeValue; curKey = free; } @Override public void forEachForward(LongIntConsumer action) { if (action == null) throw new NullPointerException(); int mc = expectedModCount; long[] keys = KolobokeLongIntHashMap.NoRemovedMapCursor.this.keys; int[] vals = KolobokeLongIntHashMap.NoRemovedMapCursor.this.vals; long free = KolobokeLongIntHashMap.NoRemovedMapCursor.this.free; int index = KolobokeLongIntHashMap.NoRemovedMapCursor.this.index; for (int i = index - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { action.accept(key, vals[i]); } } if ((index != (KolobokeLongIntHashMap.NoRemovedMapCursor.this.index)) || (mc != (modCount()))) { throw new ConcurrentModificationException(); } KolobokeLongIntHashMap.NoRemovedMapCursor.this.index = -1; curKey = free; } @Override public long key() { long curKey; if ((curKey = KolobokeLongIntHashMap.NoRemovedMapCursor.this.curKey) != (free)) { return curKey; } else { throw new IllegalStateException(); } } @Override public int value() { if ((curKey) != (free)) { return curValue; } else { throw new IllegalStateException(); } } @Override public void setValue(int value) { if ((curKey) != (free)) { if ((expectedModCount) == (modCount())) { vals[index] = value; if ((vals) != (values)) { values[index] = value; } } else { throw new ConcurrentModificationException(); } } else { throw new IllegalStateException(); } } @Override public boolean moveNext() { if ((expectedModCount) == (modCount())) { long[] keys = KolobokeLongIntHashMap.NoRemovedMapCursor.this.keys; long free = KolobokeLongIntHashMap.NoRemovedMapCursor.this.free; for (int i = (index) - 1; i >= 0; i--) { long key; if ((key = keys[i]) != free) { index = i; curKey = key; curValue = vals[i]; return true; } } curKey = free; index = -1; return false; } else { throw new ConcurrentModificationException(); } } @Override public void remove() { long curKey; long free; if ((curKey = KolobokeLongIntHashMap.NoRemovedMapCursor.this.curKey) != (free = KolobokeLongIntHashMap.NoRemovedMapCursor.this.free)) { if (((expectedModCount)++) == (modCount())) { KolobokeLongIntHashMap.NoRemovedMapCursor.this.curKey = free; int index = KolobokeLongIntHashMap.NoRemovedMapCursor.this.index; long[] keys = KolobokeLongIntHashMap.NoRemovedMapCursor.this.keys; int[] vals = KolobokeLongIntHashMap.NoRemovedMapCursor.this.vals; if (keys == (set)) { int capacityMask = KolobokeLongIntHashMap.NoRemovedMapCursor.this.capacityMask; incrementModCount(); int indexToRemove = index; int indexToShift = indexToRemove; int shiftDistance = 1; while (true) { indexToShift = (indexToShift - 1) & capacityMask; long keyToShift; if ((keyToShift = keys[indexToShift]) == free) { break; } if ((((LHash.SeparateKVLongKeyMixing.mix(keyToShift)) - indexToShift) & capacityMask) >= shiftDistance) { if ((KolobokeLongIntHashMap.NoRemovedMapCursor.this.keys) == keys) { if (indexToShift > indexToRemove) { int slotsToCopy; if ((slotsToCopy = index) > 0) { KolobokeLongIntHashMap.NoRemovedMapCursor.this.keys = Arrays.copyOf(keys, slotsToCopy); KolobokeLongIntHashMap.NoRemovedMapCursor.this.vals = Arrays.copyOf(vals, slotsToCopy); if (indexToRemove < slotsToCopy) { KolobokeLongIntHashMap.NoRemovedMapCursor.this.keys[indexToRemove] = free; } } } else if (indexToRemove == index) { KolobokeLongIntHashMap.NoRemovedMapCursor.this.index = ++index; } } keys[indexToRemove] = keyToShift; vals[indexToRemove] = vals[indexToShift]; indexToRemove = indexToShift; shiftDistance = 1; } else { shiftDistance++; if (indexToShift == (1 + index)) { throw new ConcurrentModificationException(); } } } keys[indexToRemove] = free; postRemoveHook(); } else { justRemove(curKey); } } else { throw new ConcurrentModificationException(); } } else { throw new IllegalStateException(); } } } KolobokeLongIntHashMap(HashConfig hashConfig, int expectedSize) { this.init(new HashConfigWrapper(hashConfig), expectedSize); } static class Support { static interface LongHash extends Hash { long freeValue(); boolean supportRemoved(); long removedValue(); } static interface SeparateKVLongLHash extends LHash , KolobokeLongIntHashMap.Support.SeparateKVLongHash { } static interface SeparateKVLongHash extends KolobokeLongIntHashMap.Support.LongHash { @Nonnull long[] keys(); } } static final HashConfigWrapper DEFAULT_CONFIG_WRAPPER = new HashConfigWrapper(HashConfig.getDefault()); }