• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Written by Doug Lea with assistance from members of JCP JSR-166
3  * Expert Group and released to the public domain, as explained at
4  * http://creativecommons.org/publicdomain/zero/1.0/
5  */
6 
7 package java.util;
8 
9 // BEGIN android-note
10 // removed link to collections framework docs
11 // END android-note
12 
13 /**
14  * This class provides skeletal implementations of some {@link Queue}
15  * operations. The implementations in this class are appropriate when
16  * the base implementation does <em>not</em> allow <tt>null</tt>
17  * elements.  Methods {@link #add add}, {@link #remove remove}, and
18  * {@link #element element} are based on {@link #offer offer}, {@link
19  * #poll poll}, and {@link #peek peek}, respectively, but throw
20  * exceptions instead of indicating failure via <tt>false</tt> or
21  * <tt>null</tt> returns.
22  *
23  * <p>A <tt>Queue</tt> implementation that extends this class must
24  * minimally define a method {@link Queue#offer} which does not permit
25  * insertion of <tt>null</tt> elements, along with methods {@link
26  * Queue#peek}, {@link Queue#poll}, {@link Collection#size}, and
27  * {@link Collection#iterator}.  Typically, additional methods will be
28  * overridden as well.  If these requirements cannot be met, consider
29  * instead subclassing {@link AbstractCollection}.
30  *
31  * @since 1.5
32  * @author Doug Lea
33  * @param <E> the type of elements held in this collection
34  */
35 public abstract class AbstractQueue<E>
36     extends AbstractCollection<E>
37     implements Queue<E> {
38 
39     /**
40      * Constructor for use by subclasses.
41      */
AbstractQueue()42     protected AbstractQueue() {
43     }
44 
45     /**
46      * Inserts the specified element into this queue if it is possible to do so
47      * immediately without violating capacity restrictions, returning
48      * <tt>true</tt> upon success and throwing an <tt>IllegalStateException</tt>
49      * if no space is currently available.
50      *
51      * <p>This implementation returns <tt>true</tt> if <tt>offer</tt> succeeds,
52      * else throws an <tt>IllegalStateException</tt>.
53      *
54      * @param e the element to add
55      * @return <tt>true</tt> (as specified by {@link Collection#add})
56      * @throws IllegalStateException if the element cannot be added at this
57      *         time due to capacity restrictions
58      * @throws ClassCastException if the class of the specified element
59      *         prevents it from being added to this queue
60      * @throws NullPointerException if the specified element is null and
61      *         this queue does not permit null elements
62      * @throws IllegalArgumentException if some property of this element
63      *         prevents it from being added to this queue
64      */
add(E e)65     public boolean add(E e) {
66         if (offer(e))
67             return true;
68         else
69             throw new IllegalStateException("Queue full");
70     }
71 
72     /**
73      * Retrieves and removes the head of this queue.  This method differs
74      * from {@link #poll poll} only in that it throws an exception if this
75      * queue is empty.
76      *
77      * <p>This implementation returns the result of <tt>poll</tt>
78      * unless the queue is empty.
79      *
80      * @return the head of this queue
81      * @throws NoSuchElementException if this queue is empty
82      */
remove()83     public E remove() {
84         E x = poll();
85         if (x != null)
86             return x;
87         else
88             throw new NoSuchElementException();
89     }
90 
91     /**
92      * Retrieves, but does not remove, the head of this queue.  This method
93      * differs from {@link #peek peek} only in that it throws an exception if
94      * this queue is empty.
95      *
96      * <p>This implementation returns the result of <tt>peek</tt>
97      * unless the queue is empty.
98      *
99      * @return the head of this queue
100      * @throws NoSuchElementException if this queue is empty
101      */
element()102     public E element() {
103         E x = peek();
104         if (x != null)
105             return x;
106         else
107             throw new NoSuchElementException();
108     }
109 
110     /**
111      * Removes all of the elements from this queue.
112      * The queue will be empty after this call returns.
113      *
114      * <p>This implementation repeatedly invokes {@link #poll poll} until it
115      * returns <tt>null</tt>.
116      */
clear()117     public void clear() {
118         while (poll() != null)
119             ;
120     }
121 
122     /**
123      * Adds all of the elements in the specified collection to this
124      * queue.  Attempts to addAll of a queue to itself result in
125      * <tt>IllegalArgumentException</tt>. Further, the behavior of
126      * this operation is undefined if the specified collection is
127      * modified while the operation is in progress.
128      *
129      * <p>This implementation iterates over the specified collection,
130      * and adds each element returned by the iterator to this
131      * queue, in turn.  A runtime exception encountered while
132      * trying to add an element (including, in particular, a
133      * <tt>null</tt> element) may result in only some of the elements
134      * having been successfully added when the associated exception is
135      * thrown.
136      *
137      * @param c collection containing elements to be added to this queue
138      * @return <tt>true</tt> if this queue changed as a result of the call
139      * @throws ClassCastException if the class of an element of the specified
140      *         collection prevents it from being added to this queue
141      * @throws NullPointerException if the specified collection contains a
142      *         null element and this queue does not permit null elements,
143      *         or if the specified collection is null
144      * @throws IllegalArgumentException if some property of an element of the
145      *         specified collection prevents it from being added to this
146      *         queue, or if the specified collection is this queue
147      * @throws IllegalStateException if not all the elements can be added at
148      *         this time due to insertion restrictions
149      * @see #add(Object)
150      */
addAll(Collection<? extends E> c)151     public boolean addAll(Collection<? extends E> c) {
152         if (c == null)
153             throw new NullPointerException("c == null");
154         if (c == this)
155             throw new IllegalArgumentException("c == this");
156         boolean modified = false;
157         for (E e : c)
158             if (add(e))
159                 modified = true;
160         return modified;
161     }
162 
163 }
164