/
com/planet_ink/coffee_mud/Abilities/Common/
com/planet_ink/coffee_mud/Abilities/Diseases/
com/planet_ink/coffee_mud/Abilities/Druid/
com/planet_ink/coffee_mud/Abilities/Fighter/
com/planet_ink/coffee_mud/Abilities/Languages/
com/planet_ink/coffee_mud/Abilities/Misc/
com/planet_ink/coffee_mud/Abilities/Prayers/
com/planet_ink/coffee_mud/Abilities/Properties/
com/planet_ink/coffee_mud/Abilities/Skills/
com/planet_ink/coffee_mud/Abilities/Songs/
com/planet_ink/coffee_mud/Abilities/Spells/
com/planet_ink/coffee_mud/Abilities/Thief/
com/planet_ink/coffee_mud/Abilities/Traps/
com/planet_ink/coffee_mud/Behaviors/
com/planet_ink/coffee_mud/CharClasses/interfaces/
com/planet_ink/coffee_mud/Commands/
com/planet_ink/coffee_mud/Commands/interfaces/
com/planet_ink/coffee_mud/Common/
com/planet_ink/coffee_mud/Common/interfaces/
com/planet_ink/coffee_mud/Exits/interfaces/
com/planet_ink/coffee_mud/Items/Armor/
com/planet_ink/coffee_mud/Items/Basic/
com/planet_ink/coffee_mud/Items/CompTech/
com/planet_ink/coffee_mud/Items/MiscMagic/
com/planet_ink/coffee_mud/Items/Weapons/
com/planet_ink/coffee_mud/Items/interfaces/
com/planet_ink/coffee_mud/Libraries/
com/planet_ink/coffee_mud/Libraries/interfaces/
com/planet_ink/coffee_mud/Locales/
com/planet_ink/coffee_mud/MOBS/
com/planet_ink/coffee_mud/Races/
com/planet_ink/coffee_mud/Races/interfaces/
com/planet_ink/coffee_mud/WebMacros/
com/planet_ink/coffee_mud/WebMacros/interfaces/
com/planet_ink/coffee_mud/core/
com/planet_ink/coffee_mud/core/collections/
com/planet_ink/coffee_mud/core/interfaces/
com/planet_ink/coffee_mud/core/intermud/
com/planet_ink/coffee_mud/core/intermud/i3/
com/planet_ink/coffee_web/server/
com/planet_ink/siplet/applet/
lib/
resources/factions/
resources/fakedb/
resources/progs/autoplayer/
resources/quests/holidays/
web/
web/admin.templates/
web/admin/grinder/
web/admin/images/
web/clan.templates/
web/pub.templates/
web/pub/images/mxp/
web/pub/sounds/
web/pub/textedit/
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();
	}
}