package prefuse.data.tuple;
import java.util.Iterator;
import java.util.LinkedHashSet;
import prefuse.data.Tuple;
import prefuse.data.event.EventConstants;
/**
* <p>TupleSet implementation that maintains a set of heterogeneous Tuples
* -- tuples that can come from any backing data source. This class supports
* {@link #addTuple(Tuple)} and {@link #removeTuple(Tuple)} but does not
* support adding new columns to contained tuples.</p>
*
* <p>This TupleSet uses a {@link java.util.LinkedHashSet} to support fast
* lookup of contained tuples while mainting Tuples in the order in which
* they are added to the set.</p>
*
* @author <a href="http://jheer.org">jeffrey heer</a>
*/
public class DefaultTupleSet extends AbstractTupleSet implements EventConstants
{
protected LinkedHashSet m_tuples;
/**
* Create a new, empty DefaultTupleSet.
*/
public DefaultTupleSet() {
m_tuples = new LinkedHashSet();
}
/**
* @see prefuse.data.tuple.TupleSet#getTupleCount()
*/
public int getTupleCount() {
return m_tuples.size();
}
/**
* @see prefuse.data.tuple.TupleSet#addTuple(prefuse.data.Tuple)
*/
public Tuple addTuple(Tuple t) {
t = addInternal(t);
if ( t != null )
fireTupleEvent(t, INSERT);
return t;
}
/**
* @see prefuse.data.tuple.TupleSet#setTuple(prefuse.data.Tuple)
*/
public Tuple setTuple(Tuple t) {
Tuple[] rem = clearInternal();
t = addInternal(t);
Tuple[] add = t==null ? null : new Tuple[] {t};
fireTupleEvent(add, rem);
return t;
}
/**
* Adds a tuple without firing a notification.
* @param t the Tuple to add
* @return the added Tuple
*/
protected final Tuple addInternal(Tuple t) {
if ( m_tuples.add(t) ) {
return t;
} else {
return null;
}
}
/**
* @see prefuse.data.tuple.TupleSet#containsTuple(prefuse.data.Tuple)
*/
public boolean containsTuple(Tuple t) {
return m_tuples.contains(t);
}
/**
* @see prefuse.data.tuple.TupleSet#removeTuple(prefuse.data.Tuple)
*/
public boolean removeTuple(Tuple t) {
boolean b = removeInternal(t);
if ( b )
fireTupleEvent(t, DELETE);
return b;
}
/**
* Removes a tuple without firing a notification.
* @param t the tuple to remove
* @return true if the tuple is removed successfully, false otherwise
*/
protected final boolean removeInternal(Tuple t) {
return ( m_tuples.remove(t) );
}
/**
* @see prefuse.data.tuple.TupleSet#clear()
*/
public void clear() {
if ( getTupleCount() > 0 ) {
Tuple[] t = clearInternal();
fireTupleEvent(null, t);
}
}
/**
* Clear the internal state without firing a notification.
* @return an array of removed tuples
*/
public Tuple[] clearInternal() {
Tuple[] t = new Tuple[getTupleCount()];
Iterator iter = tuples();
for ( int i=0; iter.hasNext(); ++i ) {
t[i] = (Tuple)iter.next();
}
m_tuples.clear();
return t;
}
/**
* @see prefuse.data.tuple.TupleSet#tuples()
*/
public Iterator tuples() {
return m_tuples.iterator();
}
/**
* Get the contents of this TupleSet as an array.
* @return the contents of this TupleSet as an array
*/
public Tuple[] toArray() {
Tuple[] t = new Tuple[getTupleCount()];
m_tuples.toArray(t);
return t;
}
} // end of class DefaultTupleSet