// CPUScheduler.h     Dave Reed       2/5/05
///////////////////////////////////////////////////////////////////////////////

#ifndef _CPU_SCHEDULER_
#define _CPU_SCHEDULER_

#include <iostream>
#include <queue>
#include "Job.h"
#include "Die.h"
using namespace std;

class CPUScheduler 
{
  public:
    CPUScheduler(int delay, int slice, int min, int max);
    int getTime() const;
    bool jobsRemaining() const;             // RETURNS TRUE IF JOBS IN EITHER QUEUE 
    void addNewJob(Job newJob);             // ADDS NEW JOB TO READY QUEUE
    void execute();                         // EXECUTES CURRENT JOB, UPDATES QUEUES
  private:
      class PriorityJob : Job               // HIDDEN CLASS FOR PRIORITY QUEUE OF JOBS
      {
        public:
            PriorityJob(Job j, int pri) : Job(j) { priority = pri; }
            int getPriority() const { return priority; }
            bool operator<(const PriorityJob & j) const { return priority > j.priority; }
        private:
          int priority;
      };
    queue<Job> readyQueue;                     // JOBS READY TO EXECUTE 
    priority_queue<PriorityJob> waitQueue;     // JOBS WAITING ON I/O
    int loadDelay, timeSlice, IOmin, IOmax;    // SIMULATION PARAMETERS
    int currentTime;                           // CURRENT TIME IN SIMULATION
    int sliceTimeRemaining, loadTimeRemaining; // TIME REMAINING IN JOB SLICE, LOADING
    Die randomizer;                            // RANDOM # GENERATOR (FOR I/O DELAYS)
    int getIOLength();                         // PRIVATE FUNCTION FOR I/O LENGTH
};

#endif
