parent
							
								
									15041d8ed2
								
							
						
					
					
						commit
						a4c485a7de
					
				@ -1,153 +0,0 @@ | 
				
			|||||||
package mightypork.gamecore.eventbus; | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import java.util.Collection; | 
					 | 
				
			||||||
import java.util.HashSet; | 
					 | 
				
			||||||
import java.util.LinkedList; | 
					 | 
				
			||||||
import java.util.List; | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/** | 
					 | 
				
			||||||
 * HashSet that buffers "add" and "remove" calls and performs them all at once | 
					 | 
				
			||||||
 * when a flush() method is called. | 
					 | 
				
			||||||
 *  | 
					 | 
				
			||||||
 * @author MightyPork | 
					 | 
				
			||||||
 * @param <E> element type | 
					 | 
				
			||||||
 */ | 
					 | 
				
			||||||
public class BufferedHashSet<E> extends HashSet<E> { | 
					 | 
				
			||||||
	 | 
					 | 
				
			||||||
	private final List<E> toAdd = new LinkedList<>(); | 
					 | 
				
			||||||
	private final List<Object> toRemove = new LinkedList<>(); | 
					 | 
				
			||||||
	private boolean buffering = false; | 
					 | 
				
			||||||
	 | 
					 | 
				
			||||||
	 | 
					 | 
				
			||||||
	/** | 
					 | 
				
			||||||
	 * make empty | 
					 | 
				
			||||||
	 */ | 
					 | 
				
			||||||
	public BufferedHashSet() | 
					 | 
				
			||||||
	{ | 
					 | 
				
			||||||
		super(); | 
					 | 
				
			||||||
	} | 
					 | 
				
			||||||
	 | 
					 | 
				
			||||||
	 | 
					 | 
				
			||||||
	/** | 
					 | 
				
			||||||
	 * make from elements of a collection | 
					 | 
				
			||||||
	 *  | 
					 | 
				
			||||||
	 * @param c | 
					 | 
				
			||||||
	 */ | 
					 | 
				
			||||||
	public BufferedHashSet(Collection<? extends E> c) | 
					 | 
				
			||||||
	{ | 
					 | 
				
			||||||
		super(c); | 
					 | 
				
			||||||
	} | 
					 | 
				
			||||||
	 | 
					 | 
				
			||||||
	 | 
					 | 
				
			||||||
	/** | 
					 | 
				
			||||||
	 * make new | 
					 | 
				
			||||||
	 *  | 
					 | 
				
			||||||
	 * @param initialCapacity | 
					 | 
				
			||||||
	 * @param loadFactor | 
					 | 
				
			||||||
	 */ | 
					 | 
				
			||||||
	public BufferedHashSet(int initialCapacity, float loadFactor) | 
					 | 
				
			||||||
	{ | 
					 | 
				
			||||||
		super(initialCapacity, loadFactor); | 
					 | 
				
			||||||
	} | 
					 | 
				
			||||||
	 | 
					 | 
				
			||||||
	 | 
					 | 
				
			||||||
	/** | 
					 | 
				
			||||||
	 * make new | 
					 | 
				
			||||||
	 *  | 
					 | 
				
			||||||
	 * @param initialCapacity | 
					 | 
				
			||||||
	 */ | 
					 | 
				
			||||||
	public BufferedHashSet(int initialCapacity) | 
					 | 
				
			||||||
	{ | 
					 | 
				
			||||||
		super(initialCapacity); | 
					 | 
				
			||||||
	} | 
					 | 
				
			||||||
	 | 
					 | 
				
			||||||
	 | 
					 | 
				
			||||||
	@Override | 
					 | 
				
			||||||
	public boolean add(E e) | 
					 | 
				
			||||||
	{ | 
					 | 
				
			||||||
		if (buffering) { | 
					 | 
				
			||||||
			toAdd.add(e); | 
					 | 
				
			||||||
		} else { | 
					 | 
				
			||||||
			super.add(e); | 
					 | 
				
			||||||
		} | 
					 | 
				
			||||||
		 | 
					 | 
				
			||||||
		return true; | 
					 | 
				
			||||||
	} | 
					 | 
				
