diff --git a/bom/pom.xml b/bom/pom.xml index 9b1cae8..95335a7 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -49,11 +49,6 @@ - - it.unimi.dsi - fastutil-core - 8.5.9 - net.harawata appdirs diff --git a/src/main/java/it/tdlight/common/internal/ArrayUtil.java b/src/main/java/it/tdlight/common/internal/ArrayUtil.java new file mode 100644 index 0000000..fe4579c --- /dev/null +++ b/src/main/java/it/tdlight/common/internal/ArrayUtil.java @@ -0,0 +1,124 @@ +package it.tdlight.common.internal; + +import it.tdlight.common.utils.IntSwapper; + +public class ArrayUtil { + + public interface IntComparator { + int compare(int k1, int k2); + } + + public static void mergeSort(int from, int to, IntComparator c, IntSwapper swapper) { + int length = to - from; + int i; + if (length >= 16) { + i = from + to >>> 1; + mergeSort(from, i, c, swapper); + mergeSort(i, to, c, swapper); + if (c.compare(i - 1, i) > 0) { + inPlaceMerge(from, i, to, c, swapper); + } + } else { + for(i = from; i < to; ++i) { + for(int j = i; j > from && c.compare(j - 1, j) > 0; --j) { + swapper.swap(j, j - 1); + } + } + + } + } + + private static void inPlaceMerge(int from, int mid, int to, IntComparator comp, IntSwapper swapper) { + if (from < mid && mid < to) { + if (to - from == 2) { + if (comp.compare(mid, from) < 0) { + swapper.swap(from, mid); + } + + } else { + int firstCut; + int secondCut; + if (mid - from > to - mid) { + firstCut = from + (mid - from) / 2; + secondCut = lowerBound(mid, to, firstCut, comp); + } else { + secondCut = mid + (to - mid) / 2; + firstCut = upperBound(from, mid, secondCut, comp); + } + + if (mid != firstCut && mid != secondCut) { + int first1 = firstCut; + int last1 = mid; + + label43: + while(true) { + --last1; + if (first1 >= last1) { + first1 = mid; + last1 = secondCut; + + while(true) { + --last1; + if (first1 >= last1) { + first1 = firstCut; + last1 = secondCut; + + while(true) { + --last1; + if (first1 >= last1) { + break label43; + } + + swapper.swap(first1++, last1); + } + } + + swapper.swap(first1++, last1); + } + } + + swapper.swap(first1++, last1); + } + } + + mid = firstCut + (secondCut - mid); + inPlaceMerge(from, firstCut, mid, comp, swapper); + inPlaceMerge(mid, secondCut, to, comp, swapper); + } + } + } + + private static int lowerBound(int from, int to, int pos, IntComparator comp) { + int len = to - from; + + while(len > 0) { + int half = len / 2; + int middle = from + half; + if (comp.compare(middle, pos) < 0) { + from = middle + 1; + len -= half + 1; + } else { + len = half; + } + } + + return from; + } + + private static int upperBound(int from, int mid, int pos, IntComparator comp) { + int len = mid - from; + + while(len > 0) { + int half = len / 2; + int middle = from + half; + if (comp.compare(pos, middle) < 0) { + len = half; + } else { + from = middle + 1; + len -= half + 1; + } + } + + return from; + } +} diff --git a/src/main/java/it/tdlight/common/internal/InternalClient.java b/src/main/java/it/tdlight/common/internal/InternalClient.java index e2c13ef..f4f865c 100644 --- a/src/main/java/it/tdlight/common/internal/InternalClient.java +++ b/src/main/java/it/tdlight/common/internal/InternalClient.java @@ -7,8 +7,9 @@ import it.tdlight.common.TelegramClient; import it.tdlight.common.UpdatesHandler; import it.tdlight.jni.TdApi; import it.tdlight.jni.TdApi.Function; -import it.unimi.dsi.fastutil.longs.LongArrayList; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import it.tdlight.jni.TdApi.Object; +import java.util.ArrayList; +import java.util.List; import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicBoolean; @@ -47,7 +48,7 @@ public final class InternalClient implements ClientEventsHandler, TelegramClient @Override public void handleEvents(boolean isClosed, long[] eventIds, TdApi.Object[] events, int arrayOffset, int arrayLength) { if (updatesHandler != null) { - ObjectArrayList updatesList = new ObjectArrayList<>(arrayLength); + List updatesList = new ArrayList<>(arrayLength); for (int i = (arrayOffset + arrayLength) - 1; i >= arrayOffset; i--) { if (eventIds[i] != 0) { diff --git a/src/main/java/it/tdlight/common/internal/ResponseReceiver.java b/src/main/java/it/tdlight/common/internal/ResponseReceiver.java index 9445a82..780c0b3 100644 --- a/src/main/java/it/tdlight/common/internal/ResponseReceiver.java +++ b/src/main/java/it/tdlight/common/internal/ResponseReceiver.java @@ -260,7 +260,7 @@ abstract class ResponseReceiver extends Thread implements AutoCloseable { @SuppressWarnings("SameParameterValue") private int[] generateSortIndex(int from, int to, int[] data) { int[] sortedIndices = Arrays.copyOfRange(originalSortingSource, from, to); - it.unimi.dsi.fastutil.Arrays.mergeSort(from, + ArrayUtil.mergeSort(from, to, (o1, o2) -> Integer.compare(data[sortedIndices[o1]], data[sortedIndices[o2]]), new IntSwapper(sortedIndices) diff --git a/src/main/java/it/tdlight/common/utils/IntSwapper.java b/src/main/java/it/tdlight/common/utils/IntSwapper.java index f4fa09b..078773c 100644 --- a/src/main/java/it/tdlight/common/utils/IntSwapper.java +++ b/src/main/java/it/tdlight/common/utils/IntSwapper.java @@ -1,8 +1,6 @@ package it.tdlight.common.utils; -import it.unimi.dsi.fastutil.Swapper; - -public final class IntSwapper implements Swapper { +public final class IntSwapper { private final int[] array; int tmp; @@ -12,7 +10,6 @@ public final class IntSwapper implements Swapper { tmp = 0; } - @Override public void swap(int a, int b) { tmp = array[a]; array[a] = array[b]; diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index 4e59437..e3fddd2 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -2,7 +2,6 @@ module tdlight.java { requires tdlight.api; requires org.reactivestreams; requires org.slf4j; - requires it.unimi.dsi.fastutil.core; requires com.google.zxing; exports it.tdlight.tdlight; exports it.tdlight.tdnative; diff --git a/tdlib/pom.xml b/tdlib/pom.xml index 270089d..475b255 100644 --- a/tdlib/pom.xml +++ b/tdlib/pom.xml @@ -50,10 +50,6 @@ it.tdlight ${tdlib.api.artifact.id} - - it.unimi.dsi - fastutil - org.slf4j slf4j-api @@ -78,6 +74,12 @@ 5.8.2 test + + it.unimi.dsi + fastutil-core + 8.5.9 + test + diff --git a/tdlight-java-8/pom.xml b/tdlight-java-8/pom.xml index c34ce51..11f1ba8 100644 --- a/tdlight-java-8/pom.xml +++ b/tdlight-java-8/pom.xml @@ -48,10 +48,6 @@ it.tdlight tdlight-api-legacy - - it.unimi.dsi - fastutil-core - org.slf4j slf4j-api @@ -76,6 +72,12 @@ 5.9.0 test + + it.unimi.dsi + fastutil-core + 8.5.9 + test + diff --git a/tdlight-java/pom.xml b/tdlight-java/pom.xml index 097634b..0344ea5 100644 --- a/tdlight-java/pom.xml +++ b/tdlight-java/pom.xml @@ -48,10 +48,6 @@ it.tdlight tdlight-api-sealed - - it.unimi.dsi - fastutil-core - org.slf4j slf4j-api @@ -76,6 +72,12 @@ 5.9.0 test + + it.unimi.dsi + fastutil-core + 8.5.9 + test +