53 private final TreeMap<Event, Node> tree =
new TreeMap<Event, Node>(
new EventComparator());
54 private int modCount = 0;
57 Iterator<Node> itr = tree.values().iterator();
58 while (itr.hasNext()) {
59 Node node = itr.next();
68 Node node = tree.get(ev);
72 tree.put(
new EventMapKey(ev), newNode(ev));
77 Node node = tree.get(ev);
81 tree.put(
new EventMapKey(ev), newNode(ev));
86 Node node = tree.get(other);
88 throw new IllegalArgumentException(
"Event not in list.");
89 node.addBefore(ev, other);
94 Node node = tree.get(other);
96 throw new IllegalArgumentException(
"Event not in list.");
97 node.addAfter(ev, other);
102 return isEmpty() ? null : tree.get(tree.firstKey()).events.get(0);
106 Iterator<Node> itr = tree.values().iterator();
107 while (itr.hasNext()) {
108 Node node = itr.next();
109 Event ev = node.getFirstOfClass(cl);
117 Iterator<Node> itr = tree.values().iterator();
118 while (itr.hasNext()) {
119 Node node = itr.next();
120 E ev = node.getFirstOfClass(cl);
128 Node node = tree.get(ev);
131 if (node.remove(ev)) {
133 node.nextNode =
null;
142 Event evKey = tree.firstKey();
143 Node node = tree.get(evKey);
144 Event first = node.events.get(0);
145 node.events.remove(0);
146 if (node.events.isEmpty()) {
148 node.nextNode =
null;
154 public String toString() {
155 StringBuilder sb =
new StringBuilder(
"Contents of the event list RedblackTree:");
156 for (Node node : tree.values()) {
157 for (
Event ev : node.events)
159 +
PrintfFormat.
g(8, 4, ev.priority()) +
" : " + ev.toString());
161 return sb.toString();
164 public Iterator<Event> iterator() {
173 return tree.isEmpty();
176 private static class Node {
178 public Node prevNode =
null;
179 public Node nextNode =
null;
181 public java.util.List<
Event> events =
new LinkedList<Event>();
183 public Node(
Event ev) {
188 ListIterator<Event> itr = events.listIterator();
189 while (itr.hasNext()) {
190 Event listev = itr.next();
191 if (listev == other) {
196 throw new IllegalArgumentException(
"Event not in node.");
199 public void addBefore(Event ev, Event other) {
200 ListIterator<Event> itr = events.listIterator();
201 while (itr.hasNext()) {
202 Event listev = itr.next();
203 if (listev == other) {
209 throw new IllegalArgumentException(
"Event not in node.");
212 public Event getFirstOfClass(String cl) {
213 Iterator<Event> itr = events.iterator();
214 while (itr.hasNext()) {
215 Event listev = itr.next();
216 if (listev.getClass().getName().equals(cl))
222 @SuppressWarnings(
"unchecked")
223 public <E extends Event> E getFirstOfClass(Class<E> cl) {
224 Iterator<Event> itr = events.iterator();
225 while (itr.hasNext()) {
226 Event listev = itr.next();
227 if (listev.getClass() == cl)
236 public boolean remove(Event ev) {
237 Iterator<Event> itr = events.iterator();
238 while (itr.hasNext()) {
239 Event listev = itr.next();
242 return events.isEmpty();
245 throw new IllegalArgumentException(
"Event not in node.");
248 public String toString() {
249 StringBuilder sb =
new StringBuilder();
250 boolean first =
true;
251 Iterator<Event> itr = events.iterator();
252 while (itr.hasNext()) {
257 sb.append(itr.next());
259 return sb.toString();
263 private static class EventComparator
implements Comparator<Event> {
265 public int compare(Event ev1, Event ev2) {
266 return ev1.compareTo(ev2);
270 private class RBItr
implements ListIterator<Event> {
271 private int expectedModCount;
272 private Node prevNode;
273 private Node nextNode;
274 private int prevNodeIndex;
275 private int nextNodeIndex;
276 private int nextIndex;
279 expectedModCount = modCount;
281 nextNode = tree.isEmpty() ? null : (Node) tree.get(tree.firstKey());
286 Iterator<Node> itr = tree.values().iterator();
287 Node lastNode =
null;
288 while (itr.hasNext()) {
289 Node node = itr.next();
290 node.prevNode = lastNode;
291 if (lastNode !=
null)
292 lastNode.nextNode = node;
293 node.nextNode =
null;
298 public void add(Event ev) {
299 throw new UnsupportedOperationException();
302 public boolean hasNext() {
303 if (modCount != expectedModCount)
304 throw new ConcurrentModificationException();
305 return nextNode !=
null && nextNodeIndex < nextNode.events.size();
308 public boolean hasPrevious() {
309 if (modCount != expectedModCount)
310 throw new ConcurrentModificationException();
311 return prevNode !=
null && prevNodeIndex >= 0;
314 public Event next() {
316 throw new NoSuchElementException();
319 Event ev = (Event) nextNode.events.get(nextNodeIndex);
321 prevNodeIndex = nextNodeIndex;
323 if (nextNodeIndex >= nextNode.events.size()) {
324 nextNode = nextNode.nextNode;
330 public int nextIndex() {
332 throw new NoSuchElementException();
337 public Event previous() {
339 throw new NoSuchElementException();
342 Event ev = (Event) prevNode.events.get(prevNodeIndex);
344 nextNodeIndex = prevNodeIndex;
346 if (prevNodeIndex < 0) {
347 prevNode = prevNode.prevNode;
348 if (prevNode !=
null)
349 prevNodeIndex = prevNode.events.size() - 1;
354 public int previousIndex() {
356 throw new NoSuchElementException();
358 return nextIndex - 1;
361 public void remove() {
362 throw new UnsupportedOperationException();
365 public void set(Event ev) {
366 throw new UnsupportedOperationException();
370 private Node newNode(Event ev) {
374 private class EventMapKey
extends Event {
375 public EventMapKey(
Event ev) {
376 this.eventTime = ev.time();
377 this.priority = ev.priority();