AbstractMap.java

package eu.javaexperience.collection.map;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;

import eu.javaexperience.reflect.Mirror;

public abstract class AbstractMap<K, V> implements Map<K, V>
{
	@Override
	public int size()
	{
		return keySet().size();
	}

	@Override
	public boolean isEmpty()
	{
		return 0 == size();
	}
	
	@Override
	public boolean containsValue(Object value)
	{
		for(Entry<K, V> kv:entrySet())
		{
			if(Mirror.equals(value, kv.getValue()))
			{
				return true;
			}
		}
	
		return false;
	}
	
	@Override
	public void putAll(Map<? extends K, ? extends V> m)
	{
		for(Entry<? extends K, ? extends V> kv:m.entrySet())
		{
			put(kv.getKey(), kv.getValue());
		}
	}
	
	@Override
	public Collection<V> values()
	{
		ArrayList<V> vals = new ArrayList<>();
		for(Entry<K, V> kv:entrySet())
		{
			vals.add(kv.getValue());
		}
		return vals;
	}

	@Override
	public Set<Entry<K, V>> entrySet()
	{
		HashSet<Entry<K, V>> ret = new HashSet<>();
		Set<K> keys = keySet();
		for(K s:keys)
		{
			ret.add(new KeyVal<>(s, this.get(s)));
		}
		
		return ret;
	}
}