package uk.ac.manchester.cs.chainsaw;

import java.io.Serializable;
import java.util.BitSet;
import java.util.stream.IntStream;

/**
 * @author ignazio
 */
public class LocalFastSet implements FastSet, Serializable {

    private final BitSet pos = new BitSet();

    private static int asPositive(int p) {
        return p >= 0 ? 2 * p : 1 - 2 * p;
    }

    @Override
    public int[] toIntArray() {
        throw new UnsupportedOperationException();
    }

    @Override
    public int size() {
        throw new UnsupportedOperationException();
    }

    @Override
    public void removeAt(int o) {
        throw new UnsupportedOperationException();
    }

    @Override
    public void removeAllValues(int... values) {
        throw new UnsupportedOperationException();
    }

    @Override
    public void removeAll(int i, int end) {
        throw new UnsupportedOperationException();
    }

    @Override
    public void remove(int o) {
        throw new UnsupportedOperationException();
    }

    @Override
    public boolean isEmpty() {
        throw new UnsupportedOperationException();
    }

    @Override
    public boolean intersect(FastSet f) {
        throw new UnsupportedOperationException();
    }

    @Override
    public int get(int i) {
        throw new UnsupportedOperationException();
    }

    @Override
    public boolean containsAny(FastSet c) {
        throw new UnsupportedOperationException();
    }

    @Override
    public boolean containsAll(FastSet c) {
        throw new UnsupportedOperationException();
    }

    @Override
    public boolean contains(int o) {
        return pos.get(asPositive(o));
    }

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

    @Override
    public void addAll(FastSet c) {
        throw new UnsupportedOperationException();
    }

    @Override
    public boolean add(int e) {
        int asPositive = asPositive(e);
        if (!pos.get(asPositive)) {
            pos.set(asPositive);
            return true;
        }
        return false;
    }

    @Override
    public void completeSet(int value) {
        IntStream.range(0, value + 1).forEach(pos::set);
    }
}
