package com.revolsys.collection.map;
import java.util.AbstractCollection;
import java.util.AbstractSet;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public interface MapDefault<K, V> extends Map<K, V> {
@Override
default void clear() {
final Set<java.util.Map.Entry<K, V>> entrySet = entrySet();
entrySet.clear();
}
@Override
default boolean containsKey(final Object key) {
final Set<Entry<K, V>> entrySet = entrySet();
if (key == null) {
for (final Entry<K, V> entry : entrySet) {
final K entryKey = entry.getKey();
if (entryKey == null) {
return true;
}
}
} else {
for (final Entry<K, V> entry : entrySet) {
final K entryKey = entry.getKey();
if (key.equals(entryKey)) {
return true;
}
}
}
return false;
}
@Override
default boolean containsValue(final Object value) {
final Set<Entry<K, V>> entrySet = entrySet();
if (value == null) {
for (final Entry<K, V> entry : entrySet) {
final V entryValue = entry.getValue();
if (entryValue == null) {
return true;
}
}
} else {
for (final Entry<K, V> entry : entrySet) {
final V entryValue = entry.getValue();
if (value.equals(entryValue)) {
return true;
}
}
}
return false;
}
@Override
default V get(final Object key) {
final Set<Entry<K, V>> entrySet = entrySet();
if (key == null) {
for (final Entry<K, V> entry : entrySet) {
final K entryKey = entry.getKey();
if (entryKey == null) {
final V entryValue = entry.getValue();
return entryValue;
}
}
} else {
for (final Entry<K, V> entry : entrySet) {
final K entryKey = entry.getKey();
if (key.equals(entryKey)) {
final V entryValue = entry.getValue();
return entryValue;
}
}
}
return null;
}
@Override
default boolean isEmpty() {
return size() == 0;
}
@Override
default Set<K> keySet() {
return new AbstractSet<K>() {
@Override
public void clear() {
MapDefault.this.clear();
}
@Override
public boolean contains(final Object k) {
return MapDefault.this.containsKey(k);
}
@Override
public boolean isEmpty() {
return MapDefault.this.isEmpty();
}
@Override
public Iterator<K> iterator() {
return new Iterator<K>() {
private final Iterator<Entry<K, V>> interator = entrySet().iterator();
@Override
public boolean hasNext() {
return interator.hasNext();
}
@Override
public K next() {
return interator.next().getKey();
}
@Override
public void remove() {
interator.remove();
}
};
}
@Override
public int size() {
return MapDefault.this.size();
}
};
}
default boolean mapEquals(final Map<?, ?> map) {
if (map == this) {
return true;
} else if (map.size() != size()) {
return false;
} else {
try {
final Set<Entry<K, V>> entrySet = entrySet();
for (final Entry<K, V> entry : entrySet) {
final K key = entry.getKey();
final V value = entry.getValue();
if (value == null) {
if (!(map.get(key) == null && map.containsKey(key))) {
return false;
}
} else {
if (!value.equals(map.get(key))) {
return false;
}
}
}
} catch (final ClassCastException unused) {
return false;
} catch (final NullPointerException unused) {
return false;
}
return true;
}
}
default int mapHashCode() {
int hash = 0;
final Set<Entry<K, V>> entrySet = entrySet();
for (final Entry<K, V> entry : entrySet) {
hash += entry.hashCode();
}
return hash;
}
default String mapToString() {
final Set<java.util.Map.Entry<K, V>> entrySet = entrySet();
final Iterator<Entry<K, V>> i = entrySet.iterator();
if (entrySet.size() == 0) {
return "{}";
} else {
final StringBuilder string = new StringBuilder();
string.append('{');
boolean first = true;
for (final Entry<K, V> entry : entrySet) {
if (first) {
first = false;
} else {
string.append(',').append(' ');
}
final K key = entry.getKey();
final V value = entry.getValue();
string.append(key == this ? "(this Map)" : key);
string.append('=');
string.append(value == this ? "(this Map)" : value);
if (!i.hasNext()) {
}
string.append(',').append(' ');
}
return string.append('}').toString();
}
}
@Override
default V put(final K key, final V value) {
throw new UnsupportedOperationException();
}
@Override
default void putAll(final Map<? extends K, ? extends V> values) {
for (final Entry<? extends K, ? extends V> entry : values.entrySet()) {
final K key = entry.getKey();
final V value = entry.getValue();
put(key, value);
}
}
@Override
default V remove(final Object key) {
final Set<Map.Entry<K, V>> entrySet = entrySet();
final Iterator<Entry<K, V>> i = entrySet.iterator();
Entry<K, V> correctEntry = null;
if (key == null) {
while (correctEntry == null && i.hasNext()) {
final Entry<K, V> e = i.next();
if (e.getKey() == null) {
correctEntry = e;
}
}
} else {
while (correctEntry == null && i.hasNext()) {
final Entry<K, V> e = i.next();
if (key.equals(e.getKey())) {
correctEntry = e;
}
}
}
V oldValue = null;
if (correctEntry != null) {
oldValue = correctEntry.getValue();
i.remove();
}
return oldValue;
}
@Override
default int size() {
return entrySet().size();
}
@Override
default Collection<V> values() {
return new AbstractCollection<V>() {
@Override
public void clear() {
MapDefault.this.clear();
}
@Override
public boolean contains(final Object v) {
return MapDefault.this.containsValue(v);
}
@Override
public boolean isEmpty() {
return MapDefault.this.isEmpty();
}
@Override
public Iterator<V> iterator() {
return new Iterator<V>() {
private final Iterator<Entry<K, V>> iterator = entrySet().iterator();
@Override
public boolean hasNext() {
return iterator.hasNext();
}
@Override
public V next() {
return iterator.next().getValue();
}
@Override
public void remove() {
iterator.remove();
}
};
}
@Override
public int size() {
return MapDefault.this.size();
}
};
}
}