Added adapters for OrGate and NotGate
authorDaniel Kirschten <daniel.kirschten@gmx.de>
Wed, 29 May 2019 14:57:19 +0000 (16:57 +0200)
committerDaniel Kirschten <daniel.kirschten@gmx.de>
Wed, 29 May 2019 14:57:19 +0000 (16:57 +0200)
LogicUI/src/era/mi/gui/modeladapter/ViewLogicModelAdapter.java
LogicUI/src/era/mi/gui/modeladapter/componentadapters/AndGateAdapter.java [deleted file]
LogicUI/src/era/mi/gui/modeladapter/componentadapters/SimpleGateAdapter.java [new file with mode: 0644]

index d159b60..c64ae97 100644 (file)
@@ -14,12 +14,17 @@ import java.util.stream.Collectors;
 import era.mi.gui.model.ViewModel;
 import era.mi.gui.model.components.GUIAndGate;
 import era.mi.gui.model.components.GUIComponent;
+import era.mi.gui.model.components.GUINotGate;
+import era.mi.gui.model.components.GUIOrGate;
 import era.mi.gui.model.wires.GUIWire;
 import era.mi.gui.model.wires.Pin;
 import era.mi.gui.model.wires.WireCrossPoint;
-import era.mi.gui.modeladapter.componentadapters.AndGateAdapter;
 import era.mi.gui.modeladapter.componentadapters.ComponentAdapter;
+import era.mi.gui.modeladapter.componentadapters.SimpleGateAdapter;
 import era.mi.logic.components.Component;
+import era.mi.logic.components.gates.AndGate;
+import era.mi.logic.components.gates.NotGate;
+import era.mi.logic.components.gates.OrGate;
 import era.mi.logic.timeline.Timeline;
 import era.mi.logic.wires.Wire;
 import era.mi.logic.wires.Wire.ReadEnd;
@@ -30,7 +35,9 @@ public class ViewLogicModelAdapter
        static
        {
                Map<Class<? extends GUIComponent>, ComponentAdapter<? extends GUIComponent>> componentAdaptersModifiable = new HashMap<>();
-               componentAdaptersModifiable.put(GUIAndGate.class, new AndGateAdapter());
+               componentAdaptersModifiable.put(GUIOrGate.class, new SimpleGateAdapter(OrGate::new));
+               componentAdaptersModifiable.put(GUIAndGate.class, new SimpleGateAdapter(AndGate::new));
+               componentAdaptersModifiable.put(GUINotGate.class, new SimpleGateAdapter((t, p, o, i) -> new NotGate(t, p, i[0], o)));
                // TODO list all "primitive" adapters here
                componentAdapters = Collections.unmodifiableMap(componentAdaptersModifiable);
        }
@@ -40,7 +47,9 @@ public class ViewLogicModelAdapter
                // TODO replace Timeline with LogicModel as soon as it exists
                Timeline timeline = new Timeline(10);
 
-               Map<Pin, Wire> logicWiresPerPin = convertWires(viewModel.getWires(), params, timeline);
+               Map<Pin, Wire> logicWiresPerPin = convertWires(
+                               viewModel.getComponents().stream().flatMap(component -> component.getPins().stream()).collect(Collectors.toSet()),
+                               viewModel.getWires(), params, timeline);
                Map<Pin, Wire> logicWiresPerPinUnmodifiable = Collections.unmodifiableMap(logicWiresPerPin);
 
                Map<GUIComponent, Component> oneToOneComponents = new HashMap<>();
@@ -60,9 +69,9 @@ public class ViewLogicModelAdapter
                return timeline;
        }
 
