From d65803a4b7c021cf579297026fbe10cba5333120 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Fri, 26 Feb 2021 11:57:54 +0000 Subject: [PATCH] add TreeMap facade --- .../feature.xml | 4 + .../database/sqlite/AbstractTxStream.java | 10 +- .../database/text/AbstractTxStream.java | 8 +- .../ui/swt/internal/ArrowPainter.java | 2 +- .../ui/swt/internal/SignalPainter.java | 10 +- .../ui/swt/internal/StreamPainter.java | 11 +- .../ui/swt/internal/WaveformView.java | 8 +- .../scviewer/database/vcd/VCDDbLoader.java | 7 +- .../scviewer/database/vcd/VCDSignal.java | 10 +- .../minres/scviewer/database/EventList.java | 100 ++++++++++++++++++ .../minres/scviewer/database/IEventList.java | 40 +++++++ .../minres/scviewer/database/IWaveform.java | 3 +- .../scviewer.product | 4 - 13 files changed, 178 insertions(+), 39 deletions(-) create mode 100644 plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/EventList.java create mode 100644 plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IEventList.java diff --git a/features/com.minres.scviewer.e4.platform.feature/feature.xml b/features/com.minres.scviewer.e4.platform.feature/feature.xml index 574cc69..5909688 100644 --- a/features/com.minres.scviewer.e4.platform.feature/feature.xml +++ b/features/com.minres.scviewer.e4.platform.feature/feature.xml @@ -29,6 +29,10 @@ id="org.eclipse.emf.common" version="0.0.0"/> + + diff --git a/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/AbstractTxStream.java b/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/AbstractTxStream.java index 86a2ff6..8186585 100644 --- a/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/AbstractTxStream.java +++ b/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/AbstractTxStream.java @@ -14,12 +14,12 @@ import java.sql.SQLException; import java.util.List; import java.util.Map; import java.util.Map.Entry; -import java.util.NavigableMap; -import java.util.TreeMap; import com.minres.scviewer.database.EventKind; import com.minres.scviewer.database.HierNode; import com.minres.scviewer.database.IEvent; +import com.minres.scviewer.database.IEventList; +import com.minres.scviewer.database.EventList; import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.RelationType; import com.minres.scviewer.database.RelationTypeFactory; @@ -35,7 +35,7 @@ abstract class AbstractTxStream extends HierNode implements IWaveform { private Integer maxConcurrency; - private TreeMap events; + private IEventList events; private List usedRelationsList; @@ -71,9 +71,9 @@ abstract class AbstractTxStream extends HierNode implements IWaveform { } @Override - public NavigableMap getEvents(){ + public IEventList getEvents(){ if(events==null){ - events=new TreeMap<>(); + events=new EventList<>(); for(Entry entry:getTransactions().entrySet()){ putEvent(new TxEvent(EventKind.BEGIN, entry.getValue())); putEvent(new TxEvent(EventKind.END, entry.getValue())); diff --git a/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/AbstractTxStream.java b/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/AbstractTxStream.java index b71c974..7c6371c 100644 --- a/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/AbstractTxStream.java +++ b/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/AbstractTxStream.java @@ -15,11 +15,11 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Map.Entry; -import java.util.NavigableMap; -import java.util.TreeMap; +import com.minres.scviewer.database.EventList; import com.minres.scviewer.database.HierNode; import com.minres.scviewer.database.IEvent; +import com.minres.scviewer.database.IEventList; import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.WaveformType; import com.minres.scviewer.database.tx.ITx; @@ -39,7 +39,7 @@ abstract class AbstractTxStream extends HierNode implements IWaveform { protected TextDbLoader loader; /** The events. */ - TreeMap events = new TreeMap<>(); + IEventList events = new EventList(); /** The max concurrency. */ private int rowCount = -1; @@ -89,7 +89,7 @@ abstract class AbstractTxStream extends HierNode implements IWaveform { * @return the events */ @Override - public NavigableMap getEvents() { + public IEventList getEvents() { return events; } diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ArrowPainter.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ArrowPainter.java index f867b70..7a817d3 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ArrowPainter.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/ArrowPainter.java @@ -83,7 +83,7 @@ public class ArrowPainter implements IPainter { } private int getConcurrencyIndex(ITx tx) { - IEvent[] eventList = tx.getStream().getEvents().floorEntry(tx.getBeginTime()).getValue(); + IEvent[] eventList = tx.getStream().getEventsBeforeTime(tx.getBeginTime()); Optional res = Arrays.stream(eventList).map(e -> ((ITxEvent)e).getRowIndex()).findFirst(); return res.isPresent()? res.get():0; } diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/SignalPainter.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/SignalPainter.java index 40a5bc9..d4469c2 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/SignalPainter.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/SignalPainter.java @@ -13,7 +13,6 @@ package com.minres.scviewer.database.ui.swt.internal; import java.util.Arrays; import java.util.Collection; import java.util.Map.Entry; -import java.util.NavigableMap; import javax.swing.JPanel; @@ -27,6 +26,7 @@ import org.eclipse.swt.graphics.Rectangle; import com.minres.scviewer.database.BitVector; import com.minres.scviewer.database.DoubleVal; import com.minres.scviewer.database.IEvent; +import com.minres.scviewer.database.IEventList; import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.ui.TrackEntry; import com.minres.scviewer.database.ui.WaveformColors; @@ -112,7 +112,7 @@ public class SignalPainter extends TrackPainter { proj.setForeground(this.waveCanvas.styleProvider.getColor(WaveformColors.LINE)); proj.setLineStyle(SWT.LINE_SOLID); proj.setLineWidth(1); - NavigableMap entries = signal.getEvents().subMap(first.getKey(), false, last.getKey(), true); + IEventList entries = signal.getEvents().subMap(first.getKey(), false, last.getKey(), true); SignalChange left = new SignalChange(first); SignalChange right = new SignalChange(entries.size() > 0 ? entries.firstEntry() : first); maxPosX = area.x + area.width; @@ -161,7 +161,7 @@ public class SignalPainter extends TrackPainter { } while (left.time < endTime); } - private SignalStencil getStencil(GC gc, SignalChange left, NavigableMap entries) { + private SignalStencil getStencil(GC gc, SignalChange left, IEventList entries) { IEvent val = left.value; if(val instanceof BitVector) { BitVector bv = (BitVector) val; @@ -253,7 +253,7 @@ public class SignalPainter extends TrackPainter { private long maxVal; private long minVal; double yRange = (yOffsetB-yOffsetT); - public MultiBitStencilAnalog(NavigableMap entries, Object left, boolean continous, boolean signed) { + public MultiBitStencilAnalog(IEventList entries, Object left, boolean continous, boolean signed) { this.continous=continous; this.signed=signed; Collection values = entries.values(); @@ -358,7 +358,7 @@ public class SignalPainter extends TrackPainter { boolean continous=true; - public RealStencil(NavigableMap entries, Object left, boolean continous) { + public RealStencil(IEventList entries, Object left, boolean continous) { this.continous=continous; Collection values = entries.values(); minVal=(Double) left; diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/StreamPainter.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/StreamPainter.java index 1d451fe..33a4d9f 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/StreamPainter.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/StreamPainter.java @@ -11,7 +11,6 @@ package com.minres.scviewer.database.ui.swt.internal; import java.util.Map.Entry; -import java.util.NavigableMap; import java.util.TreeMap; import org.eclipse.swt.SWT; @@ -21,6 +20,7 @@ import org.eclipse.swt.graphics.Rectangle; import com.minres.scviewer.database.EventKind; import com.minres.scviewer.database.IEvent; +import com.minres.scviewer.database.IEventList; import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.tx.ITx; import com.minres.scviewer.database.tx.ITxEvent; @@ -36,6 +36,7 @@ public class StreamPainter extends TrackPainter{ private IWaveform stream; private int txBase; private int txHeight; + // TODO: remove TreeMap usage private TreeMap seenTx; public StreamPainter(WaveformCanvas waveCanvas, boolean even, TrackEntry trackEntry) { @@ -87,7 +88,7 @@ public class StreamPainter extends TrackPainter{ drawTx(proj, area, ((ITxEvent)txEvent).getTransaction(), ((ITxEvent)txEvent).getRowIndex(), false); }else{ seenTx.clear(); - NavigableMap entries = stream.getEvents().subMap(firstTx.getKey(), true, lastTx.getKey(), true); + IEventList entries = stream.getEvents().subMap(firstTx.getKey(), true, lastTx.getKey(), true); ITxEvent highlighed=null; proj.setForeground(this.waveCanvas.styleProvider.getColor(WaveformColors.LINE)); long selectedId=waveCanvas.currentSelection!=null? waveCanvas.currentSelection.getId():-1; @@ -157,7 +158,7 @@ public class StreamPainter extends TrackPainter{ Entry firstTx=stream.getEvents().floorEntry(point.x*waveCanvas.getScaleFactor()); if(firstTx!=null){ do { - ITx tx = getTxFromEntry(lane, point.x, firstTx); + ITx tx = getTxFromEntry(lane, point.x, firstTx.getValue()); if(tx!=null) return tx; firstTx=stream.getEvents().lowerEntry(firstTx.getKey()); }while(firstTx!=null); @@ -173,11 +174,11 @@ public class StreamPainter extends TrackPainter{ this.stream = stream; } - protected ITx getTxFromEntry(int lane, int offset, Entry firstTx) { + protected ITx getTxFromEntry(int lane, int offset, IEvent[] firstTx) { long timePoint=offset*waveCanvas.getScaleFactor(); long timePointLow=(offset-5)*waveCanvas.getScaleFactor(); long timePointHigh=(offset+5)*waveCanvas.getScaleFactor(); - for(IEvent e:firstTx.getValue()){ + for(IEvent e:firstTx){ if(e instanceof ITxEvent) { ITxEvent evt = (ITxEvent) e; ITx tx=evt.getTransaction(); diff --git a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java index 3ab9cca..2f10f9e 100644 --- a/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java +++ b/plugins/com.minres.scviewer.database.ui.swt/src/com/minres/scviewer/database/ui/swt/internal/WaveformView.java @@ -21,7 +21,6 @@ import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Map.Entry; -import java.util.NavigableMap; import java.util.NoSuchElementException; import java.util.Optional; import java.util.TreeMap; @@ -79,6 +78,7 @@ import com.minres.scviewer.database.BitVector; import com.minres.scviewer.database.DoubleVal; import com.minres.scviewer.database.EventKind; import com.minres.scviewer.database.IEvent; +import com.minres.scviewer.database.IEventList; import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.RelationType; import com.minres.scviewer.database.WaveformType; @@ -259,11 +259,11 @@ public class WaveformView implements IWaveformView { Entry ceilEntry = null; if (o instanceof TrackEntry) { TrackEntry entry = (TrackEntry) o; - NavigableMap map = entry.waveform.getEvents(); + IEventList map = entry.waveform.getEvents(); floorEntry = map.floorEntry(time); ceilEntry = map.ceilingEntry(time); } else if (o instanceof ITx) { - NavigableMap map = ((ITx) o).getStream().getEvents(); + IEventList map = ((ITx) o).getStream().getEvents(); floorEntry = map.floorEntry(time); ceilEntry = map.ceilingEntry(time); } @@ -958,7 +958,7 @@ public class WaveformView implements IWaveformView { return; TrackEntry sel = currentWaveformSelection.get(0); long time = getCursorTime(); - NavigableMap map = null; + IEventList map = null; if (sel.waveform.getType() == WaveformType.TRANSACTION || sel.waveform.getType() == WaveformType.SIGNAL) { map = sel.waveform.getEvents(); } diff --git a/plugins/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDDbLoader.java b/plugins/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDDbLoader.java index 0481975..ee5ce50 100644 --- a/plugins/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDDbLoader.java +++ b/plugins/com.minres.scviewer.database.vcd/src/com/minres/scviewer/database/vcd/VCDDbLoader.java @@ -20,8 +20,6 @@ import java.util.ArrayDeque; import java.util.Collection; import java.util.Collections; import java.util.List; -import java.util.NavigableMap; -import java.util.TreeMap; import java.util.Vector; import java.util.zip.GZIPInputStream; @@ -29,6 +27,7 @@ import com.google.common.collect.Iterables; import com.minres.scviewer.database.BitVector; import com.minres.scviewer.database.DoubleVal; import com.minres.scviewer.database.IEvent; +import com.minres.scviewer.database.IEventList; import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveformDb; import com.minres.scviewer.database.IWaveformDbLoader; @@ -118,14 +117,14 @@ public class VCDDbLoader implements IWaveformDbLoader, IVCDDatabaseBuilder { if(!res) throw new InputFormatException("Could not parse VCD file"); // calculate max time of this database for(IWaveform waveform:signals) { - NavigableMap events =waveform.getEvents(); + IEventList events =waveform.getEvents(); if(!events.isEmpty()) maxTime= Math.max(maxTime, events.lastKey()); } // extend signals to have a last value set at max time for(IWaveform s:signals){ if(s instanceof VCDSignal) { - TreeMap events = (TreeMap) ((VCDSignal)s).getEvents(); + IEventList events = ((VCDSignal)s).getEvents(); if(events.size()>0 && events.lastKey() extends HierNode implements IWaveform { private final int width; - private NavigableMap values; + private IEventList values; public VCDSignal(String name) { this(0, name, 1); @@ -42,7 +42,7 @@ public class VCDSignal extends HierNode implements IWaveform { fullName=name; this.id=id; this.width=width; - this.values=new TreeMap<>(); + this.values=new EventList<>(); } public VCDSignal(VCDSignal o, int id, String name) { @@ -80,7 +80,7 @@ public class VCDSignal extends HierNode implements IWaveform { } @Override - public NavigableMap getEvents() { + public IEventList getEvents() { return values; } diff --git a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/EventList.java b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/EventList.java new file mode 100644 index 0000000..f059d35 --- /dev/null +++ b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/EventList.java @@ -0,0 +1,100 @@ +package com.minres.scviewer.database; + +import java.util.Collection; +import java.util.Map.Entry; +import java.util.NavigableMap; +import java.util.TreeMap; + +public class EventList implements IEventList{ + + NavigableMap backing ; + + public EventList() { + backing=new TreeMap<>(); + } + + public EventList(NavigableMap subMap) { + backing=subMap; + } + + @Override + public Entry floorEntry(K key) { + return backing.floorEntry(key); + } + + @Override + public Entry ceilingEntry(K key) { + return backing.ceilingEntry(key); + } + + @Override + public Entry firstEntry() { + return backing.firstEntry(); + } + + @Override + public Entry lastEntry() { + return backing.lastEntry(); + } + + @Override + public V get(K key) { + return backing.get(key); + } + + @Override + public Entry higherEntry(K key) { + return backing.higherEntry(key); + } + + @Override + public Entry lowerEntry(K key) { + return backing.lowerEntry(key); + } + + @Override + public IEventList subMap(K key, boolean b, K key2, boolean c) { + return new EventList( backing.subMap(key, b, key2, c)); + } + + @Override + public int size() { + return backing.size(); + } + + @Override + public Collection keys() { + return backing.keySet(); + } + + @Override + public Collection values() { + return backing.values(); + } + + @Override + public boolean containsKey(K key) { + return backing.containsKey(key); + } + + @Override + public V put(K key, V value) { + return backing.put(key, value); + } + + @Override + public Collection> entrySet() { + return backing.entrySet(); + } + + @Override + public boolean isEmpty() { + return backing.isEmpty(); + } + + @Override + public K lastKey() { + return backing.lastKey(); + } + +} diff --git a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IEventList.java b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IEventList.java new file mode 100644 index 0000000..d94e81a --- /dev/null +++ b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IEventList.java @@ -0,0 +1,40 @@ +package com.minres.scviewer.database; + +import java.util.Collection; +import java.util.Map.Entry; + +public interface IEventList { + + Entry floorEntry(K key); + + Entry ceilingEntry(K key); + + Entry firstEntry(); + + Entry lastEntry(); + + V get(K key); + + Entry higherEntry(K key); + + Entry lowerEntry(K key); + + IEventList subMap(K key, boolean b, K key2, boolean c); + + int size(); + + Collection keys(); + + Collection values(); + + boolean containsKey(K key); + + V put(K key, V value); + + Collection> entrySet(); + + boolean isEmpty(); + + K lastKey(); + +} diff --git a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveform.java b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveform.java index c96b04a..a35ddd5 100644 --- a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveform.java +++ b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/IWaveform.java @@ -10,7 +10,6 @@ *******************************************************************************/ package com.minres.scviewer.database; -import java.util.NavigableMap; // TODO: Auto-generated Javadoc /** @@ -40,7 +39,7 @@ public interface IWaveform extends IHierNode { * * @return the events */ - public NavigableMap getEvents(); + public IEventList getEvents(); /** * Gets the events at time. diff --git a/products/com.minres.scviewer.e4.product/scviewer.product b/products/com.minres.scviewer.e4.product/scviewer.product index 547dc2e..a821eb7 100644 --- a/products/com.minres.scviewer.e4.product/scviewer.product +++ b/products/com.minres.scviewer.e4.product/scviewer.product @@ -51,17 +51,13 @@ - - - -