001: import java.util.*;
002: 
003: /**
004:     A first-in, first-out bounded collection of objects.
005: */
006: public class BoundedQueue<E> extends AbstractCollection<E>
007: {
008:    /**
009:        Constructs an empty queue.
010:        @param capacity the maximum capacity of the queue
011:        @precondition capacity > 0
012:    */
013:    public BoundedQueue(int capacity)
014:    {
015:       elements = new Object[capacity];
016:       count = 0;
017:       head = 0;
018:       tail = 0;
019:    }
020: 
021:    public Iterator<E> iterator()
022:    {
023:       return new
024:          Iterator<E>()
025:          {
026:             public boolean hasNext()
027:             {
028:                return visited < count;
029:             }
030: 
031:             public E next()
032:             {
033:                int index = (head + visited) % elements.length;
034:                E r = (E) elements[index];
035:                visited++;
036:                return r;
037:             }
038: 
039:             public void remove()
040:             {
041:                throw new UnsupportedOperationException();
042:             }
043: 
044:             private int visited = 0;
045:          };
046:    }
047: 
048:    /**
049:        Remove object at head.
050:        @return the object that has been removed from the queue
051:        @precondition size() > 0
052:    */
053:    public E remove()
054:    {
055:       E r = (E) elements[head];
056:       head = (head + 1) % elements.length;
057:       count--;
058:       return r;
059:    }
060: 
061:    /**
062:        Append an object at tail.
063:        @param anObject the object to be appended
064:        @return true since this operation modifies the queue.
065:        (This is a requirement of the collections framework.)
066:        @precondition !isFull()
067:    */
068:    public boolean add(E anObject)
069:    {
070:       elements[tail] = anObject;
071:       tail = (tail + 1) % elements.length;
072:       count++;
073:       return true;
074:    }
075: 
076:    public int size()
077:    {
078:       return count;
079:    }
080: 
081:    /**
082:        Checks whether this queue is full.
083:        @return true if the queue is full
084:    */
085:    public boolean isFull()
086:    {
087:       return count == elements.length;
088:    }
089: 
090:    /**
091:        Gets object at head.
092:        @return the object that is at the head of the queue
093:        @precondition size() > 0
094:    */
095:    public E peek()
096:    {
097:       return (E) elements[head];
098:    }
099: 
100:    private Object[] elements;
101:    private int head;
102:    private int tail;
103:    private int count;
104: }