Instead of doing two instanceofs on every compare, just wrap bare keys in a

fake Entry implementation. This also avoids breakage if a DSet entry's key
itself implements DSet.Entry (which just happened for the first time in Narya
history).


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4673 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
Michael Bayne
2007-04-23 18:59:29 +00:00
parent beace3839b
commit f8ef4aeebc
@@ -156,7 +156,7 @@ public class DSet<E extends DSet.Entry>
public E get (Comparable key)
{
// determine where we'll be adding the new element
int eidx = ArrayUtil.binarySearch(_entries, 0, _size, key, ENTRY_COMP);
int eidx = ArrayUtil.binarySearch(_entries, 0, _size, new KeyWrapper(key), ENTRY_COMP);
return (eidx < 0) ? null : _entries[eidx];
}
@@ -321,7 +321,7 @@ public class DSet<E extends DSet.Entry>
}
// look up this entry's position in our set
int eidx = ArrayUtil.binarySearch(_entries, 0, _size, key, ENTRY_COMP);
int eidx = ArrayUtil.binarySearch(_entries, 0, _size, new KeyWrapper(key), ENTRY_COMP);
// if we found it, remove it
if (eidx >= 0) {
@@ -445,6 +445,17 @@ public class DSet<E extends DSet.Entry>
}
}
protected static class KeyWrapper implements DSet.Entry
{
public KeyWrapper (Comparable key) {
_key = key;
}
public Comparable getKey () {
return _key;
}
protected Comparable _key;
}
/** The entries of the set (in a sparse array). */
@SuppressWarnings("unchecked") protected E[] _entries = (E[])new Entry[INITIAL_CAPACITY];
@@ -458,11 +469,9 @@ public class DSet<E extends DSet.Entry>
protected static final int INITIAL_CAPACITY = 2;
/** Used for lookups and to keep the set contents sorted on insertions. */
protected static Comparator<Object> ENTRY_COMP = new Comparator<Object>() {
public int compare (Object o1, Object o2) {
Comparable c1 = (o1 instanceof Entry) ? ((Entry)o1).getKey() : (Comparable)o1;
Comparable c2 = (o2 instanceof Entry) ? ((Entry)o2).getKey() : (Comparable)o2;
@SuppressWarnings("unchecked") int val = c1.compareTo(c2);
protected static Comparator<Entry> ENTRY_COMP = new Comparator<Entry>() {
public int compare (Entry e1, Entry e2) {
@SuppressWarnings("unchecked") int val = e1.getKey().compareTo(e2.getKey());
return val;
}
};