/**
*
*/
package cz.cuni.mff.peckam.java.origamist.utils;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
/**
* A linked list that can be alternatively viewed as a list of another type elements.
*
* Due to Java generics limitations, this list cannot perform type checking for both types, so most
* {@link ClassCastException}s will occur on get operations.
*
* @author Martin Pecka
*
* @param E The primary type of list elements.
* @param I The secondary type of list elements.
*/
public class LinkedListWithAdditionalBounds<E, I> extends LinkedList<E> implements ListWithAdditionalBounds<E, I>
{
/** The alternative view of this list. */
private transient List<I> altView = null;
/** */
private static final long serialVersionUID = 211660684866191895L;
@Override
public List<I> getAltView()
{
if (altView == null) {
altView = createAltView();
}
return altView;
}
/**
* @return The new alternative view of this list.
*/
protected List<I> createAltView()
{
return new List<I>() {
@Override
public int size()
{
return LinkedListWithAdditionalBounds.this.size();
}
@Override
public boolean isEmpty()
{
return LinkedListWithAdditionalBounds.this.isEmpty();
}
@Override
public boolean contains(Object o)
{
return LinkedListWithAdditionalBounds.this.contains(o);
}
@Override
public Iterator<I> iterator()
{
final Iterator<E> it = LinkedListWithAdditionalBounds.this.iterator();
return new Iterator<I>() {
@Override
public boolean hasNext()
{
return it.hasNext();
}
@SuppressWarnings("unchecked")
@Override
public I next()
{
return (I) it.next();
}
@Override
public void remove()
{
it.remove();
}
};
}
@Override
public Object[] toArray()
{
return LinkedListWithAdditionalBounds.this.toArray();
}
@Override
public <T> T[] toArray(T[] a)
{
return LinkedListWithAdditionalBounds.this.toArray(a);
}
@SuppressWarnings("unchecked")
@Override
public boolean add(I e)
{
return LinkedListWithAdditionalBounds.this.add((E) e);
}
@Override
public boolean remove(Object o)
{
return LinkedListWithAdditionalBounds.this.remove(o);
}
@Override
public boolean containsAll(Collection<?> c)
{
return LinkedListWithAdditionalBounds.this.containsAll(c);
}
@Override
public boolean addAll(Collection<? extends I> c)
{
int oldSize = size();
for (I i : c)
add(i);
return size() != oldSize;
}
@SuppressWarnings("unchecked")
@Override
public boolean addAll(int index, Collection<? extends I> c)
{
if (c.size() == 0)
return false;
int i = index;
for (Iterator<? extends I> it = c.iterator(); it.hasNext();) {
E e = (E) it.next();
LinkedListWithAdditionalBounds.this.add(i, e);
i++;
}
return true;
}
@Override
public boolean removeAll(Collection<?> c)
{
return LinkedListWithAdditionalBounds.this.removeAll(c);
}
@Override
public boolean retainAll(Collection<?> c)
{
return LinkedListWithAdditionalBounds.this.retainAll(c);
}
@Override
public void clear()
{
LinkedListWithAdditionalBounds.this.clear();
}
@SuppressWarnings("unchecked")
@Override
public I get(int index)
{
return (I) LinkedListWithAdditionalBounds.this.get(index);
}
@SuppressWarnings("unchecked")
@Override
public I set(int index, I element)
{
return (I) LinkedListWithAdditionalBounds.this.set(index, (E) element);
}
@SuppressWarnings("unchecked")
@Override
public void add(int index, I element)
{
LinkedListWithAdditionalBounds.this.add(index, (E) element);
}
@SuppressWarnings("unchecked")
@Override
public I remove(int index)
{
return (I) LinkedListWithAdditionalBounds.this.remove(index);
}
@Override
public int indexOf(Object o)
{
return LinkedListWithAdditionalBounds.this.indexOf(o);
}
@Override
public int lastIndexOf(Object o)
{
return LinkedListWithAdditionalBounds.this.lastIndexOf(o);
}
@Override
public ListIterator<I> listIterator()
{
final ListIterator<E> listIt = LinkedListWithAdditionalBounds.this.listIterator();
return new ListIterator<I>() {
@Override
public boolean hasNext()
{
return listIt.hasNext();
}
@SuppressWarnings("unchecked")
@Override
public I next()
{
return (I) listIt.next();
}
@Override
public boolean hasPrevious()
{
return listIt.hasPrevious();
}
@SuppressWarnings("unchecked")
@Override
public I previous()
{
return (I) listIt.previous();
}
@Override
public int nextIndex()
{
return listIt.nextIndex();
}
@Override
public int previousIndex()
{
return listIt.previousIndex();
}
@Override
public void remove()
{
listIt.remove();
}
@SuppressWarnings("unchecked")
@Override
public void set(I e)
{
listIt.set((E) e);
}
@SuppressWarnings("unchecked")
@Override
public void add(I e)
{
listIt.add((E) e);
}
};
}
@Override
public ListIterator<I> listIterator(int index)
{
ListIterator<I> it = listIterator();
for (int i = 0; i < index; i++)
it.next();
return it;
}
/**
* Not supported.
*/
@Override
public List<I> subList(int fromIndex, int toIndex)
{
throw new UnsupportedOperationException(); // TODO implement
}
};
}
}