major refactoring, added token inboxes/outboxes
[fleet.git] / src / edu / berkeley / fleet / CodeBag.java
1 package edu.berkeley.fleet;
2
3 import java.util.*;
4
5 /** a codebag */
6 public class CodeBag {
7
8     private static int max_allocated_descriptor = 1;
9     private static HashMap<Integer,CodeBag> codeBagsByDescriptor = new HashMap<Integer,CodeBag>();
10
11     public static CodeBag getCodeBagByDescriptor(int descriptor) {
12         return codeBagsByDescriptor.get(descriptor);
13     }
14
15     private final int descriptor;
16     private final CodeBag parent;
17     private final String name;
18     private ArrayList<Dispatchable> dispatchables = new ArrayList<Dispatchable>();
19     private HashMap<String,CodeBag> codeBags = new HashMap<String,CodeBag>();
20
21     public CodeBag(CodeBag parent, String name) {
22         this.parent = parent;
23         this.name = name;
24         this.descriptor = max_allocated_descriptor++;
25         codeBagsByDescriptor.put(descriptor, this);
26         if (parent != null && name != null)
27             parent.add(name, this);
28     }
29
30     public void dispatch(Fleet fleet) {
31         for(Dispatchable d : dispatchables) {
32             Log.dispatch(d);
33             d.dispatch(fleet);
34         }
35     }
36
37     public void add(Dispatchable instr) {
38         dispatchables.add(instr);
39     }
40
41     public void add(String name, CodeBag instr) {
42         codeBags.put(name, instr);
43     }
44
45     public int getDescriptor() {
46         return descriptor;
47     }
48
49     public CodeBag getCodeBag(String name) {
50         CodeBag ret = codeBags.get(name);
51         if (ret != null) return ret;
52         if (parent==null) return null;
53         return parent.getCodeBag(name);
54     }
55
56     public String toString() {
57         if (name != null) return name;
58         StringBuffer ret = new StringBuffer();
59         for(Dispatchable d : dispatchables) {
60             ret.append(d);
61             ret.append("\n");
62         }
63         for(String n : codeBags.keySet()) {
64             ret.append(n + ": ");
65             ret.append(codeBags.get(n));
66             ret.append("\n");
67         }
68         return "{\n  "+Log.indent(ret.toString(), "  ")+"\n}";
69     }
70
71
72 }