analysis: Bug 489573: Internalize Resources view implementation
[deliverable/tracecompass.git] / analysis / org.eclipse.tracecompass.analysis.os.linux.ui / src / org / eclipse / tracecompass / internal / analysis / os / linux / ui / views / resources / CachingIterator.java
diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/views/resources/CachingIterator.java b/analysis/org.eclipse.tracecompass.analysis.os.linux.ui/src/org/eclipse/tracecompass/internal/analysis/os/linux/ui/views/resources/CachingIterator.java
new file mode 100644 (file)
index 0000000..658ca5c
--- /dev/null
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+
+package org.eclipse.tracecompass.internal.analysis.os.linux.ui.views.resources;
+
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.ITimeEvent;
+
+/**
+ * Caching iterator of time events with a couple extras.
+ * <ul>
+ * <li>peek() allows reading the head without removing it</li>
+ * <li>trim() allows removing a bit of the first event</li>
+ * </ul>
+ *
+ * @author Matthew Khouzam
+ */
+class CachingIterator implements Iterator<@NonNull ITimeEvent>, Comparable<CachingIterator> {
+    private ITimeEvent fEvent;
+    private @NonNull Iterator<@NonNull ? extends ITimeEvent> fIterator;
+    private final Comparator<ITimeEvent> fComparator;
+
+    public CachingIterator(@NonNull Iterator<@NonNull ? extends ITimeEvent> iterator, Comparator<ITimeEvent> comparator) {
+        fIterator = iterator;
+        fComparator = comparator;
+        fEvent = iterator.hasNext() ? iterator.next() : null;
+    }
+
+    @Override
+    public ITimeEvent next() {
+        ITimeEvent retVal = fEvent;
+        fEvent = fIterator.hasNext() ? fIterator.next() : null;
+        if (retVal == null) {
+            throw new NoSuchElementException("Iterator is empty"); //$NON-NLS-1$
+        }
+        return retVal;
+    }
+
+    @Override
+    public boolean hasNext() {
+        return fEvent != null;
+    }
+
+    /**
+     * Retrieves, but does not remove, the next element of this iterator, or
+     * returns {@code null} if this iterator does not have a next.
+     *
+     * @return the next element of the iterator
+     */
+    public ITimeEvent peek() {
+        return fEvent;
+    }
+
+    @Override
+    public int compareTo(CachingIterator o) {
+        final ITimeEvent myEvent = peek();
+        final ITimeEvent otherEvent = o.peek();
+        return fComparator.compare(myEvent, otherEvent);
+    }
+
+    /**
+     * Trims the next element in the iterator to be after a cut-off time.
+     *
+     * @param time
+     *            the cut-off time
+     * @return true if there was a trim
+     */
+    public boolean trim(long time) {
+        if (time <= fEvent.getTime()) {
+            return false;
+        }
+        if (time < fEvent.getTime() + fEvent.getDuration()) {
+            fEvent = fEvent.splitAfter(time);
+            return true;
+        }
+        fEvent = fIterator.hasNext() ? fIterator.next() : null;
+        return true;
+    }
+
+}
\ No newline at end of file
This page took 0.02527 seconds and 5 git commands to generate.