EventConsumerMap class

Пакет: com.hypixel.hytale.event

Файл: com/hypixel/hytale/event/EventBusRegistry.java

implements: IEventDispatcher<EventType, ReturnType>

Поля (20)

МодификаторыТипИмя
private static final short[] EMPTY_SHORT_ARRAY
private final Short2ObjectConcurrentHashMap<List<ConsumerType>> map
private final AtomicReference<short[]> prioritiesRef
return
return
return
return
short var2
short var2
short[] var2
short[] var2
boolean[] var3
boolean[] var3
short[] var3
short[] var3
int var4
int var4
int var5
int var5
int var6

Методы (11)

МодификаторыВозвратСигнатура
public void addpublic void add(@Nonnull ConsumerType var1)
private void addPriorityprivate void addPriority(short var1)
public List<ConsumerType> getpublic List<ConsumerType> get(short var1)
public short[] getPrioritiespublic short[] getPriorities()
if if(var3[0])
if if(var3[1])
if if(var4 >= 0)
if if(var4 < 0)
public boolean isEmptypublic boolean isEmpty()
public boolean removepublic boolean remove(@Nonnull ConsumerType var1)
private void removePriorityprivate void removePriority(short var1)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.event;

class="kw">import com.hypixel.fastutil.shorts.Short2ObjectConcurrentHashMap;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.metrics.metric.Metric;
class="kw">import java.util.Arrays;
class="kw">import java.util.List;
class="kw">import java.util.Map;
class="kw">import java.util.concurrent.ConcurrentHashMap;
class="kw">import java.util.concurrent.CopyOnWriteArrayList;
class="kw">import java.util.concurrent.TimeUnit;
class="kw">import java.util.concurrent.atomic.AtomicInteger;
class="kw">import java.util.concurrent.atomic.AtomicReference;
class="kw">import java.util.function.Consumer;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class="kw">abstract class EventBusRegistry<KeyType, EventType class="kw">extends IBaseEvent<KeyType>, ConsumerMapType class="kw">extends EventBusRegistry.EventConsumerMap<EventType, ?, ?>> {
   @Nonnull
   class="kw">protected class="kw">static class="kw">final Object NULL = new Object();
   @Nonnull
   class="kw">protected class="kw">final HytaleLogger logger;
   @Nonnull
   class="kw">protected class="kw">final Class<EventType> eventClass;
   @Nonnull
   class="kw">protected class="kw">final Map<KeyType, ConsumerMapType> map = new ConcurrentHashMap<>();
   @Nonnull
   class="kw">protected class="kw">final ConsumerMapType global;
   @Nonnull
   class="kw">protected class="kw">final ConsumerMapType unhandled;
   class="kw">protected boolean timeEvents;
   class="kw">protected class="kw">volatile boolean shutdown;

   class="kw">public EventBusRegistry(@Nonnull HytaleLogger var1, @Nonnull Class<EventType> var2, @Nonnull ConsumerMapType var3, @Nonnull ConsumerMapType var4) {
      this.logger = var1;
      this.eventClass = var2;
      this.global = var3;
      this.unhandled = var4;
   }

   @Nonnull
   class="kw">public Class<EventType> getEventClass() {
      class="kw">return this.eventClass;
   }

   class="kw">public boolean isTimeEvents() {
      class="kw">return this.timeEvents;
   }

   class="kw">public void setTimeEvents(boolean var1) {
      this.timeEvents = var1;
   }

   class="kw">public void shutdown() {
      this.shutdown = true;
      this.map.clear();
   }

   class="kw">public boolean isAlive() {
      class="kw">return !this.shutdown;
   }

   @Nonnull
   class="kw">protected EventRegistration<KeyType, EventType> deadRegistration(@Nonnull String var1) {
      ((HytaleLogger.Api)this.logger.at(Level.FINE).atMostEvery(1, TimeUnit.MINUTES))
         .log("Ignoring %s on shut-down EventRegistry for %s", var1, this.eventClass.getName());
      class="kw">return new EventRegistration<>(this.eventClass, this::isAlive, () -> {});
   }

   class="kw">public class="kw">abstract EventRegistration<KeyType, EventType> register(short var1, @Nullable KeyType var2, @Nonnull Consumer<EventType> var3);

   class="kw">public class="kw">abstract EventRegistration<KeyType, EventType> registerGlobal(short var1, @Nonnull Consumer<EventType> var2);

   class="kw">public class="kw">abstract EventRegistration<KeyType, EventType> registerUnhandled(short var1, @Nonnull Consumer<EventType> var2);

   class="kw">public class="kw">abstract IEventDispatcher<EventType, ?> dispatchFor(KeyType var1);

