Mercurial > hg > jslab
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; } } }