package com.planet_ink.coffee_mud.core.collections; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.ListIterator; import com.planet_ink.coffee_mud.core.interfaces.CMObject; public class CMUniqSortSVec<T extends CMObject> extends SVector<T> implements SearchIDList<T> { private static final long serialVersionUID = 6687178785122361992L; private boolean readOnly = false; public CMUniqSortSVec(int size) { super(size); } public CMUniqSortSVec() { } protected int compareTo(CMObject arg0, String arg1) { return arg0.ID().compareToIgnoreCase(arg1); } protected int compareTo(CMObject arg0, CMObject arg1) { return arg0.ID().compareToIgnoreCase(arg1.ID()); } @Override public synchronized boolean add(T arg0) { if((arg0==null)||(readOnly)) 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) return false; 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); } @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),(CMObject)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(CMObject 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)&&(!readOnly)) return remove(index)==arg0; return false; } @Override public T set(int arg0, T arg1) { throw new java.lang.UnsupportedOperationException(); } public void setReadOnly(boolean trueFalse) { readOnly = trueFalse; } }