/* eventPQ.cpp
 *
 * A priority queue class for events.
 */

#include "eventPQ.H"

EventPQ::EventPQ()
{
    head = NULL;
}

Event *
EventPQ::dequeue()
{
    PQnode *p = head;
    Event *e = p->data;

    head = head->next;
    p->next = NULL;
    delete p;
    return e;
}

void
EventPQ::del(Event *e)
{
    PQnode *p = head;
    PQnode *prev = head;

    while(p != NULL && p->data != e) {
	prev = p;
	p = p->next;
    }

    if(head == NULL || p == NULL) {
	cout << "ERROR: trying to delete an event that wasn't scheduled\n";
	return;
    } 
    
    if(head != NULL && head->data == e) {
	head = head->next;
	delete e;
	delete p;
    } else if(p != NULL && p->data == e) {
	prev->next = p->next;
	p->next = NULL;
	delete e;
	delete p;
    }
}

void
EventPQ::enqueue(Event *e)
{
    PQnode *newnode;
    PQnode *p = head;
    PQnode *prev = head;

    while(p != NULL && (Event::compare(e, p->data))){
	prev = p;
	p = p->next;
    }
    
    // found the spot to put the event
    newnode = new PQnode;
    newnode->data = e;
    newnode->next = p;
    if(head == NULL || head == p) {
	head = newnode;
    } else {
	prev->next = newnode;
    }
}


void
EventPQ::print()
{
    cout << "Event List:\n";
    PQnode *p = head;
    while(p != NULL) {
	p->data->print();
    }
    cout << "\n";
}
