git @ Cat's Eye Technologies JaC64 / master com / dreamfabric / jac64 / EventQueue.java
master

Tree @master (Download .tar.gz)

EventQueue.java @masterraw · history · blame

package com.dreamfabric.jac64;

public class EventQueue {

  private TimeEvent first;
  public long nextTime;

  public EventQueue() {
  }

  public void addEvent(TimeEvent event, long time) {
    event.time = time;
    addEvent(event);
  }

  public void addEvent(TimeEvent event) {
    if (event.scheduled) {
      removeEvent(event);
    }
    if (first == null) {
      first = event;
    } else {
      TimeEvent pos = first;
      TimeEvent lastPos = first;
      while (pos != null && pos.time < event.time) {
        lastPos = pos;
        pos = pos.nextEvent;
      }
      // Here pos will be the first TE after event
      // and lastPos the first before
      if (pos == first) {
        // Before all other
        event.nextEvent = pos;
        first = event;
      } else {
        event.nextEvent = pos;
        lastPos.nextEvent = event;
      }
    }
    if (first != null) {
      nextTime = first.time;
    } else {
      nextTime = 0;
    }
    event.scheduled = true;
  }

  // Not yet impl.
  public boolean removeEvent(TimeEvent event) {
    TimeEvent pos = first;
    TimeEvent lastPos = first;
//    System.out.println("Removing: " + event.getShort() + "  Before remove: ");
//    print();
    while (pos != null && pos != event) {
      lastPos = pos;
      pos = pos.nextEvent;
    }
    if (pos == null) return false;
    // pos == event!
    if (pos == first) {
      // remove it from first pos.
      first = pos.nextEvent;
    } else {
      // else link prev to next...
      lastPos.nextEvent = pos.nextEvent;
    }
    // unlink
    pos.nextEvent = null;

    if (first != null) {
      nextTime = first.time;
    } else {
      nextTime = 0;
    }
//    System.out.println("Removed =>");
//    print();
    event.scheduled = false;
    return true;
  }

  public TimeEvent popFirst() {
    TimeEvent tmp = first;
    if (tmp != null) {
      first = tmp.nextEvent;
      // Unlink.
      tmp.nextEvent = null;
    }

    if (first != null) {
      nextTime = first.time;
    } else {
      nextTime = 0;
    }
    tmp.scheduled = false;
    return tmp;
  }

  public void print() {
    TimeEvent t = first;
    System.out.print("nxt: " + nextTime + " [");
    while(t != null) {
      System.out.print(t.getShort());
      t = t.nextEvent;
      if (t != null) System.out.print(", ");
    }
    System.out.println("]");
  }

  public void empty() {
	  first = null;
	  nextTime = 0;
  }
} // LLEventQueue