package de.invesdwin.util.collections; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import javax.annotation.concurrent.NotThreadSafe; @NotThreadSafe public class ListSet<E> extends ADelegateList<E> implements Set<E> { private final Set<E> set = newSet(); @Override protected final List<E> newDelegate() { return newList(); } protected List<E> newList() { return new ArrayList<E>(); } protected Set<E> newSet() { return new HashSet<E>(); } @Override public void add(final int index, final E element) { if (this.set.add(element)) { getDelegate().add(index, element); } } @Override public boolean add(final E o) { if (this.set.add(o)) { return this.getDelegate().add(o); } else { return false; } } @Override public boolean addAll(final Collection<? extends E> c) { boolean changed = false; final Iterator<? extends E> i = c.iterator(); while (i.hasNext()) { final E element = i.next(); if (this.add(element)) { changed = true; } } return changed; } @Override public boolean addAll(final int index, final Collection<? extends E> c) { boolean changed = false; int insertIndex = index; final Iterator<? extends E> i = c.iterator(); while (i.hasNext()) { final E element = i.next(); if (this.set.add(element)) { this.getDelegate().add(insertIndex++, element); changed = true; } } return changed; } @Override public void clear() { this.set.clear(); this.getDelegate().clear(); } @Override public boolean contains(final Object o) { return this.set.contains(o); } @Override public boolean containsAll(final Collection<?> c) { return this.set.containsAll(c); } @Override public boolean isEmpty() { return this.set.isEmpty(); } /* * (non-Javadoc) * * @see java.util.List#remove(int) */ @Override public E remove(final int index) { final E element = this.getDelegate().remove(index); if (element != null) { this.set.remove(element); } return element; } @Override public boolean remove(final Object o) { if (this.set.remove(o)) { this.getDelegate().remove(o); return true; } else { return false; } } @Override public boolean removeAll(final Collection<?> c) { if (this.set.removeAll(c)) { this.getDelegate().removeAll(c); return true; } else { return false; } } @Override public boolean retainAll(final Collection<?> c) { if (this.set.retainAll(c)) { this.getDelegate().retainAll(c); return true; } else { return false; } } @Override public E set(final int index, final E element) { final E removed = this.getDelegate().set(index, element); if (removed != element) { this.set.remove(removed); this.set.add(element); } return removed; } }