01: /** 02: A first-in, first-out bounded collection of messages. 03: */ 04: public class MessageQueue 05: { 06: /** 07: Constructs an empty message queue. 08: @param capacity the maximum capacity of the queue 09: @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 removeFirst() 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 getFirst() 68: { 69: return elements[head]; 70: } 71: 72: private Message[] elements; 73: private int head; 74: private int tail; 75: private int count; 76: }