/*-
* See the file LICENSE for redistribution information.
*
* Copyright (c) 2002-2006
* Sleepycat Software. All rights reserved.
*
* $Id: TinyHashSet.java,v 1.1 2006/05/06 09:00:28 ckaestne Exp $
*/
package com.sleepycat.je.utilint;
import java.util.HashSet;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.Set;
/**
* TinyHashSet is used to optimize (for speed, not space) the case where a
* HashSet generally holds a single element. This saves us the cost of
* creating the HashSet and related elements as well as call Object.hashCode().
*
* If single != null, it's the only element in the TinyHashSet. If set != null
* then there are multiple elements in the TinyHashSet. It should never be
* true that (single != null) && (set != null).
*/
public class TinyHashSet {
private Set set;
private Object single;
/*
* Will return a fuzzy value if the not under synchronized control.
*/
public int size() {
if (single != null) {
return 1;
} else if (set != null) {
return set.size();
} else {
return 0;
}
}
public boolean remove(Object o) {
assert (single == null) || (set == null);
if (single != null) {
if (single == o ||
single.equals(o)) {
single = null;
return true;
} else {
return false;
}
} else if (set != null) {
return set.remove(o);
} else {
return false;
}
}
public boolean add(Object o) {
assert (single == null) || (set == null);
if (set != null) {
return set.add(o);
} else if (single == null) {
single = o;
return true;
} else {
set = new HashSet();
set.add(single);
single = null;
return set.add(o);
}
}
public Set copy() {
assert (single == null) || (set == null);
if (set != null) {
return new HashSet(set);
} else {
Set ret = new HashSet();
if (single != null) {
ret.add(single);
}
return ret;
}
}
public Iterator iterator() {
assert (single == null) || (set == null);
if (set != null) {
return set.iterator();
} else {
return new SingleElementIterator(single, this);
}
}
/*
* Iterator that is used to just return one element.
*/
public static class SingleElementIterator implements Iterator {
Object theObject;
TinyHashSet theSet;
boolean returnedTheObject = false;
SingleElementIterator(Object o, TinyHashSet theSet) {
theObject = o;
this.theSet = theSet;
returnedTheObject = (o == null);
}
public boolean hasNext() {
return !returnedTheObject;
}
public Object next() {
if (returnedTheObject) {
throw new NoSuchElementException();
}
returnedTheObject = true;
return theObject;
}
public void remove() {
if (theObject == null ||
!returnedTheObject) {
throw new IllegalStateException();
}
theSet.remove(theObject);
}
}
}