#include #include #include #include #include #include using namespace std; class job { public: job(char jid, string own, int prty) { jobid = jid; owner = own; priority = prty; } char jobid; string owner; int priority; }; void Submit(list &eventq, char jobid, string owner, int priority); void Run(list &eventq); void Retry(list &eventq, char jobid); void Evict(list &eventq, char jobid); void PrintQueue(list eventq, int printnum); main() { string usr; int prty; // Input *Users* cin >> usr; // Construct a map of users and priorities map users; while(true) { cin >> usr; if(usr.compare("*Events*") == 0) break; cin >> prty; users.insert(pair(usr, prty)); } string event, owner; char jobid; list eventq; int printnum = 1; // Handle Events while(true) { cin >> event; if(cin.eof()) break; if(event.compare("Submit") == 0) { cin >> owner; cin >> jobid; Submit(eventq, jobid, owner, users[owner]); PrintQueue(eventq, printnum); } else if(event.compare("Run") == 0) { Run(eventq); PrintQueue(eventq, printnum); } else if(event.compare("Retry") == 0) { cin >> jobid; Retry(eventq, jobid); PrintQueue(eventq, printnum); } if(event.compare("Evict") == 0) { cin >> jobid; Evict(eventq, jobid); PrintQueue(eventq, printnum); } printnum++; } } void Submit(list &eventq, char jobid, string owner, int priority) { job temp(jobid,owner,priority); // Get an iterator to the position where the new job will be inserted list::iterator it = eventq.begin(); while(it != eventq.end()) { if((*it).owner == "Retry") { it++; } else if((*it).priority <= priority) { it++; } else { break; } } eventq.insert(it, temp); } void Run(list &eventq) { eventq.pop_front(); } void Retry(list &eventq, char jobid) { job temp(jobid, "Retry", 0); // Insert in front eventq.push_front(temp); } void Evict(list &eventq, char jobid) { // Get an iterator to the job to be removed list::iterator it = eventq.begin(); while(it != eventq.end()) { if((*it).jobid != jobid) { it++; } else { break; } } eventq.erase(it); } void PrintQueue(list eventq, int printnum) { // Output the Queue cout << "WQ["; cout.width(4); cout.fill('0'); cout << printnum; cout.width(1); cout << "] = [ "; list::iterator it = eventq.begin(); while(it != eventq.end()) { cout << (*it).jobid << " "; it++; } cout << "]" << endl; }