
package network;

import java.net.*;


public class BufferQueue {

    DatagramPacket[] buffer = null;
    int headIndex; // Pointer to first coming out
    int tailIndex; // Pointer to empty slot
    int currSize;

    public BufferQueue(int size) {
        buffer = new DatagramPacket[size];
        headIndex = 0;
        tailIndex = 0;
        currSize = 0;
    }

    public synchronized boolean enqueue(DatagramPacket packet) {
        if (currSize == buffer.length)
            return false;

        buffer[tailIndex] = packet;
        tailIndex = increment(tailIndex);
        currSize ++;

        notifyAll();
        return true;
    }

    public synchronized DatagramPacket dequeue() throws InterruptedException {
        while (currSize == 0)
            wait();

        DatagramPacket rtn = buffer[headIndex];
        headIndex = increment(headIndex);
        currSize --;

        return rtn;
    }

    private int increment(int value) {
        return (value + 1) % buffer.length;
    }

}