package java.util;

public abstract class AbstractMap
    implements Map
{

    protected AbstractMap()
    {
    }

    public int size()
    {
        return entrySet().size();
    }

    public boolean isEmpty()
    {
        return size() == 0;
    }

    public boolean containsValue(Object value)
    {
        Iterator it = entrySet().iterator();
        while (it.hasNext())
        {
            Map.Entry v = (Map.Entry)it.next();
            if (value == null)
            {
                if (v.getValue() == null)
                {
                    return true;
                }
            }
            else
            {
                if (value.equals(v.getValue()))
                {
                    return true;
                }
            }
        }
        return false;
    }

    public boolean containsKey(Object key)
        throws ClassCastException, NullPointerException
    {
        Iterator it = entrySet().iterator();
        while (it.hasNext())
        {
            Map.Entry v = (Map.Entry)it.next();
            if (key == null)
            {
                if (v.getKey() == null)
                {
                    return true;
                }
            }
            else
            {
                if (key.equals(v.getKey()))
                {
                    return true;
                }
            }
        }
        return false;
    }

    public Object get(Object key)
        throws ClassCastException, NullPointerException
    {
        Iterator it = entrySet().iterator();
        while (it.hasNext())
        {
            Map.Entry v = (Map.Entry)it.next();
            if (key == null)
            {
                if (v.getKey() == null)
                {
                    return v.getValue();
                }
            }
            else
            {
                if (key.equals(v.getKey()))
                {
                    return v.getValue();
                }
            }
        }
        return null;
    }

    public Object put(Object key, Object value)
        throws RuntimeException
    {
        throw new RuntimeException();
    }

    public Object remove(Object key)
    {
        Iterator it = entrySet().iterator();
        Object o = null;
        while (it.hasNext())
        {
            Map.Entry v = (Map.Entry)it.next();
            if (key == null)
            {
                if (v.getKey() == null)
                {
                    o = v.getValue();
                    it.remove();
                    return o;
                }
            }
            else
            {
                if (key.equals(v.getKey()))
                {
                    o = v.getValue();
                    it.remove();
                    return o;
                }
            }
        }
        return null;
    }

    public void putAll(Map t)
    {
        Iterator it = t.entrySet().iterator();
        while (it.hasNext())
        {
            Map.Entry v = (Map.Entry)it.next();
            put(v.getKey(), v.getValue());
        }
    }

    public void clear()
    {
        entrySet().clear();
    }

    public Set keySet()
    {
        throw new RuntimeException("no keySet in AbstractMap()");
    }

    public Collection values()
    {
        throw new RuntimeException("no values in AbstractMap()");
    }

    public abstract Set entrySet();

    public boolean equals(Object o)
    {
        throw new RuntimeException("no equals in AbstractMap()");
    }

    public int hashCode()
    {
        throw new RuntimeException("no hashCode in AbstractMap()");
    }

    public String toString()
    {
        throw new RuntimeException("no toString in AbstractMap()");
    }


}
