Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package org.quiltmc.enigma.gui.element;

import org.jspecify.annotations.Nullable;
import org.quiltmc.enigma.util.Utils;
import org.quiltmc.enigma.util.CollectionUtils;

import javax.swing.JTextField;
import javax.swing.text.Document;
Expand Down Expand Up @@ -79,7 +79,7 @@ protected void paintComponent(Graphics graphics) {
final Graphics localGraphics = graphics.create();
trySetRenderingHints(localGraphics);

Utils.findFirstNonNull(this.placeholderColor, this.getDisabledTextColor(), this.getForeground())
CollectionUtils.findFirstNonNull(this.placeholderColor, this.getDisabledTextColor(), this.getForeground())
.ifPresent(localGraphics::setColor);
localGraphics.setFont(this.getFont());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@
import static org.quiltmc.enigma.gui.util.GuiUtil.getCenteredFontBaseY;
import static org.quiltmc.enigma.gui.util.GuiUtil.trySetRenderingHints;
import static org.quiltmc.enigma.util.StringLookup.toStringLookup;
import static org.quiltmc.enigma.util.Utils.getLastOrNull;
import static org.quiltmc.enigma.util.CollectionUtils.getLastOrNull;
import static javax.swing.BorderFactory.createEmptyBorder;

public class SearchMenusMenu extends AbstractEnigmaMenu {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,10 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Multimap;
import com.google.common.collect.Multimaps;
import com.google.common.collect.Multiset;
import com.google.common.collect.TreeMultiset;
import org.jspecify.annotations.NonNull;
import org.jspecify.annotations.Nullable;
import org.quiltmc.enigma.gui.util.GuiUtil;
import org.quiltmc.enigma.gui.util.ScaleUtil;
import org.quiltmc.enigma.util.SortedCollection;

import java.awt.Color;
import java.awt.Component;
Expand All @@ -22,6 +20,7 @@
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Collection;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
Expand Down Expand Up @@ -55,7 +54,10 @@ public class MarkableScrollPane extends SmartScrollPane {
private static final int DEFAULT_MARKER_WIDTH = 10;
private static final int DEFAULT_MARKER_HEIGHT = 5;

private final Multimap<Integer, Marker> markersByPos = Multimaps.newMultimap(new HashMap<>(), TreeMultiset::create);
private final Multimap<Integer, Marker> markersByPos = Multimaps.newMultimap(
new HashMap<>(),
() -> new SortedCollection<>(Marker.COMPARATOR, Marker::castOrNull)
);

private final int markerWidth;
private final int markerHeight;
Expand Down Expand Up @@ -514,11 +516,12 @@ Rectangle createArea() {
}
}

private record Marker(Color color, int priority, int pos, Optional<MarkerListener> listener)
implements Comparable<Marker> {
@Override
public int compareTo(@NonNull Marker other) {
return other.priority - this.priority;
private record Marker(Color color, int priority, int pos, Optional<MarkerListener> listener) {
static Comparator<Marker> COMPARATOR = Comparator.comparingInt(Marker::priority).reversed();

@Nullable
static Marker castOrNull(Object o) {
return o instanceof Marker marker ? marker : null;
}

class Span {
Expand Down Expand Up @@ -557,7 +560,7 @@ private class MarkersPainterBuilder {
final int pos;
final int scaledPos;

final Multiset<Marker> markers = TreeMultiset.create();
final SortedCollection<Marker> markers = new SortedCollection<>(Marker.COMPARATOR, Marker::castOrNull);

int top;
int bottom;
Expand Down
87 changes: 87 additions & 0 deletions enigma/src/main/java/org/quiltmc/enigma/util/CollectionUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package org.quiltmc.enigma.util;

import org.jspecify.annotations.NonNull;
import org.jspecify.annotations.Nullable;

import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.IdentityHashMap;
import java.util.Iterator;
import java.util.Optional;
import java.util.Set;

/**
* Utilities for working with {@link Collection}s and arrays.
*/
public final class CollectionUtils {
private CollectionUtils() {
throw new UnsupportedOperationException();
}

@SafeVarargs
public static <T> Optional<T> findFirstNonNull(T... values) {
for (final T value : values) {
if (value != null) {
return Optional.of(value);
}
}

return Optional.empty();
}

/**
* @return {@code null} if the passed {@code array} is {@code null} or empty,
* or the last element of the {@code array} otherwise
*/
@Nullable
public static <T> T getLastOrNull(@Nullable T[] array) {
return array == null || array.length == 0 ? null : array[array.length - 1];
}

public static <T> Set<T> createIdentityHashSet() {
return Collections.newSetFromMap(new IdentityHashMap<>());
}

public static <T> Set<T> createIdentityHashSet(int expectedMaxSize) {
return Collections.newSetFromMap(new IdentityHashMap<>(expectedMaxSize));
}

/**
* A common implementation of {@link Collection#toArray()}.
*/
public static <T> Object @NonNull [] toArrayImpl(Collection<T> collection) {
final int size = collection.size();
final Object[] array = new Object[size];
final Iterator<T> itr = collection.iterator();
for (int i = 0; i < size; i++) {
array[i] = itr.next();
}

return array;
}

/**
* A common implementation of {@link Collection#toArray(Object[])}.
*
* <p> Based on {@link HashMap}{@code ::prepareArray} and {@link HashMap}{@code ::keysToArray}.
*/
@SuppressWarnings("unchecked")
public static <T, T1> T1 @NonNull[] toArrayImpl(Collection<T> collection, T1[] a) {
final int size = collection.size();
if (a.length < size) {
a = (T1[]) java.lang.reflect.Array
.newInstance(a.getClass().getComponentType(), size);
} else if (a.length > size) {
a[size] = null;
}

final Iterator<T> itr = collection.iterator();
final Object[] objects = a;
for (int i = 0; i < size; i++) {
objects[i] = itr.next();
}

return a;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -51,36 +51,12 @@ public Iterator<T> iterator() {

@Override
public Object @NonNull[] toArray() {
final int size = this.size();
final Object[] array = new Object[size];
final Iterator<T> itr = this.iterator();
int i = 0;
while (itr.hasNext()) {
array[i++] = itr.next();
}

return array;
return CollectionUtils.toArrayImpl(this);
}

// Based on HashMap::prepareArray and HashMap::keysToArray
@SuppressWarnings("unchecked")
@Override
public <T1> T1 @NonNull[] toArray(T1[] a) {
final int size = this.size();
if (a.length < size) {
a = (T1[]) java.lang.reflect.Array
.newInstance(a.getClass().getComponentType(), size);
} else if (a.length > size) {
a[size] = null;
}

final Iterator<T> itr = this.iterator();
final Object[] objects = a;
for (int i = 0; i < size; i++) {
objects[i] = itr.next();
}

return a;
public <T1> T1 @NonNull[] toArray(T1 @NonNull[] a) {
return CollectionUtils.toArrayImpl(this, a);
}

@Override
Expand Down
Loading
Loading