			||||||
	 | 
					 | 
				
			||||||
	 | 
					 | 
				
			||||||
	@Override | 
					 | 
				
			||||||
	public boolean remove(Object e) | 
					 | 
				
			||||||
	{ | 
					 | 
				
			||||||
		if (buffering) { | 
					 | 
				
			||||||
			toRemove.add(e); | 
					 | 
				
			||||||
		} else { | 
					 | 
				
			||||||
			super.remove(e); | 
					 | 
				
			||||||
		} | 
					 | 
				
			||||||
		 | 
					 | 
				
			||||||
		return true; | 
					 | 
				
			||||||
	} | 
					 | 
				
			||||||
	 | 
					 | 
				
			||||||
	 | 
					 | 
				
			||||||
	/** | 
					 | 
				
			||||||
	 * Flush all | 
					 | 
				
			||||||
	 */ | 
					 | 
				
			||||||
	public void flush() | 
					 | 
				
			||||||
	{ | 
					 | 
				
			||||||
		for (final E e : toAdd) { | 
					 | 
				
			||||||
			super.add(e); | 
					 | 
				
			||||||
		} | 
					 | 
				
			||||||
		 | 
					 | 
				
			||||||
		for (final Object e : toRemove) { | 
					 | 
				
			||||||
			super.remove(e); | 
					 | 
				
			||||||
		} | 
					 | 
				
			||||||
		 | 
					 | 
				
			||||||
		toAdd.clear(); | 
					 | 
				
			||||||
		toRemove.clear(); | 
					 | 
				
			||||||
	} | 
					 | 
				
			||||||
	 | 
					 | 
				
			||||||
	 | 
					 | 
				
			||||||
	@Override | 
					 | 
				
			||||||
	public boolean removeAll(Collection<?> c) | 
					 | 
				
			||||||
	{ | 
					 | 
				
			||||||
		throw new UnsupportedOperationException(); | 
					 | 
				
			||||||
	} | 
					 | 
				
			||||||
	 | 
					 | 
				
			||||||
	 | 
					 | 
				
			||||||
	@Override | 
					 | 
				
			||||||
	public boolean containsAll(Collection<?> c) | 
					 | 
				
			||||||
	{ | 
					 | 
				
			||||||
		throw new UnsupportedOperationException(); | 
					 | 
				
			||||||
	} | 
					 | 
				
			||||||
	 | 
					 | 
				
			||||||
	 | 
					 | 
				
			||||||
	@Override | 
					 | 
				
			||||||
	public boolean addAll(Collection<? extends E> c) | 
					 | 
				
			||||||
	{ | 
					 | 
				
			||||||
		throw new UnsupportedOperationException(); | 
					 | 
				
			||||||
	} | 
					 | 
				
			||||||
	 | 
					 | 
				
			||||||
	 | 
					 | 
				
			||||||
	@Override | 
					 | 
				
			||||||
	public boolean retainAll(Collection<?> c) | 
					 | 
				
			||||||
	{ | 
					 | 
				
			||||||
		throw new UnsupportedOperationException(); | 
					 | 
				
			||||||
	} | 
					 | 
				
			||||||
	 | 
					 | 
				
			||||||
	 | 
					 | 
				
			||||||
	/** | 
					 | 
				
			||||||
	 * Toggle buffering | 
					 | 
				
			||||||
	 *  | 
					 | 
				
			||||||
	 * @param enable enable buffering | 
					 | 
				
			||||||
	 */ | 
					 | 
				
			||||||
	public void setBuffering(boolean enable) | 
					 | 
				
			||||||
	{ | 
					 | 
				
			||||||
		if (this.buffering && !enable) { | 
					 | 
				
			||||||
			flush(); | 
					 | 
				
			||||||
		} | 
					 | 
				
			||||||
		 | 
					 | 
				
			||||||
		this.buffering = enable; | 
					 | 
				
			||||||
	} | 
					 | 
				
			||||||
	 | 
					 | 
				
			||||||
} | 
					 | 
				
			||||||
					Loading…
					
					
				
		Reference in new issue