WALA/com.ibm.wala.core/src/com/ibm/wala/util/collections/FifoQueueNoDuplicates.java

106 lines
3.5 KiB
Java

/*******************************************************************************
* Copyright (c) 2002 - 2006 IBM Corporation.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package com.ibm.wala.util.collections;
import java.util.Collections;
import java.util.Iterator;
import java.util.Set;
/**
* FIFO work queue management of Objects that prevents an Object from being
* added to the queue if it was ever previously enqueued.
*
* @author Marco Pistoia
*/
public class FifoQueueNoDuplicates<T> extends FifoQueue<T> {
/**
* Set representing items ever pushed into the work queue. This keeps an item
* from ever be pushed again into the work queue.
*/
private Set<T> wasInQueue = HashSetFactory.make();
/**
* Return an Iterator over the set of all the nodes that were pushed into the
* queue.
*
* @return an Iterator over the set of pushed nodes.
*/
public Iterator<T> getPushedNodes() {
return wasInQueue.iterator();
}
/**
* Insert an Object at the tail end of the queue if it was never pushed into
* the queue.
* <p>
* This method determines whether an element was ever in the queue using the
* element's <code>equals()</code> method. If the element's class does not
* implement <code>equals()</code>, the default implementation assumes they
* are equal if it is the same object.
*
* @param element
* is the Object to be added to the queue if not ever previously
* queued.
*/
public void push(T element) {
if (wasInQueue.add(element)) {
inQueue.add(element);
qItems.add(element);
}
}
/**
* Insert all of the elements in the specified Iterator at the tail end of the
* queue if never previously pushed into the queue.
* <p>
* This method determines whether an element was ever pushed into the queue
* using the element's <code>equals()</code> method. If the element's class
* does not implement <code>equals()</code>, the default implementation
* assumes that two elements are equal if they are the same object.
*
* @param elements
* an Iterator of Objects to be added to the queue if never already
* queued.
*/
public void push(Iterator<? extends T> elements) {
while (elements.hasNext()) {
T element = elements.next();
if (wasInQueue.add(element)) {
inQueue.add(element);
qItems.add(element);
}
}
}
/**
* Indicate whether the specified element was ever in the queue.
*
* @param element
* determine whether this object is in the queue.
* @return <code>true</code> if <code>element</code> is in the queue.
* Otherwise <code>false</code>.
*/
public boolean everContained(T element) {
return wasInQueue.contains(element);
}
/**
* Return an iterator over all elements ever in the queue.
*
* @return <code>true</code> if <code>element</code> is in the queue.
* Otherwise <code>false</code>.
*/
public Set<T> queuedSet() {
return Collections.unmodifiableSet(wasInQueue);
}
}