package com.planet_ink.coffee_mud.core.collections;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
/**
* List wrapper for an existing List that turns it into a sorted one.
* @author Bo Zimmerman
*
* @param <T> the type?
*/
public class SortedListWrap<T extends Comparable<T>> implements List<T>
{
private final List<T> list;
public SortedListWrap(List<T> list)
{
this.list=list;
}
@SuppressWarnings({"unchecked", "rawtypes"})
protected int compareTo(T arg0, Object arg1)
{
if(arg0 != null)
return ((Comparable)arg0).compareTo(arg1);
return -1;
}
@Override
public synchronized boolean add(T arg0)
{
if(arg0==null)
return false;
if(list.size()==0)
return list.add(arg0);
int start=0;
int end=list.size()-1;
int comp=-1;
int mid=-1;
while(start<=end)
{
mid=(end+start)/2;
comp=compareTo(list.get(mid),arg0);
if(comp==0)
break;
else
if(comp>0)
end=mid-1;
else
start=mid+1;
}
if(comp==0)
list.add(mid,arg0);
else
if(comp>0)
{
while((mid>=0)&&(compareTo(list.get(mid),arg0)>0))
mid--;
if(mid>=list.size()-1)
list.add(arg0);
else
if(mid<0)
list.add(0,arg0);
else
list.add(mid+1,arg0);
}
else
{
while((mid<list.size())&&(compareTo(list.get(mid),arg0)<0))
mid++;
if(mid>=list.size())
list.add(arg0);
else
list.add(mid,arg0);
}
return true;
}
@Override
public void add(int arg0, T arg1)
{
throw new java.lang.UnsupportedOperationException();
}
@Override
public synchronized boolean addAll(Collection<? extends T> arg0)
{
boolean tf=true;
for(final T t : arg0)
tf=tf&&add(t);
return tf;
}
@Override
public boolean addAll(int arg0, Collection<? extends T> arg1)
{
throw new java.lang.UnsupportedOperationException();
}
@Override
public synchronized void clear()
{
list.clear();
}
@Override
public boolean contains(Object arg0)
{
return indexOf(arg0)>=0;
}
@Override
public boolean containsAll(Collection<?> arg0)
{
for(final Object o : arg0)
{
if(!contains(o))
return false;
}
return true;
}
@Override
public T get(int arg0)
{
return list.get(arg0);
}
@Override
public synchronized int indexOf(Object arg0)
{
if(list.size()==0)
return -1;
int start=0;
int end=list.size()-1;
while(start<=end)
{
final int mid=(end+start)/2;
final int comp=compareTo(list.get(mid),arg0);
if(comp==0)
return mid;
else
if(comp>0)
end=mid-1;
else
start=mid+1;
}
return -1;
}
@Override
public boolean isEmpty()
{
return list.isEmpty();
}
@Override
public Iterator<T> iterator()
{
return new ReadOnlyIterator<T>(list.iterator());
}
@Override
public synchronized int lastIndexOf(Object arg0)
{
int firstIndex=indexOf(arg0);
if(firstIndex<0)
return -1;
while((firstIndex<list.size())&&(compareTo(list.get(firstIndex),arg0)==0))
firstIndex++;
return firstIndex;
}
@Override
public ListIterator<T> listIterator()
{
return new ReadOnlyListIterator<T>(list.listIterator());
}
@Override
public ListIterator<T> listIterator(int arg0)
{
return new ReadOnlyListIterator<T>(list.listIterator(arg0));
}
@Override
public synchronized boolean remove(Object arg0)
{
final int index=indexOf(arg0);
if(index >= 0)
return remove(index)==arg0;
return false;
}
@Override
public synchronized T remove(int arg0)
{
return list.remove(arg0);
}
@Override
public synchronized boolean removeAll(Collection<?> arg0)
{
return list.removeAll(arg0);
}
@Override
public synchronized boolean retainAll(Collection<?> arg0)
{
return list.retainAll(arg0);
}
@Override
public T set(int arg0, T arg1)
{
throw new java.lang.UnsupportedOperationException();
}
@Override
public int size()
{
return list.size();
}
@Override
public List<T> subList(int arg0, int arg1)
{
return list.subList(arg0, arg1);
}
@Override
public Object[] toArray()
{
return list.toArray();
}
@SuppressWarnings("hiding")
@Override
public <T> T[] toArray(T[] arg0)
{
return list.toArray(arg0);
}
}