-       private static Map<Pin, Wire> convertWires(List<GUIWire> wires, LogicModelParameters params, Timeline timeline)
+       private static Map<Pin, Wire> convertWires(Set<Pin> allPins, List<GUIWire> wires, LogicModelParameters params, Timeline timeline)
        {
-               Map<Pin, Set<Pin>> connectedPinGroups = getConnectedPinGroups(wires);
+               Map<Pin, Set<Pin>> connectedPinGroups = getConnectedPinGroups(allPins, wires);
                Map<Pin, Wire> logicWiresPerPin = createLogicWires(params, timeline, connectedPinGroups);
                setGUIWiresLogicModelBinding(wires, logicWiresPerPin);
                return logicWiresPerPin;
@@ -80,22 +89,30 @@ public class ViewLogicModelAdapter
 
        private static void setGUIWiresLogicModelBinding(List<GUIWire> wires, Map<Pin, Wire> logicWiresPerPin)
        {
-               Map<Wire, ReadEnd> guiWireSharedReadEnd = logicWiresPerPin.values().stream()
+               Map<Wire, ReadEnd> guiWireSharedReadEnd = logicWiresPerPin.values().stream().distinct()
                                .collect(Collectors.toMap(Function.identity(), Wire::createReadOnlyEnd));
                for (GUIWire guiWire : wires)
                        guiWire.setLogicModelBinding(guiWireSharedReadEnd.get(logicWiresPerPin.get(guiWire.getPin1())));
        }
 
-       private static Map<Pin, Set<Pin>> getConnectedPinGroups(List<GUIWire> wires)
+       private static Map<Pin, Set<Pin>> getConnectedPinGroups(Set<Pin> allPins, List<GUIWire> wires)
        {
                Map<Pin, Set<Pin>> connectedPinsPerPin = new HashMap<>();
+
+               for (Pin p : allPins)
+               {
+                       HashSet<Pin> connectedPins = new HashSet<>();
+                       connectedPins.add(p);
+                       connectedPinsPerPin.put(p, connectedPins);
+               }
+
                wires.forEach(wire ->
                {
                        Pin pin1 = wire.getPin1();
                        Pin pin2 = wire.getPin2();
 
-                       Set<Pin> pin1ConnectedPins = connectedPinsPerPin.putIfAbsent(pin1, new HashSet<>());
-                       Set<Pin> pin2ConnectedPins = connectedPinsPerPin.putIfAbsent(pin2, new HashSet<>());
+                       Set<Pin> pin1ConnectedPins = connectedPinsPerPin.get(pin1);
+                       Set<Pin> pin2ConnectedPins = connectedPinsPerPin.get(pin2);
 
                        pin1ConnectedPins.addAll(pin2ConnectedPins);
                        pin1ConnectedPins.add(pin1);
@@ -110,6 +127,8 @@ public class ViewLogicModelAdapter
        private static <G extends GUIComponent> Component createAndLinkComponent(Timeline timeline, LogicModelParameters params,
                        GUIComponent guiComponent, Map<Pin, Wire> logicWiresPerPin, ComponentAdapter<G> adapter)
        {
+               if (adapter == null)
+                       throw new IllegalArgumentException("Unknown component class: " + guiComponent.getClass());
                return adapter.createAndLinkComponent(timeline, params, (G) guiComponent, logicWiresPerPin);
        }
 
diff --git a/LogicUI/src/era/mi/gui/modeladapter/componentadapters/AndGateAdapter.java b/LogicUI/src/era/mi/gui/modeladapter/componentadapters/AndGateAdapter.java
deleted file mode 100644 (file)
index 3b34d90..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-package era.mi.gui.modeladapter.componentadapters;
-
-import java.util.List;
-import java.util.Map;
-
-import era.mi.gui.model.components.GUIAndGate;
-import era.mi.gui.model.wires.Pin;
-import era.mi.gui.modeladapter.LogicModelParameters;
-import era.mi.logic.components.Component;
-import era.mi.logic.components.gates.AndGate;
-import era.mi.logic.timeline.Timeline;
-import era.mi.logic.wires.Wire;
-import era.mi.logic.wires.Wire.ReadEnd;
-import era.mi.logic.wires.Wire.ReadWriteEnd;
-
-public class AndGateAdapter implements ComponentAdapter<GUIAndGate>
-{
-       @Override
-       public Component createAndLinkComponent(Timeline timeline, LogicModelParameters params, GUIAndGate guiComponent,
-                       Map<Pin, Wire> logicWiresPerPin)
-       {
-               ReadWriteEnd out = logicWiresPerPin.get(guiComponent.getOutputPin()).createReadWriteEnd();
-               List<Pin> inputPins = guiComponent.getInputPins();
-               ReadEnd[] ins = new ReadEnd[inputPins.size()];
-               for (int i = 0; i < inputPins.size(); i++)
-                       ins[i] = logicWiresPerPin.get(inputPins.get(i)).createReadOnlyEnd();
-               return new AndGate(timeline, params.gateProcessTime, out, ins);
-       }
-}
\ No newline at end of file
diff --git a/LogicUI/src/era/mi/gui/modeladapter/componentadapters/SimpleGateAdapter.java b/LogicUI/src/era/mi/gui/modeladapter/componentadapters/SimpleGateAdapter.java
new file mode 100644 (file)
index 0000000..e256ff0
--- /dev/null
@@ -0,0 +1,40 @@
+package era.mi.gui.modeladapter.componentadapters;
+
+import java.util.List;
+import java.util.Map;
+
+import era.mi.gui.model.components.SimpleRectangularGUIGate;
+import era.mi.gui.model.wires.Pin;
+import era.mi.gui.modeladapter.LogicModelParameters;
+import era.mi.logic.components.Component;
+import era.mi.logic.timeline.Timeline;
+import era.mi.logic.wires.Wire;
+import era.mi.logic.wires.Wire.ReadEnd;
+import era.mi.logic.wires.Wire.ReadWriteEnd;
+
+public class SimpleGateAdapter implements ComponentAdapter<SimpleRectangularGUIGate>
+{
+       private final ComponentConstructor constructor;
+
+       public SimpleGateAdapter(ComponentConstructor constructor)
+       {
+               this.constructor = constructor;
+       }
+
+       @Override
+       public Component createAndLinkComponent(Timeline timeline, LogicModelParameters params, SimpleRectangularGUIGate guiComponent,
+                       Map<Pin, Wire> logicWiresPerPin)
+       {
+               ReadWriteEnd out = logicWiresPerPin.get(guiComponent.getOutputPin()).createReadWriteEnd();
+               List<Pin> inputPins = guiComponent.getInputPins();
+               ReadEnd[] ins = new ReadEnd[inputPins.size()];
+               for (int i = 0; i < inputPins.size(); i++)
+                       ins[i] = logicWiresPerPin.get(inputPins.get(i)).createReadOnlyEnd();
+               return constructor.newComponent(timeline, params.gateProcessTime, out, ins);
+       }
+
+       public static interface ComponentConstructor
+       {
+               public Component newComponent(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd[] ins);
+       }
+}
\ No newline at end of file