annotate src/samer/tools/CompoundTask.java @ 8:5e3cbbf173aa tip

Reorganise some more
author samer
date Fri, 05 Apr 2019 22:41:58 +0100
parents bf79fb79ee13
children
rev   line source
samer@0 1 /*
samer@0 2 * Copyright (c) 2000, Samer Abdallah, King's College London.
samer@0 3 * All rights reserved.
samer@0 4 *
samer@0 5 * This software is provided AS iS and WITHOUT ANY WARRANTY;
samer@0 6 * without even the implied warranty of MERCHANTABILITY or
samer@0 7 * FITNESS FOR A PARTICULAR PURPOSE.
samer@0 8 */
samer@0 9
samer@0 10 package samer.tools;
samer@0 11
samer@0 12 /**
samer@0 13 * This is a task that consists of a list of
samer@0 14 * sub tasks. The task is no more than the sum
samer@0 15 * of its subtasks -- ie there can be no extra
samer@0 16 * processing other than that done by the tasks
samer@0 17 * in the list. This is why the Task methods
samer@0 18 * are decalared <code>final</code>.
samer@0 19 */
samer@0 20
samer@0 21 public class CompoundTask implements Task
samer@0 22 {
samer@0 23 private TaskLink head=null, tail=null;
samer@0 24
samer@0 25 public CompoundTask() {}
samer@0 26 public CompoundTask(Task t) { addTask(t); }
samer@0 27
samer@0 28 public String toString() { return "CompoundTask"; }
samer@0 29
samer@0 30 // task list implementation
samer@0 31
samer@0 32 public void addTask(Task t)
samer@0 33 {
samer@0 34 if (head==null) {
samer@0 35 head=new TaskLink(t,null);
samer@0 36 tail=head;
samer@0 37 } else {
samer@0 38 tail.next=new TaskLink(t,null);
samer@0 39 tail=tail.next;
samer@0 40 }
samer@0 41 }
samer@0 42
samer@0 43 public void addTaskAfter(Task t, Task b)
samer@0 44 {
samer@0 45 if (head==null) addTask(t);
samer@0 46 else if (b==null) head=new TaskLink(t,head);
samer@0 47 else {
samer@0 48 TaskLink q=head;
samer@0 49 while (q!=null && q.task!=b) q=q.next;
samer@0 50 if (q!=null) q.next=new TaskLink(t,q.next);
samer@0 51 else addTask(t);
samer@0 52 }
samer@0 53 }
samer@0 54
samer@0 55 public void removeTask(Task t)
samer@0 56 {
samer@0 57 TaskLink prev=null;
samer@0 58
samer@0 59 for (TaskLink l=head; l!=null; prev=l, l=l.next) {
samer@0 60 if (l.task==t) {
samer@0 61 if (prev!=null) prev.next=l.next;
samer@0 62 else head=l.next;
samer@0 63 if (tail==l) tail=prev;
samer@0 64 }
samer@0 65 }
samer@0 66 }
samer@0 67
samer@0 68 public Iterator iterator() { return new Iterator(); }
samer@0 69
samer@0 70 // Task implementation
samer@0 71
samer@0 72 public final void starting() {
samer@0 73 for (TaskLink l=head; l!=null; l=l.next) l.task.starting();
samer@0 74 }
samer@0 75 public final void stopping() {
samer@0 76 for (TaskLink l=head; l!=null; l=l.next) l.task.stopping();
samer@0 77 }
samer@0 78 public final void run() throws Exception {
samer@0 79 for (TaskLink l=head; l!=null; l=l.next) l.task.run();
samer@0 80 }
samer@0 81 public void dispose() {
samer@0 82 for (TaskLink l=head; l!=null; l=l.next) l.task.dispose();
samer@0 83 }
samer@0 84
samer@0 85 // using a linked list for speed
samer@0 86 private static class TaskLink {
samer@0 87 Task task;
samer@0 88 TaskLink next;
samer@0 89
samer@0 90 TaskLink(Task t, TaskLink n) { task=t; next=n; }
samer@0 91 }
samer@0 92
samer@0 93 // list iterator
samer@0 94 public class Iterator implements java.util.Iterator {
samer@0 95 TaskLink l=head;
samer@0 96 public final boolean more() { return l!=null; }
samer@0 97 public final boolean hasNext() { return l!=null; }
samer@0 98 public final Task next() { Task t=l.task; l=l.next; return t; }
samer@0 99 public final void remove() { l.task=l.next.task; l.next=l.next.next; }
samer@0 100 }
samer@0 101 }