content: /**
   * Copyright 2020 Alexander Herzog
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   * http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  package simcore.eventmanager;
  
  import java.util.List;
  
  import simcore.Event;
  import simcore.SimData;
  
  /**
   * Interface fr alle EventManager-Implementierungen<br><br>
   * Konkrete Implementierungen sollten von <code>EventManagerBase</code> abgeleitet werden,
   * da diese Klasse bereits alle wichtigen Methoden, die nicht direkt mit der Speicherung
   * der Ereignisse zu tun haben, implementiert.
   * @author Alexander Herzog
   * @version 1.1
   * @see EventManagerBase
   */
  public interface EventManager {
  	/**
  	 * Fhrt zu einem direkten Abbruch der Ereignisschleife
  	 */
  	void directAbortThread();
  
  	/**
  	 * Fhrt das nchste Ereignis in der Liste aus.
  	 * @param simData Referenz auf das <code>SimData</code>-Objekt, das an die <code>run</code>-Methode des Ereignisses bergeben werden soll
  	 * @param maxExecuteEvents Gibt die Maximalzahl an Events, die in einem Durchgang bearbeitet werden sollen, ab
  	 * @param maxRunTime Gibt die maximale Laufzeit (in ms) an, die ein Durchgang dauern darf
  	 * @return Liefert <code>true</code> zurck, wenn die angegebene Anzahl an Ereignissen ausgefhrt werden konnte.
  	 * @see SimData
  	 * @see Event
  	 */
  	boolean executeNextEvents(final SimData simData, final int maxExecuteEvents, final int maxRunTime);
  
  	/**
  	 * Fgt ein Ereignis in die Ereignisliste ein.
  	 * @param event Referenz auf das einzufgende Ereignis
  	 */
  	void addEvent(final Event event);
  
  	/**
  	 * Lscht ein Ereignis aus der Warteschlange ohne es auszufhren. Da die Referenz auf das Ereignis nach dem Lschen
  	 * an den EventCache bergeben wird, darf das Ereignis nach dem Lschen nicht mehr verwendet werden.
  	 * @param event	Zu lschendes Ereignis
  	 * @param simData	Referenz auf das <code>SimData</code>-Objekt (wird bentigt zum recyceln des Ereignisses)
  	 */
  	void deleteEvent(final Event event, final SimData simData);
  
  	/**
  	 * Lscht alle Ereignisse aus allen Listen, ohne sie dabei zu recyceln.
  	 */
  	void deleteAllEvents();
  
  	/**
  	 * Wenn von Beginn an mehrere Ereignisse in die Ereignisliste eingefgt werden sollen, so ist es von
  	 * Vorteil diese zu sortieren, zu verketten und nur das erste in die Ereignisliste einzufgen.
  	 * Beim Abarbeiten des ersten Ereignisses wird dann das zweite (im ersten eingetragene) Ereignis
  	 * in die Liste eingefgt. Die Funktion <code>addInitialEvents</code> erledigt genau dies:
  	 * Die im Parameter bergebenen Ereignisse werden nach dem Ausfhrungszeitpunkt sortiert und das
  	 * erste Ereignis wird in die Ereignisliste eingefgt. Auerdem wird in das erste Ereignis eingetragen,
  	 * dass bei seiner Ausfhrung das zweite in die Liste eingetragen werden soll usw.
  	 * @param	events	Ereignisse, die von Anfang an in der Ereignisliste stehen sollen
  	 */
  	void addInitialEvents(final List<? extends Event> events);
  
  	/**
  	 * Liefert die Anzahl der ausgefhrten Ereignisse zurck.
  	 * @return Anzahl der ausgefhrten Ereignisse
  	 */
  	long eventCount();
  
  	/**
  	 * Liefert die momentane Lnge der Ereigniswarteschlange zurck.
  	 * @return Lnge der Ereigniswarteschlange
  	 */
  	int eventQueueLength();
  
  	/**
  	 * Informiert den EventManager darber, dass ein neuer Tag begonnen hat.
  	 * Nicht alle EventManager mssen diese Information interpretieren. Lediglich bei mehreren Listen
  	 * muss hier ein Reset durchgefhrt werden.
  	 */
  	void resetTime();
  
  	/**
  	 * Setzt den Zhler der ausgefhrten Ereignisse zurck.
  	 */
  	void resetCount();
  
  	/**
  	 * Signalisiert, dass die Simulation unterbrochen werden soll und dass <code>executeNextEvents</code>
  	 * nach dem Ende der Ausfhrung des aktuellen Ereignisses direkt zurckkehren soll (und nicht erst
  	 * nach der angegebenen Anzahl an auszufhrenden Ereignissen).
  	 */
  	void setPause();
  
  	/**
  	 * Liefert fr Debugging-Zwecke alle aktuellen Ereignisse zurck
  	 * @return	Liste mit allen aktuellen Ereignissen
  	 */
  	List<Event> getAllEvents();
  }