@Override public HashEdgeMap<T> remove(int key) { if (get(key) == null) { return this; } HashEdgeMap<T> result = new HashEdgeMap<T>(this, values.length); int bucket = result.bucket(key); result.keys.set(bucket, 0); result.values[bucket] = null; return result; }
@Override public boolean isEmpty() { return size() == 0; }
@Override public Set<Map.Entry<Integer, T>> entrySet() { return toMap().entrySet(); } }
@Override public AbstractEdgeMap<T> clear() { if (isEmpty()) { return this; } return new EmptyEdgeMap<T>(minIndex, maxIndex); }
@Override public T get(int key) { int bucket = bucket(key); // Read the value first T value = values[bucket]; if (value == null || keys.get(bucket) != key) { return null; } return value; }
@Override public boolean containsKey(int key) { return get(key) != null; }
@Override public AbstractEdgeMap<T> put(int key, T value) { if (key < minIndex || key > maxIndex) { return this; } if (key == this.key || this.value == null) { return new SingletonEdgeMap<T>(minIndex, maxIndex, key, value); } else if (value != null) { AbstractEdgeMap<T> result = new HashEdgeMap<T>(minIndex, maxIndex); result = result.put(this.key, this.value); result = result.put(key, value); return result; } else { return this; } }
@Override public Map<Integer, T> toMap() { if (isEmpty()) { return Collections.emptyMap(); } synchronized (this) { Map<Integer, T> result = new TreeMap<Integer, T>(); for (int i = 0; i < values.length; i++) { int key = keys.get(i); T value = values[i]; if (value != null) { result.put(key, value); } } return result; } }
@SuppressWarnings("unchecked") private HashEdgeMap(@NotNull HashEdgeMap<T> map, int maxSparseSize) { super(map.minIndex, map.maxIndex); synchronized (map) { if (maxSparseSize < map.values.length) { throw new IllegalArgumentException(); } keys = new AtomicIntegerArray(maxSparseSize); values = (T[])new Object[maxSparseSize]; for (int i = 0; i < map.values.length; i++) { int key = map.keys.get(i); T value = map.values[i]; if (value != null) { int bucket = bucket(key); keys.set(bucket, key); values[bucket] = value; } } } }