package com.sleepycat.je.utilint; import java.util.HashSet; import java.util.Iterator; import java.util.NoSuchElementException; import java.util.Set; import de.ovgu.cide.jakutil.*; /** * 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; 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); } } 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); } } }