package com.javarush.task.task37.task3707;


import java.io.Serializable;
import java.util.*;

/**
 * Created by misha on 10/1/2017.
 */
public class AmigoSet<E> extends AbstractSet<E> implements Serializable,Cloneable,Set<E>{
    private transient HashMap<E,Object> map;
    private static final Object PRESENT = new Object();

    public AmigoSet() {
        map = new HashMap<>();
    }

    public AmigoSet(Collection<? extends E> collection){
        int capacity = Math.max(16, (int)(collection.size()/0.75f +1));
        map = new HashMap<E, Object>(capacity);
        addAll(collection);
    }

    @Override
    public Object clone() {
        try {
            AmigoSet copy = (AmigoSet)super.clone();
            copy.map = (HashMap) map.clone();
            return copy;
        }
        catch (Exception e) {
            throw new InternalError();
        }
    }

    @Override
    public boolean add(E e) {
        return map.put(e, PRESENT) == null;
    }


    @Override
    public boolean remove(Object o) {
        return  map.remove(o)==PRESENT;
    }

    @Override
    public void clear() {
        map.clear();
    }


    @Override
    public int size() {
        return map.size();
    }

    @Override

    public boolean isEmpty() {
        if (map.isEmpty()) return true;
        else
        return false;

    }

    @Override

    public boolean contains(Object o) {
        if (map.containsValue(o)){return true;}
        return false;

    }

    @Override

    public Iterator iterator() {

        return map.keySet().iterator();

    }
}