X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=net.mograsim.logic.core%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fcore%2Ftimeline%2FTimeline.java;h=4e3146b87e288ff0017751176730cc3f1155e6d1;hb=4afd7c9afe4333815a488f90bdc3c3b9991028f4;hp=fb639bed468d535bd42941c2234b83e1fcb63b0f;hpb=07faf07e3acb8b2afdc2bf65a46bc868faaed0f8;p=Mograsim.git diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/Timeline.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/Timeline.java index fb639bed..4e3146b8 100644 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/Timeline.java +++ b/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/Timeline.java @@ -21,23 +21,33 @@ public class Timeline private final List> eventAddedListener; + public final LongSupplier stepByStepExec = () -> lastTimeUpdated; + public final LongSupplier realTimeExec = () -> System.currentTimeMillis(); + + /** + * Constructs a Timeline object. Per default the time function is set to step by step execution. + * + * @param initCapacity The initial capacity of the event queue. + */ public Timeline(int initCapacity) { - events = new PriorityQueue(initCapacity); - + events = new PriorityQueue<>(initCapacity); eventAddedListener = new ArrayList<>(); - time = () -> lastTimeUpdated; + time = stepByStepExec; } /** * @param timestamp exclusive - * @return true if the first event is later than the timestamp + * @return true if the first event in queue is later than the given timestamp */ public BooleanSupplier laterThan(long timestamp) { return () -> timeCmp(events.peek().getTiming(), timestamp) > 0; } + /** + * @return true if there is at least one event enqueued. false otherwise + */ public boolean hasNext() { return !events.isEmpty(); @@ -53,6 +63,9 @@ public class Timeline executeUntil(laterThan(first.getTiming()), -1); } + /** + * Executes all events enqueued in the {@link Timeline}. Use very carefully! Events may generate new events, causing an infinite loop. + */ public void executeAll() { while (hasNext()) @@ -71,7 +84,6 @@ public class Timeline * EXEC_UNTIL_CONDITION if the condition was met * EXEC_UNTIL_EMPTY if events were executed until the {@link Timeline} was empty * @formatter:on - * @author Christian Femers, Fabian Stemmler */ public ExecutionResult executeUntil(BooleanSupplier condition, long stopMillis) { @@ -97,16 +109,31 @@ public class Timeline return hasNext() ? ExecutionResult.EXEC_UNTIL_EMPTY : ExecutionResult.EXEC_UNTIL_CONDITION; } + /** + * Sets the function, which defines the current simulation time at any time. + * + * @param time The return value of calling this function is the current simulation time. + */ public void setTimeFunction(LongSupplier time) { this.time = time; } + /** + * Calculates the current simulation time. + * + * @return The simulation time as defined by the time function. + */ public long getSimulationTime() { return time.getAsLong(); } + /** + * Retrieves the timestamp of the next event. + * + * @return The timestamp of the next enqueued event, if the {@link Timeline} is not empty, -1 otherwise. + */ public long nextEventTime() { if (!hasNext()) @@ -114,17 +141,26 @@ public class Timeline return events.peek().getTiming(); } + /** + * Clears the {@link Timeline} of enqueued events. + */ public void reset() { events.clear(); lastTimeUpdated = 0; } + /** + * Adds a listener, that is called when a {@link TimelineEvent} is added. + */ public void addEventAddedListener(Consumer listener) { eventAddedListener.add(listener); } + /** + * Removes the listener, if possible. It will no longer be called when a {@link TimelineEvent} is added. + */ public void removeEventAddedListener(Consumer listener) { eventAddedListener.remove(listener);