ActiveInstructionChangedListener moved to Machine and updated
[Mograsim.git] / plugins / net.mograsim.machine / src / net / mograsim / machine / mi / AssignableMicroInstructionMemory.java
1 package net.mograsim.machine.mi;
2
3 import java.util.HashSet;
4 import java.util.Set;
5
6 import net.mograsim.machine.Memory.MemoryCellModifiedListener;
7
8 public class AssignableMicroInstructionMemory implements MicroInstructionMemory, MemoryCellModifiedListener
9 {
10
11         private Set<MemoryCellModifiedListener> observers = new HashSet<>();
12
13         private Set<MIMemoryReassignedListener> reassignmentListeners = new HashSet<>();
14         private MicroInstructionMemory real = null;
15
16         public AssignableMicroInstructionMemory(StandardMicroInstructionMemory standardMicroInstructionMemory)
17         {
18                 real = standardMicroInstructionMemory;
19                 real.registerCellModifiedListener(this);
20         }
21
22         public void bind(MicroInstructionMemory real)
23         {
24                 this.real.deregisterCellModifiedListener(this);
25                 this.real = real;
26                 real.registerCellModifiedListener(this);
27                 notifyMemoryChanged(-1);
28                 notifyMemoryReassigned(real);
29         }
30
31         @Override
32         public MicroInstruction getCell(long address)
33         {
34                 return real.getCell(address);
35         }
36
37         @Override
38         public void setCell(long address, MicroInstruction data)
39         {
40                 real.setCell(address, data);
41         }
42
43         @Override
44         public void registerCellModifiedListener(MemoryCellModifiedListener ob)
45         {
46                 observers.add(ob);
47         }
48
49         @Override
50         public void deregisterCellModifiedListener(MemoryCellModifiedListener ob)
51         {
52                 observers.remove(ob);
53         }
54
55         private void notifyMemoryChanged(long address)
56         {
57                 observers.forEach(o -> o.update(address));
58         }
59
60         @Override
61         public MicroInstructionMemoryDefinition getDefinition()
62         {
63                 return real.getDefinition();
64         }
65
66         @Override
67         public void update(long address)
68         {
69                 notifyMemoryChanged(address);
70         }
71
72         public void registerMemoryReassignedListener(MIMemoryReassignedListener listener)
73         {
74                 reassignmentListeners.add(listener);
75         }
76
77         public void deregisterMemoryReassignedListener(MIMemoryReassignedListener listener)
78         {
79                 reassignmentListeners.remove(listener);
80         }
81
82         private void notifyMemoryReassigned(MicroInstructionMemory newAssignee)
83         {
84                 reassignmentListeners.forEach(l -> l.reassigned(newAssignee));
85         }
86
87         public static interface MIMemoryReassignedListener
88         {
89                 public void reassigned(MicroInstructionMemory newAssignee);
90         }
91 }