package com.hellblazer.primeMover;
import java.util.Collection;
import java.util.Queue;
/**
* A {@linkplain Queue blocking queue} in which each insert operation must wait
* for a corresponding remove operation by another thread, and vice versa. A
* synchronous queue does not have any internal capacity, not even a capacity of
* one. You cannot <tt>peek</tt> at a synchronous queue because an element is
* only present when you try to remove it; you cannot insert an element (using
* any method) unless another thread is trying to remove it; you cannot iterate
* as there is nothing to iterate. The <em>head</em> of the queue is the element
* that the first queued inserting thread is trying to add to the queue; if
* there is no such queued thread then no element is available for removal and
* <tt>poll()</tt> will return <tt>null</tt>. For purposes of other
* <tt>Collection</tt> methods (for example <tt>contains</tt>), a
* <tt>SynchronousQueue</tt> acts as an empty collection. This queue does not
* permit <tt>null</tt> elements.
*
* <p>
* Synchronous queues are similar to rendezvous channels used in CSP and Ada.
* They are well suited for handoff designs, in which an object running in one
* thread must sync up with an object running in another thread in order to hand
* it some information, event, or task.
*
* @param <E>
* the type of elements held in this collection
*/
public interface SynchronousQueue<E> extends Queue<E> {
/**
* Inserts the specified element into this queue if it is possible to do so
* immediately without violating capacity restrictions, returning
* <tt>true</tt> upon success and throwing an <tt>IllegalStateException</tt>
* if no space is currently available. When using a capacity-restricted
* queue, it is generally preferable to use {@link #offer(Object) offer}.
*
* @param e
* the element to add
* @return <tt>true</tt> (as specified by {@link Collection#add})
* @throws IllegalStateException
* if the element cannot be added at this time due to capacity
* restrictions
* @throws ClassCastException
* if the class of the specified element prevents it from being
* added to this queue
* @throws NullPointerException
* if the specified element is null
* @throws IllegalArgumentException
* if some property of the specified element prevents it from
* being added to this queue
*/
@Override
boolean add(E e);
/**
* Returns <tt>true</tt> if this queue contains the specified element. More
* formally, returns <tt>true</tt> if and only if this queue contains at
* least one element <tt>e</tt> such that <tt>o.equals(e)</tt>.
*
* @param o
* object to be checked for containment in this queue
* @return <tt>true</tt> if this queue contains the specified element
* @throws ClassCastException
* if the class of the specified element is incompatible with
* this queue (optional)
* @throws NullPointerException
* if the specified element is null (optional)
*/
@Override
public boolean contains(Object o);
/**
* Removes all available elements from this queue and adds them to the given
* collection. This operation may be more efficient than repeatedly polling
* this queue. A failure encountered while attempting to add elements to
* collection <tt>c</tt> may result in elements being in neither, either or
* both collections when the associated exception is thrown. Attempts to
* drain a queue to itself result in <tt>IllegalArgumentException</tt>.
* Further, the behavior of this operation is undefined if the specified
* collection is modified while the operation is in progress.
*
* @param c
* the collection to transfer elements into
* @return the number of elements transferred
* @throws UnsupportedOperationException
* if addition of elements is not supported by the specified
* collection
* @throws ClassCastException
* if the class of an element of this queue prevents it from
* being added to the specified collection
* @throws NullPointerException
* if the specified collection is null
* @throws IllegalArgumentException
* if the specified collection is this queue, or some property
* of an element of this queue prevents it from being added to
* the specified collection
*/
int drainTo(Collection<? super E> c);
/**
* Removes at most the given number of available elements from this queue
* and adds them to the given collection. A failure encountered while
* attempting to add elements to collection <tt>c</tt> may result in
* elements being in neither, either or both collections when the associated
* exception is thrown. Attempts to drain a queue to itself result in
* <tt>IllegalArgumentException</tt>. Further, the behavior of this
* operation is undefined if the specified collection is modified while the
* operation is in progress.
*
* @param c
* the collection to transfer elements into
* @param maxElements
* the maximum number of elements to transfer
* @return the number of elements transferred
* @throws UnsupportedOperationException
* if addition of elements is not supported by the specified
* collection
* @throws ClassCastException
* if the class of an element of this queue prevents it from
* being added to the specified collection
* @throws NullPointerException
* if the specified collection is null
* @throws IllegalArgumentException
* if the specified collection is this queue, or some property
* of an element of this queue prevents it from being added to
* the specified collection
*/
int drainTo(Collection<? super E> c, int maxElements);
/**
* Inserts the specified element into this queue if it is possible to do so
* immediately without violating capacity restrictions, returning
* <tt>true</tt> upon success and <tt>false</tt> if no space is currently
* available. When using a capacity-restricted queue, this method is
* generally preferable to {@link #add}, which can fail to insert an element
* only by throwing an exception.
*
* @param e
* the element to add
* @return <tt>true</tt> if the element was added to this queue, else
* <tt>false</tt>
* @throws ClassCastException
* if the class of the specified element prevents it from being
* added to this queue
* @throws NullPointerException
* if the specified element is null
* @throws IllegalArgumentException
* if some property of the specified element prevents it from
* being added to this queue
*/
@Override
boolean offer(E e);
/**
* Inserts the specified element into this queue, waiting up to the
* specified wait time if necessary for space to become available.
*
* @param e
* the element to add
* @param timeout
* how long to wait before giving up, in units of <tt>unit</tt>
* @return <tt>true</tt> if successful, or <tt>false</tt> if the specified
* waiting time elapses before space is available
* @throws ClassCastException
* if the class of the specified element prevents it from being
* added to this queue
* @throws NullPointerException
* if the specified element is null
* @throws IllegalArgumentException
* if some property of the specified element prevents it from
* being added to this queue
*/
@Blocking
boolean offer(E e, long timeout);
/**
* Retrieves and removes the head of this queue, waiting up to the specified
* wait time if necessary for an element to become available.
*
* @param timeout
* how long to wait before giving up, in units of <tt>unit</tt>
* @return the head of this queue, or <tt>null</tt> if the specified waiting
* time elapses before an element is available
*/
@Blocking
E poll(long timeout);
/**
* Inserts the specified element into this queue, waiting if necessary for
* space to become available.
*
* @param e
* the element to add
* @throws ClassCastException
* if the class of the specified element prevents it from being
* added to this queue
* @throws NullPointerException
* if the specified element is null
* @throws IllegalArgumentException
* if some property of the specified element prevents it from
* being added to this queue
*/
@Blocking
void put(E e);
/**
* Returns the number of additional elements that this queue can ideally (in
* the absence of memory or resource constraints) accept without blocking,
* or <tt>Integer.MAX_VALUE</tt> if there is no intrinsic limit.
*
* <p>
* Note that you <em>cannot</em> always tell if an attempt to insert an
* element will succeed by inspecting <tt>remainingCapacity</tt> because it
* may be the case that another thread is about to insert or remove an
* element.
*
* @return the remaining capacity
*/
int remainingCapacity();
/**
* Removes a single instance of the specified element from this queue, if it
* is present. More formally, removes an element <tt>e</tt> such that
* <tt>o.equals(e)</tt>, if this queue contains one or more such elements.
* Returns <tt>true</tt> if this queue contained the specified element (or
* equivalently, if this queue changed as a result of the call).
*
* @param o
* element to be removed from this queue, if present
* @return <tt>true</tt> if this queue changed as a result of the call
* @throws ClassCastException
* if the class of the specified element is incompatible with
* this queue (optional)
* @throws NullPointerException
* if the specified element is null (optional)
*/
@Override
boolean remove(Object o);
/**
* Retrieves and removes the head of this queue, waiting if necessary until
* an element becomes available.
*
* @return the head of this queue
*/
@Blocking
E take();
}