
net.mostlyoriginal.api.event.dispatcher.BasicEventDispatcher Maven / Gradle / Ivy
package net.mostlyoriginal.api.event.dispatcher;
import com.artemis.utils.Bag;
import com.artemis.utils.ImmutableBag;
import com.artemis.utils.reflect.ClassReflection;
import net.mostlyoriginal.api.event.common.Event;
import net.mostlyoriginal.api.event.common.EventDispatchStrategy;
import net.mostlyoriginal.api.event.common.EventListener;
import net.mostlyoriginal.api.utils.ReflectionHelper;
import net.mostlyoriginal.api.utils.BagUtils;
/**
* Basic Listener registration and event dispatch.
*
* Horribly inefficient, brute force proof of concept
* event dispatcher. Don't actually use this unless
* you fire one event per hour!
*
* @author Daan van Yperen
*/
public class BasicEventDispatcher implements EventDispatchStrategy {
final Bag listeners = new Bag<>(128);
private boolean sortDirty = false;
/** Subscribe listener to events. */
@Override
public void register( EventListener listener )
{
if ( !listeners.contains(listener) ) {
listeners.add(listener);
sortDirty =true;
}
}
/**
* Dispatch event to registered listeners.
* Events are called on the call stack, avoid deeply nested or circular event calls.
*/
@Override
public void dispatch( Event event )
{
if ( event == null ) throw new NullPointerException("Event required.");
// fetch relevant listeners, sorted by order.
final ImmutableBag relevantListeners = getRelevantListeners(event);
// iterate over applicable listeners.
for(int i=0, s=relevantListeners.size(); i T dispatch(Class type) {
throw new UnsupportedOperationException("This dispatcher doesn't dispatch events by type!");
}
@Override
public void process() {
// not interested in this stuff
}
/** Get listeners that are subscribed to the event. */
protected ImmutableBag getRelevantListeners(Event event) {
final Bag relevantListeners = new Bag<>();
// resort listeners when we need to.
if (sortDirty) {
sortDirty=false;
BagUtils.sort(listeners);
}
// who needs efficiency! not us!
for(int i=0, s=listeners.size(); i
© 2015 - 2025 Weber Informatics LLC | Privacy Policy