view 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
line wrap: on
line source
/*
 *	Copyright (c) 2000, Samer Abdallah, King's College London.
 *	All rights reserved.
 *
 *	This software is provided AS iS and WITHOUT ANY WARRANTY; 
 *	without even the implied warranty of MERCHANTABILITY or 
 *	FITNESS FOR A PARTICULAR PURPOSE.
 */

package samer.tools;

/**
  *		This is a task that consists of a list of
  *		sub tasks. The task is no more than the sum
  *		of its subtasks -- ie there can be no extra
  *		processing other than that done by the tasks
  *		in the list. This is why the Task methods
  *		are decalared <code>final</code>.
  */

public class CompoundTask implements Task
{
	private TaskLink head=null, tail=null;

	public CompoundTask() {}
	public CompoundTask(Task t) { addTask(t); }

	public String toString() { return "CompoundTask"; }
	
	// task list implementation

	public void addTask(Task t)
	{
		if (head==null) {
			head=new TaskLink(t,null);
			tail=head;
		} else {
			tail.next=new TaskLink(t,null);
			tail=tail.next;
		}
	}

	public void addTaskAfter(Task t, Task b)
	{
		if (head==null) addTask(t);
		else if (b==null) head=new TaskLink(t,head);
		else {
			TaskLink q=head;
			while (q!=null && q.task!=b) q=q.next;
			if (q!=null) q.next=new TaskLink(t,q.next);
			else addTask(t);
		}
	}

	public void removeTask(Task t)
	{
		TaskLink prev=null;

		for (TaskLink l=head; l!=null; prev=l, l=l.next) {
			if (l.task==t) {
				if (prev!=null) prev.next=l.next;
				else head=l.next;
				if (tail==l) tail=prev;
			}
		}
	}

	public Iterator iterator() { return new Iterator(); }

	// Task implementation

	public final void starting() {
		for (TaskLink l=head; l!=null; l=l.next) l.task.starting();
	}
	public final void stopping() {
		for (TaskLink l=head; l!=null; l=l.next) l.task.stopping();
	}
	public final void run() throws Exception {
		for (TaskLink l=head; l!=null; l=l.next) l.task.run();
	}
	public void dispose() {
		for (TaskLink l=head; l!=null; l=l.next) l.task.dispose();
	}

	// using a linked list for speed
	private static class TaskLink {
		Task		task;
		TaskLink next;

		TaskLink(Task t, TaskLink n) { task=t; next=n; }
	}

	// list iterator
	public class Iterator implements java.util.Iterator {
		TaskLink	l=head;
		public final boolean more() { return l!=null; }
		public final boolean hasNext() { return l!=null; }
		public final Task		next() { Task t=l.task; l=l.next; return t; }
		public final void    remove() { l.task=l.next.task; l.next=l.next.next; }
	}
}