//----------------------------------------------------------------------
//  IMPLEMENTATION FILE (bqueue.cpp)
//  This module exports an ADT for a bounded queue of integer values.
//  The maximum queue length is MAX_LENG.
//  Queue representation: a ring buffer in a vector of
//                        size MAX_LENG + 1
//----------------------------------------------------------------------
#include "bqueue.h"

const int VEC_SIZE = MAX_LENG + 1;

// Private members of class:
//     int data[MAX_LENG+1];  // Vector representing the queue
//     int front;             // (Subscript of queue front) - 1
//     int rear;              // Subscript of queue rear
//
// CLASSINV:  At all times, at least one element of the data vector
//            remains unused

IntQueue::IntQueue()
    //..................................................................
    // Constructor
    // POST: front == 0  &&  rear == 0
    //..................................................................
{
    front = rear = 0;
}

Boolean IntQueue::IsEmpty() const
    //..................................................................
    // POST: FCTVAL == (rear == front)
    //..................................................................
{
    return (rear == front);
}

Boolean IntQueue::IsFull() const
    //..................................................................
    // POST: FCTVAL == ((rear + 1) MOD VEC_SIZE == front)
    //..................................................................
{
    return ((rear + 1) % VEC_SIZE == front);
}

void IntQueue::Enqueue( /* in */ int newItem )
    //..................................................................
    // PRE:  (rear + 1) MOD VEC_SIZE != front
    //    && Assigned(newItem)
    // POST: rear == (rear<entry> + 1) MOD VEC_SIZE
    //    && data[rear] == newItem
    //..................................................................
{
    rear = (rear + 1) % VEC_SIZE;
    data[rear] = newItem;
}

int IntQueue::Front() const
    //..................................................................
    // PRE:  rear != front
    // POST: FCTVAL == data[(front + 1) MOD VEC_SIZE]
    //..................................................................
{
    return data[(front + 1) % VEC_SIZE];
}

void IntQueue::Dequeue()
    //..................................................................
    // PRE:  rear != front
    // POST: front == (front<entry> + 1) MOD VEC_SIZE
    //..................................................................
{
    front = (front + 1) % VEC_SIZE;
}

