SynchronizedRedBlackTree.java
package org.opentrafficsim.core.dsol;
import java.io.Serializable;
import java.util.Collection;
import java.util.Comparator;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.SortedSet;
import java.util.TreeSet;
import nl.tudelft.simulation.dsol.eventlists.EventListInterface;
import nl.tudelft.simulation.dsol.formalisms.eventscheduling.SimEventInterface;
import nl.tudelft.simulation.dsol.simtime.SimTime;
/**
* A SynchronizedRedBlackTree implementation of the eventlistInterface. This implementation is based on Java's TreeSet.
* <p>
* (c) copyright 2002-2005 <a href="http://www.simulation.tudelft.nl">Delft University of Technology </a>, the Netherlands. <br>
* See for project information <a href="http://www.simulation.tudelft.nl"> www.simulation.tudelft.nl </a> <br>
* License of use: <a href="http://www.gnu.org/copyleft/lesser.html">Lesser General Public License (LGPL) </a>, no warranty.
* @author <a href="https://www.linkedin.com/in/peterhmjacobs">Peter Jacobs </a>
* @version $Revision: 1.2 $ $Date: 2010/08/10 11:36:45 $
* @param <T> the type of simulation time, e.g. SimTimeCalendarLong or SimTimeDouble or SimTimeDoubleUnit.
* @since 1.5
*/
public class SynchronizedRedBlackTree<T extends SimTime<?, ?, T>> implements EventListInterface<T>, Serializable
{
/** The default serial version UID for serializable classes. */
private static final long serialVersionUID = 1L;
/** wrapped treeset. */
private TreeSet<SimEventInterface<T>> tree = new TreeSet<>();
/**
* Constructs a new <code>SynchronizedRedBlackTree</code>.
*/
public SynchronizedRedBlackTree()
{
super();
}
/** {@inheritDoc} */
@Override
@SuppressWarnings("checkstyle:designforextension")
public SimEventInterface<T> removeFirst()
{
synchronized (this.tree)
{
SimEventInterface<T> first = this.first();
this.remove(first);
return first;
}
}
/** {@inheritDoc} */
@Override
@SuppressWarnings("checkstyle:designforextension")
public SimEventInterface<T> removeLast()
{
synchronized (this.tree)
{
SimEventInterface<T> last = this.last();
this.remove(last);
return last;
}
}
/**
* we re-implemented the first method. Instead of throwing exceptions if the tree is empty, we return a null value.
* @see java.util.TreeSet#first()
* @return the first SimEvent in the tree.
*/
@Override
@SuppressWarnings("checkstyle:designforextension")
public SimEventInterface<T> first()
{
synchronized (this.tree)
{
try
{
return this.tree.first();
}
catch (NoSuchElementException noSuchElementException)
{
return null;
}
}
}
/**
* we re-implemented the last method. Instead of throwing exceptions if the tree is empty, we return a null value.
* @see java.util.TreeSet#last()
* @return the last SimEvent in the tree.
*/
@Override
@SuppressWarnings("checkstyle:designforextension")
public SimEventInterface<T> last()
{
synchronized (this.tree)
{
try
{
return this.tree.last();
}
catch (NoSuchElementException noSuchElementException)
{
return null;
}
}
}
/** {@inheritDoc} */
@Override
public Comparator<? super SimEventInterface<T>> comparator()
{
synchronized (this.tree)
{
return this.tree.comparator();
}
}
/** {@inheritDoc} */
@Override
public SortedSet<SimEventInterface<T>> subSet(final SimEventInterface<T> fromElement, final SimEventInterface<T> toElement)
{
synchronized (this.tree)
{
return this.tree.subSet(fromElement, toElement);
}
}
/** {@inheritDoc} */
@Override
public SortedSet<SimEventInterface<T>> headSet(final SimEventInterface<T> toElement)
{
synchronized (this.tree)
{
return this.tree.headSet(toElement);
}
}
/** {@inheritDoc} */
@Override
public SortedSet<SimEventInterface<T>> tailSet(final SimEventInterface<T> fromElement)
{
synchronized (this.tree)
{
return this.tree.tailSet(fromElement);
}
}
/** {@inheritDoc} */
@Override
public int size()
{
synchronized (this.tree)
{
return this.tree.size();
}
}
/** {@inheritDoc} */
@Override
public boolean isEmpty()
{
synchronized (this.tree)
{
return this.tree.isEmpty();
}
}
/** {@inheritDoc} */
@Override
public boolean contains(final Object o)
{
synchronized (this.tree)
{
return this.tree.contains(o);
}
}
/** {@inheritDoc} */
@Override
public Iterator<SimEventInterface<T>> iterator()
{
synchronized (this.tree)
{
return this.tree.iterator();
}
}
/** {@inheritDoc} */
@Override
public Object[] toArray()
{
synchronized (this.tree)
{
return this.tree.toArray();
}
}
/** {@inheritDoc} */
@Override
public <X> X[] toArray(final X[] a)
{
synchronized (this.tree)
{
return this.tree.toArray(a);
}
}
/** {@inheritDoc} */
@Override
public boolean add(final SimEventInterface<T> e)
{
synchronized (this.tree)
{
return this.tree.add(e);
}
}
/** {@inheritDoc} */
@Override
public boolean remove(final Object o)
{
synchronized (this.tree)
{
return this.tree.remove(o);
}
}
/** {@inheritDoc} */
@Override
public boolean containsAll(final Collection<?> c)
{
synchronized (this.tree)
{
return this.tree.containsAll(c);
}
}
/** {@inheritDoc} */
@Override
public boolean addAll(final Collection<? extends SimEventInterface<T>> c)
{
synchronized (this.tree)
{
return this.tree.addAll(c);
}
}
/** {@inheritDoc} */
@Override
public boolean retainAll(final Collection<?> c)
{
synchronized (this.tree)
{
return this.tree.retainAll(c);
}
}
/** {@inheritDoc} */
@Override
public boolean removeAll(final Collection<?> c)
{
synchronized (this.tree)
{
return this.tree.removeAll(c);
}
}
/** {@inheritDoc} */
@Override
public void clear()
{
this.tree.clear();
}
/** {@inheritDoc} */
@Override
public String toString()
{
return "SynchronizedRedBlackTree [" + this.tree.size() + " events]";
}
}