1  /** 
  2      A first-in, first-out bounded collection of messages. 
  3  */ 
  4  public class MessageQueue 
  5  { 
  6     /** 
  7         Constructs an empty message queue. 
  8         @param capacity the maximum capacity of the queue 
  9         @precondition capacity > 0
 10     */ 
 11     public MessageQueue(int capacity) 
 12     { 
 13        elements = new Message[capacity]; 
 14        count = 0; 
 15        head = 0; 
 16        tail = 0; 
 17     } 
 18  
 19     /** 
 20         Remove message at head. 
 21         @return the message that has been removed from the queue
 22         @precondition size() > 0 
 23     */ 
 24     public Message remove() 
 25     { 
 26        Message r = elements[head]; 
 27        head = (head + 1) % elements.length; 
 28        count--; 
 29        return r; 
 30     } 
 31  
 32     /** 
 33         Append a message at tail. 
 34         @param aMessage the message to be appended 
 35         @precondition !isFull();
 36     */ 
 37     public void add(Message aMessage) 
 38     { 
 39        elements[tail] = aMessage; 
 40        tail = (tail + 1) % elements.length; 
 41        count++; 
 42     } 
 43  
 44     /** 
 45         Get the total number of messages in the queue. 
 46         @return the total number of messages in the queue 
 47     */ 
 48     public int size() 
 49     { 
 50        return count; 
 51     } 
 52  
 53     /** 
 54         Checks whether this queue is full
 55         @return true if the queue is full
 56     */ 
 57     public boolean isFull()
 58     { 
 59        return count == elements.length; 
 60     } 
 61  
 62     /** 
 63         Get message at head. 
 64         @return the message that is at the head of the queue 
 65         @precondition size() > 0 
 66     */ 
 67     public Message peek() 
 68     { 
 69        return elements[head]; 
 70     } 
 71  
 72     private Message[] elements; 
 73     private int head; 
 74     private int tail; 
 75     private int count; 
 76  }