-// Copyright 2003 Adam Megacz, see the COPYING file for licensing [GPL]
+// Copyright (C) 2003 Adam Megacz <adam@xwt.org> all rights reserved.
+//
+// You may modify, copy, and redistribute this code under the terms of
+// the GNU Library Public License version 2.1, with the exception of
+// the portion of clause 6a after the semicolon (aka the "obnoxious
+// relink clause")
+
package org.xwt.util;
import java.util.*;
* An unsynchronized Vector implementation; same semantics as
* java.util.Vector. Useful for JDK1.1 platforms that don't have
* java.util.ArrayList.
+ *
+ * May contain nulls.
+ *
* @see java.util.Vector
*/
public final class Vec implements Serializable {
public int indexOf(Object o) {
for(int i=0; i<size; i++)
- if (store[i] == o) return i;
+ if (o == null ? store[i] == null : store[i].equals(o)) return i;
+
return -1;
}
}
public void removeElement(Object o) {
- for(int i=0; i<size; i++)
- if (store[i] == o) {
- removeElementAt(i);
- return;
- }
+ int idx = indexOf(o);
+ if (idx != -1) removeElementAt(idx);
}
public void insertElementAt(Object o, int at) {
store[at] = o;
size++;
}
-
+
public interface CompareFunc {
public int compare(Object a, Object b);
}
-
+
public void sort(CompareFunc c) {
- sort(c,0,size-1);
+ sort(this, null, c, 0, size-1);
}
-
- private final void swap(int a, int b) {
- if(a != b) {
- Object tmp = store[a];
- store[a] = store[b];
- store[b] = tmp;
- }
+
+ public static void sort(Vec a, Vec b, CompareFunc c) {
+ if (b != null && a.size != b.size) throw new IllegalArgumentException("Vec a and b must be of equal size");
+ sort(a, b, c, 0, a.size-1);
}
-
- private void sort(CompareFunc c, int start, int end) {
- Object tmp;
+
+ private static final void sort(Vec a, Vec b, CompareFunc c, int start, int end) {
+ Object tmpa, tmpb = null;
if(start >= end) return;
if(end-start <= 6) {
for(int i=start+1;i<=end;i++) {
- tmp = store[i];
+ tmpa = a.store[i];
+ if (b != null) tmpb = b.store[i];
int j;
for(j=i-1;j>=start;j--) {
- if(c.compare(store[j],tmp) <= 0) break;
- store[j+1] = store[j];
+ if(c.compare(a.store[j],tmpa) <= 0) break;
+ a.store[j+1] = a.store[j];
+ if (b != null) b.store[j+1] = b.store[j];
}
- store[j+1] = tmp;
+ a.store[j+1] = tmpa;
+ if (b != null) b.store[j+1] = tmpb;
}
return;
}
- Object pivot = store[end];
+
+ Object pivot = a.store[end];
int lo = start - 1;
int hi = end;
+
do {
- while(c.compare(store[++lo],pivot) < 0) { }
- while((hi > lo) && c.compare(store[--hi],pivot) > 0) { }
- swap(lo,hi);
+ while(c.compare(a.store[++lo],pivot) < 0) { }
+ while((hi > lo) && c.compare(a.store[--hi],pivot) > 0) { }
+ swap(a, lo,hi);
+ if (b != null) swap(b, lo,hi);
} while(lo < hi);
- swap(lo,end);
- sort(c,start,lo-1);
- sort(c,lo+1,end);
+
+ swap(a, lo,end);
+ if (b != null) swap(b, lo,end);
+
+ sort(a, b, c, start, lo-1);
+ sort(a, b, c, lo+1, end);
+ }
+
+ private static final void swap(Vec vec, int a, int b) {
+ if(a != b) {
+ Object tmp = vec.store[a];
+ vec.store[a] = vec.store[b];
+ vec.store[b] = tmp;
+ }
}
}