Builder class

Пакет: com.hypixel.hytale.metrics.metric

Файл: com/hypixel/hytale/metrics/metric/HistoricMetric.java

Поля (3)

МодификаторыТипИмя
private final long minimumInterval
private final LongList periods
long var4

Методы (5)

МодификаторыВозвратСигнатура
abstract return new HistoricMetricreturn new HistoricMetric(this)
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("Period's must be increasing in length")
public HistoricMetric.Builder addPeriodpublic HistoricMetric.Builder addPeriod(long var1, @Nonnull TimeUnit var3)
public HistoricMetric buildpublic HistoricMetric build()
abstract for for(int var6 = 0; var6 < this.periods.size()

Исходный код

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

class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.KeyedCodec;
class="kw">import com.hypixel.hytale.codec.builder.BuilderCodec;
class="kw">import com.hypixel.hytale.math.util.MathUtil;
class="kw">import it.unimi.dsi.fastutil.longs.LongArrayList;
class="kw">import it.unimi.dsi.fastutil.longs.LongList;
class="kw">import java.util.Arrays;
class="kw">import java.util.concurrent.TimeUnit;
class="kw">import javax.annotation.Nonnull;

class="kw">public class HistoricMetric {
   class="kw">public class="kw">static class="kw">final HistoricMetric[] EMPTY_ARRAY = new HistoricMetric[0];
   class="kw">public class="kw">static class="kw">final Codec<HistoricMetric> METRICS_CODEC = BuilderCodec.builder(HistoricMetric.class, HistoricMetric::new)
      .append(new KeyedCodec<>("PeriodsNanos", Codec.LONG_ARRAY), (var0, var1) -> {
         throw new UnsupportedOperationException("Not supported");
      }, var0 -> var0.periodsNanos)
      .add()
      .append(new KeyedCodec<>("Timestamps", Codec.LONG_ARRAY), (var0, var1) -> {
         throw new UnsupportedOperationException("Not supported");
      }, HistoricMetric::getAllTimestamps)
      .add()
      .append(new KeyedCodec<>("Values", Codec.LONG_ARRAY), (var0, var1) -> {
         throw new UnsupportedOperationException("Not supported");
      }, HistoricMetric::getAllValues)
      .add()
      .build();
   class="kw">private class="kw">final long[] periodsNanos;
   @Nonnull
   class="kw">private class="kw">final AverageCollector[] periodAverages;
   @Nonnull
   class="kw">private class="kw">final int[] startIndices;
   class="kw">private class="kw">final int bufferSize;
   @Nonnull
   class="kw">private class="kw">final long[] timestamps;
   @Nonnull
   class="kw">private class="kw">final long[] values;
   int nextIndex;

   class="kw">private HistoricMetric() {
      throw new UnsupportedOperationException("Not supported");
   }

   class="kw">private HistoricMetric(@Nonnull HistoricMetric.Builder var1) {
      this.periodsNanos = var1.periods.toLongArray();
      this.periodAverages = new AverageCollector[this.periodsNanos.length];

      for (int var2 = 0; var2 < this.periodAverages.length; var2++) {
         this.periodAverages[var2] = new AverageCollector();
      }

      this.startIndices = new int[this.periodsNanos.length];
      long var9 = 0L;

      for (long var7 : this.periodsNanos) {
         if (var7 > var9) {
            var9 = var7;
         }
      }

      this.bufferSize = (int)MathUtil.fastCeil((double)var9 / var1.minimumInterval);
      this.timestamps = new long[this.bufferSize];
      this.values = new long[this.bufferSize];
      Arrays.fill(this.timestamps, Long.MAX_VALUE);
   }

   class="kw">public long[] getPeriodsNanos() {
      class="kw">return this.periodsNanos;
   }

   class="kw">public long calculateMin(int var1) {
      int var2 = this.bufferSize;
      long[] var3 = this.values;
      int var4 = this.startIndices[var1];
      int var5 = this.nextIndex;
      long var6 = Long.MAX_VALUE;
      if (var4 < var5) {
         for (int var8 = var4; var8 < var5; var8++) {
            long var9 = var3[var8];
            if (var9 < var6) {
               var6 = var9;
            }
         }
      } else {
         for (int var11 = var4; var11 < var2; var11++) {
            long var13 = var3[var11];
            if (var13 < var6) {
               var6 = var13;
            }
         }

         for (int var12 = 0; var12 < var5; var12++) {
            long var14 = var3[var12];
            if (var14 < var6) {
               var6 = var14;
            }
         }
      }

      class="kw">return var6;
   }

   class="kw">public double getAverage(int var1) {
      class="kw">return this.periodAverages[var1].get();
   }

   class="kw">public long calculateMax(int var1) {
      int var2 = this.bufferSize;
      long[] var3 = this.values;
      int var4 = this.startIndices[var1];
      int var5 = this.nextIndex;
      long var6 = Long.MIN_VALUE;
      if (var4 < var5) {
         for (int var8 = var4; var8 < var5; var8++) {
            long var9 = var3[var8];
            if (var9 > var6) {
               var6 = var9;
            }
         }
      } else {
         for (int var11 = var4; var11 < var2; var11++) {
            long var13 = var3[var11];
            if (var13 > var6) {
               var6 = var13;
            }
         }

         for (int var12 = 0; var12 < var5; var12++) {
            long var14 = var3[var12];
            if (var14 > var6) {
               var6 = var14;
            }
         }
      }

      class="kw">return var6;
   }

   class="kw">public void clear() {
      for (AverageCollector var4 : this.periodAverages) {
         var4.clear();
      }

      Arrays.fill(this.startIndices, 0);
      Arrays.fill(this.timestamps, Long.MAX_VALUE);
      Arrays.fill(this.values, 0L);
      this.nextIndex = 0;
   }

   class="kw">public void add(long var1, long var3) {
      long[] var5 = this.periodsNanos;
      AverageCollector[] var6 = this.periodAverages;
      int[] var7 = this.startIndices;
      int var8 = this.bufferSize;
      long[] var9 = this.timestamps;
      long[] var10 = this.values;
      int var11 = this.nextIndex;
      int var12 = var5.length;

      for (int var13 = 0; var13 < var12; var13++) {
         long var14 = var1 - var5[var13];
         AverageCollector var16 = var6[var13];
         int var17 = var7[var13];

         while (var9[var17] < var14) {
            long var18 = var10[var17];
            var16.remove(var18);
            var17 = (var17 + 1) % var8;
            if (var17 == var11) {
               break;
            }
         }

         var7[var13] = var17;
         var16.add(var3);
      }

      var9[var11] = var1;
      var10[var11] = var3;
      this.nextIndex = (var11 + 1) % var8;
   }

   class="kw">public long[] getTimestamps(int var1) {
      int var2 = this.startIndices[var1];
      long[] var3 = this.timestamps;
      int var4 = this.nextIndex;
      if (var2 < var4) {
         class="kw">return Arrays.copyOfRange(var3, var2, var4);
      }

      int var5 = var3.length - var2;
      long[] var6 = new long[var5 + var4];
      System.arraycopy(var3, var2, var6, 0, var5);
      System.arraycopy(var3, 0, var6, var5, var4);
      class="kw">return var6;
   }

   class="kw">public long[] getValues(int var1) {
      int var2 = this.startIndices[var1];
      long[] var3 = this.values;
      int var4 = this.nextIndex;
      if (var2 < var4) {
         class="kw">return Arrays.copyOfRange(var3, var2, var4);
      }

      int var5 = this.bufferSize - var2;
      long[] var6 = new long[var5 + var4];
      System.arraycopy(var3, var2, var6, 0, var5);
      System.arraycopy(var3, 0, var6, var5, var4);
      class="kw">return var6;
   }

   class="kw">public long[] getAllTimestamps() {
      class="kw">return this.getTimestamps(this.periodsNanos.length - 1);
   }

   class="kw">public long[] getAllValues() {
      class="kw">return this.getValues(this.periodsNanos.length - 1);
   }

   class="kw">public void setAllTimestamps(@Nonnull long[] var1) {
      int var2 = var1.length;
      System.arraycopy(var1, 0, this.timestamps, 0, var2);
      int var3 = 0;
      long var4 = var1[var2 - 1];

      for (int var6 = var2 - 2; var6 >= 0; var6--) {
         if (var4 - var1[var6] >= this.periodsNanos[var3]) {
            this.startIndices[var3] = var6 + 1;
            if (++var3 >= this.periodsNanos.length) {
               break;
            }
         }
      }

      if (var3 < this.periodsNanos.length) {
         while (var3 < this.periodsNanos.length) {
            this.periodsNanos[var3] = 0L;
            var3++;
         }
      }

      this.nextIndex = var2;
   }

   class="kw">public void setAllValues(@Nonnull long[] var1) {
      System.arraycopy(var1, 0, this.values, 0, var1.length);
   }

   class="kw">public long getLastValue() {
      class="kw">return this.nextIndex == 0 ? this.values[this.bufferSize - 1] : this.values[this.nextIndex - 1];
   }

   @Nonnull
   class="kw">public class="kw">static HistoricMetric.Builder builder(long var0, @Nonnull TimeUnit var2) {
      class="kw">return new HistoricMetric.Builder(var0, var2);
   }

   class="kw">public class="kw">static class Builder {
      class="kw">private class="kw">final long minimumInterval;
      class="kw">private class="kw">final LongList periods = new LongArrayList();

      class="kw">private Builder(long var1, @Nonnull TimeUnit var3) {
         this.minimumInterval = var3.toNanos(var1);
      }

      @Nonnull
      class="kw">public HistoricMetric.Builder addPeriod(long var1, @Nonnull TimeUnit var3) {
         long var4 = var3.toNanos(var1);

         for (int var6 = 0; var6 < this.periods.size(); var6++) {
            if (this.periods.getLong(var6) > var4) {
               throw new IllegalArgumentException("Period's must be increasing in length");
            }
         }

         this.periods.add(var4);
         class="kw">return this;
      }

      @Nonnull
      class="kw">public HistoricMetric build() {
         class="kw">return new HistoricMetric(this);
      }
   }
}