/**
 * Created by zulupero on 01/12/15.
 */
public class RingBuffer {
    double[] buffer ;
    int first ;
    int last ;
    int capacity ;
    int size ;

    /**
     * Constructeur. prend en paramètre la capacité du buffer et
     * alloue le buffer.
     * @param cap
     */
    public RingBuffer(int cap){
        capacity = cap;
        first = 0 ;
        last = 0 ;
        size = 0 ;
        buffer = new double[cap] ;
    }

    /**
     * Renvoie le nombre d'échantillons dans le buffer
     * @return
     */
    public int size(){
        return size;
    }

    /**
     * Renvoie vrai i le buffer est vide
     * @return
     */
    public boolean isEmpty(){
        return (size == 0);
    }

    /**
     * Renvoie vrai si le buffer est plein
     * @return
     */

    public boolean isFull(){
        return (size == capacity );
    }

    /**
     * Ajoute l'échantillon x à la fin du buffer
     * et met à jour la position du curseur last
     * @param x
     */
    public void enqueue(double x){
        if( isFull() ) throw new RuntimeException("file pleine");
        buffer[last] = x ;
        last = (last+1)%capacity ;
        size++;
    }

   /**
     * Renvoie l'échantillon en tête de file
     * et avance le curseur
     * @return
     */
    public double dequeue(){
        if (isEmpty()) throw new RuntimeException("file vide");
        int pos = first ;
        first = (first+1)%capacity;
        size--;
        return buffer[pos] ;
    }

    /**
     * Renvoie l'échantilon en tête de file sans bouger le curseur
     * @return
     */
    public double pick(){
        if (isEmpty()) throw new RuntimeException("file vide");
        return buffer[first];
    }

    public double pickz1(){
        if (size < 2) throw new RuntimeException("file vide");
        return buffer[(first+1)%capacity];
    }


    public void display(){
        System.out.print("[ ");
        int i = first;
        int qte = 0;
        while(qte < size){
            System.out.print(buffer[i] + ", ");
            i = (i+1)%capacity;
            qte++;
        }

        System.out.print(buffer[buffer.length-1]+" ]");
        System.out.println();
        System.out.println("first:" + first + ", last: " + last);
        System.out.println("full  ? " + isFull());
        System.out.println("empty ? " + isEmpty());
        System.out.println("size : " + size());
    }

    public static void main(String[] args){
        RingBuffer buf = new RingBuffer(10);
        buf.enqueue(1.5);
        buf.enqueue(2.5);
        buf.enqueue(3.5);
        buf.enqueue(4.5);
        buf.enqueue(5.5);
        buf.enqueue(6.5);
        buf.enqueue(7.5);
        buf.enqueue(8.5);
        buf.enqueue(9.5);
        buf.enqueue(10);
        buf.display();
    }
}
