// carqueue.h: the CarQueue class.

#include <cstdio>
#include <iostream.h>
#include "main.h"
#include "car.h"
#include "carqueue.h"

double CarQueue::getEmptyTime () {
   if (queueSize > 0)
      return totalEmptyQueueTime;
   else
      return totalEmptyQueueTime + sim->simulationTime;
}

void CarQueue::insert (Car *newestCar) {
   QueueItem *item = new QueueItem();
   item->data = newestCar;
   item->next = 0;
   
   if (lastWaitingCar == 0) {
      // the queue is empty
      firstWaitingCar = item;
      totalEmptyQueueTime += sim->simulationTime;
   }
   else {
      // the queue already had at least one car in it
      lastWaitingCar->next = item;   
   }
   
   lastWaitingCar = item;
   queueSize += 1;   
}

Car *CarQueue::takeFirstCar () {
   // precondition: queueSize > 0 && firstWaitingCar != 0
   if (queueSize <= 0 || firstWaitingCar == 0) {
      cout << "Error! car queue unexpectedly empty\n";
      return 0;
   }
   
   Car *carToReturn = firstWaitingCar->data;
   queueSize--;
   QueueItem *restOfList = firstWaitingCar->next;
   delete firstWaitingCar;
   firstWaitingCar = restOfList;
   
   if (firstWaitingCar == 0) {
      // empty queue: update the end of the queue, and start
      // counting empty queue time
      lastWaitingCar = 0;
      totalEmptyQueueTime -= sim->simulationTime;   
   }
   
   return carToReturn;
}