   class="kw">public class="kw">abstract class="kw">static class EventConsumer {
      @Nonnull
      class="kw">protected class="kw">static class="kw">final AtomicInteger consumerIndex = new AtomicInteger();
      class="kw">protected class="kw">final int index;
      class="kw">protected class="kw">final short priority;
      @Nonnull
      class="kw">protected class="kw">final String consumerString;
      @Nonnull
      class="kw">protected class="kw">final Metric timer = new Metric();

      class="kw">public EventConsumer(short var1, @Nonnull String var2) {
         this.priority = var1;
         this.consumerString = var2;
         this.index = consumerIndex.getAndIncrement();
      }

      class="kw">public int getIndex() {
         class="kw">return this.index;
      }

      class="kw">public short getPriority() {
         class="kw">return this.priority;
      }

      @Nonnull
      class="kw">public String getConsumerString() {
         class="kw">return this.consumerString;
      }

      @Nonnull
      class="kw">public Metric getTimer() {
         class="kw">return this.timer;
      }

      @Nonnull
      @Override
      class="kw">public String toString() {
         class="kw">return "EventConsumer{index="
            + this.index
            + ", priority="
            + this.priority
            + ", consumerString='"
            + this.consumerString
            + "', timer="
            + this.timer
            + "}";
      }
   }

   class="kw">public class="kw">abstract class="kw">static class EventConsumerMap<EventType class="kw">extends IBaseEvent, ConsumerType class="kw">extends EventBusRegistry.EventConsumer, ReturnType>
      class="kw">implements IEventDispatcher<EventType, ReturnType> {
      class="kw">private class="kw">static class="kw">final short[] EMPTY_SHORT_ARRAY = new short[0];
      class="kw">private class="kw">final AtomicReference<short[]> prioritiesRef = new AtomicReference<>(EMPTY_SHORT_ARRAY);
      @Nonnull
      class="kw">private class="kw">final Short2ObjectConcurrentHashMap<List<ConsumerType>> map = new Short2ObjectConcurrentHashMap<>(true, (short)-32768);

      class="kw">public EventConsumerMap() {
      }

      class="kw">public boolean isEmpty() {
         class="kw">return this.map.isEmpty();
      }

      class="kw">public void add(@Nonnull ConsumerType var1) {
         short var2 = var1.getPriority();
         boolean[] var3 = new boolean[]{false};
         this.map.computeIfAbsent(var2, var1x -> {
            var3[0] = true;
            class="kw">return new CopyOnWriteArrayList<>();
         }).add(var1);
         if (var3[0]) {
            this.addPriority(var2);
         }
      }

      class="kw">public boolean remove(@Nonnull ConsumerType var1) {
         short var2 = var1.getPriority();
         boolean[] var3 = new boolean[]{false, false};
         this.map.computeIfPresent(var2, (var2x, var3x) -> {
            var3[0] = var3x.remove(var1);
            if (!var3x.isEmpty()) {
               class="kw">return var3x;
            }

            var3[1] = true;
            class="kw">return null;
         });
         if (var3[1]) {
            this.removePriority(var2);
         }

         class="kw">return var3[0];
      }

      class="kw">public short[] getPriorities() {
         class="kw">return this.prioritiesRef.get();
      }

      @Nullable
      class="kw">public List<ConsumerType> get(short var1) {
         class="kw">return this.map.get(var1);
      }

      class="kw">private void addPriority(short var1) {
         while (this.map.containsKey(var1)) {
            short[] var2 = this.prioritiesRef.get();
            int var4 = Arrays.binarySearch(var2, var1);
            if (var4 >= 0) {
               class="kw">return;
            }

            int var5 = -(var4 + 1);
            int var6 = var2.length + 1;
            short[] var3 = new short[var6];
            System.arraycopy(var2, 0, var3, 0, var5);
            var3[var5] = var1;
            System.arraycopy(var2, var5, var3, var5 + 1, var2.length - var5);
            if (this.prioritiesRef.compareAndSet(var2, var3)) {
               class="kw">return;
            }
         }
      }

      class="kw">private void removePriority(short var1) {
         while (!this.map.containsKey(var1)) {
            short[] var2 = this.prioritiesRef.get();
            int var4 = Arrays.binarySearch(var2, var1);
            if (var4 < 0) {
               class="kw">return;
            }

            int var5 = var2.length - 1;
            short[] var3 = new short[var5];
            System.arraycopy(var2, 0, var3, 0, var4);
            System.arraycopy(var2, var4 + 1, var3, var4, var5 - var4);
            if (this.prioritiesRef.compareAndSet(var2, var3)) {
               class="kw">return;
            }
         }
      }
   }
}