//----------------------------------------------------------------------
//  IMPLEMENTATION FILE (processq.cpp)
//----------------------------------------------------------------------
#include "processq.h"

ProcessQ::ProcessQ()
    //..................................................................
    // Constructor
    // POST: front == NULL  &&  rear == NULL
    //..................................................................
{
    //Init!

    Front = NULL;
    Rear = NULL;

    Count = 0;
}

ProcessQ::~ProcessQ()
{	
     PNodeType *NPtr;

     //Mr. Destruct0 - Loop through each node
     while(Count != 0)
     {
         NPtr = Front;
         Front = Front->link;
         Count--;
         //delete NPtr->process;	//??NO
         delete NPtr;
     }
        
}

Boolean ProcessQ::IsEmpty()
{
    if(Count == 0)
    	return(TRUE);
    else
	return(FALSE);
}

int ProcessQ::getCount()
{
	return(Count);
}

void ProcessQ::Enqueue(Process *newproc)
{
        //Make the Node
        PNodePtr NewPtr = new PNodeType;
        NewPtr->process = newproc;

        //Link it in
        NewPtr->link = NULL;
        
        if(Count == 0) //No nodes yet
                Rear = Front = NewPtr;
        else
        {
                Rear->link = NewPtr; 
                Rear = NewPtr;

        }

        //Increase count
        Count++;     

} //End Enqueue

Process *ProcessQ::Dequeue()
{
        Process *PPtr;
        PNodePtr NPtr;

        //Save some pointers
        PPtr = Front->process;
        NPtr = Front;

        if(Count == 1)  //Last node
                Front = Rear = NULL;
        else
                Front = Front->link;

        Count --;
        delete NPtr;

        return(PPtr);
}


int ProcessQ::PeekFrontPID()
{
	if(Count != 0)
		return(Front->process->getPID());
	else	//no first process
		return(-99);
}	

void ProcessQ::Display()
{
        PNodePtr NPtr;

	NPtr = Front;
        while(NPtr != NULL)
        {
                NPtr->process->Display();
                NPtr = NPtr->link;
        }
}

