package com.planet_ink.coffee_mud.core.collections;
import java.util.Collection;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import com.planet_ink.coffee_mud.core.interfaces.CMObject;
public class SortedStrSVector<T> extends SVector<T> implements SearchIDList<T>
{
private static final long serialVersionUID = 6687178785122361992L;
private final Str<T> stringer;
public static interface Str<T>
{
public String toString(T t);
}
public SortedStrSVector(Str<T> stringer, int size)
{
super(size);
this.stringer = stringer;
}
public SortedStrSVector(Str<T> stringer)
{
super();
this.stringer = stringer;
}
private int compareTo(T arg0, String arg1)
{
return stringer.toString(arg0).compareToIgnoreCase(arg1);
}
private int compareTo(T arg0, T arg1)
{
return stringer.toString(arg0).compareToIgnoreCase(stringer.toString(arg1));
}
@Override
public synchronized boolean add(T arg0)
{
if (arg0 == null)
return false;
if (size() == 0)
return super.add(arg0);
int start = 0;
int end = size() - 1;
int comp = -1;
int mid = -1;
while (start <= end)
{
mid = (end + start) / 2;
comp = compareTo(super.get(mid), arg0);
if (comp == 0)
break;
else if (comp > 0)
end = mid - 1;
else
start = mid + 1;
}
if (comp == 0)
super.add(mid, arg0);
else
if (comp > 0)
{
while ((mid >= 0) && (compareTo(super.get(mid), arg0) > 0))
mid--;
if (mid >= size() - 1)
super.add(arg0);
else if (mid < 0)
super.add(0, arg0);
else
super.add(mid + 1, arg0);
}
else
{
while ((mid < size()) && (compareTo(super.get(mid), arg0) < 0))
mid++;
if (mid >= size())
super.add(arg0);
else
super.add(mid, arg0);
}
return true;
}
@Override
public void add(int arg0, T arg1)
{
throw new java.lang.UnsupportedOperationException();
}
@Override
public boolean addAll(int arg0, Collection<? extends T> arg1)
{
throw new java.lang.UnsupportedOperationException();
}
@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 super.get(arg0);
}
public synchronized void reSort(T arg0)
{
if (super.contains(arg0))
{
super.remove(arg0);
this.add(arg0);
}
}
@SuppressWarnings("unchecked")
@Override
public synchronized int indexOf(Object arg0)
{
if (arg0 == null)
return -1;
if (size() == 0)
return -1;
int start = 0;
int end = size() - 1;
if (arg0 instanceof CMObject)
{
while (start <= end)
{
final int mid = (end + start) / 2;
final int comp = compareTo(super.get(mid), (T) arg0);
if (comp == 0)
return mid;
else if (comp > 0)
end = mid - 1;
else
start = mid + 1;
}
}
else if (arg0 instanceof String)
{
while (start <= end)
{
final int mid = (end + start) / 2;
final int comp = compareTo(super.get(mid), (String) arg0);
if (comp == 0)
return mid;
else if (comp > 0)
end = mid - 1;
else
start = mid + 1;
}
}
return -1;
}
@Override
public synchronized T find(String arg0)
{
if (arg0 == null)
return null;
if (size() == 0)
return null;
int start = 0;
int end = size() - 1;
while (start <= end)
{
final int mid = (end + start) / 2;
final int comp = compareTo(super.get(mid), arg0);
if (comp == 0)
return super.get(mid);
else if (comp > 0)
end = mid - 1;
else
start = mid + 1;
}
return null;
}
@Override
public synchronized T find(T arg0)
{
if (arg0 == null)
return null;
if (size() == 0)
return null;
int start = 0;
int end = size() - 1;
while (start <= end)
{
final int mid = (end + start) / 2;
final int comp = compareTo(super.get(mid), arg0);
if (comp == 0)
return super.get(mid);
else if (comp > 0)
end = mid - 1;
else
start = mid + 1;
}
return null;
}
@Override
public synchronized int lastIndexOf(Object arg0)
{
return indexOf(arg0); // only holds one-of-a-kind, so all is well!
}
@Override
public synchronized boolean remove(Object arg0)
{
final int index = indexOf(arg0);
if (index >= 0)
return remove(index) == arg0;
return false;
}
@Override
public T set(int arg0, T arg1)
{
throw new java.lang.UnsupportedOperationException();
}
}