public boolean addAll(Collection<? extends E> c) {
        if (reverse) {
            if (c instanceof ReverseSet) {
                if (((ReverseSet<E>) c).reverse) {
                    return set.retainAll(((ReverseSet<E>) c).set);
                } else {
                    return set.removeAll(((ReverseSet<E>) c).set);
                }
            } else {
                return set.removeAll(c);
            }
        } else {
            if (c instanceof ReverseSet) {
                if (((ReverseSet<E>) c).reverse) {
                    reverse = true;
                    Set<E> old = set;
                    set = new HashSet<E>(((ReverseSet<E>) c).set);
                    set.removeAll(old);
                    return true;
                } else {
                    return set.addAll(((ReverseSet<E>) c).set);
                }
            } else {
                return set.addAll(c);
            }
        }
    }