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 @@
-
-
-
-