From 0d4e785a66d265e359c746da70638f2989492588 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E8=91=89=20Scarlet?= <93977077+mukjepscarlet@users.noreply.github.com> Date: Wed, 17 Dec 2025 18:29:34 +0800 Subject: [PATCH 1/3] add to pom --- pom-core-model.xml | 6 ++++++ pom-model.xml | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/pom-core-model.xml b/pom-core-model.xml index a8fa12c25..e4a735a69 100644 --- a/pom-core-model.xml +++ b/pom-core-model.xml @@ -36,5 +36,11 @@ 4.12 test + + org.jspecify + jspecify + 1.0.0 + provided + diff --git a/pom-model.xml b/pom-model.xml index 75eb6edcb..dfa69d9b6 100644 --- a/pom-model.xml +++ b/pom-model.xml @@ -36,5 +36,11 @@ 4.12 test + + org.jspecify + jspecify + 1.0.0 + provided + From a5a9cc1073b97bfc4f90ed57565723b137cda14a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E8=91=89=20Scarlet?= <93977077+mukjepscarlet@users.noreply.github.com> Date: Wed, 17 Dec 2025 18:32:59 +0800 Subject: [PATCH 2/3] package-info.java --- src/it/unimi/dsi/fastutil/booleans/package-info.java | 1 + src/it/unimi/dsi/fastutil/bytes/package-info.java | 1 + src/it/unimi/dsi/fastutil/chars/package-info.java | 1 + src/it/unimi/dsi/fastutil/doubles/package-info.java | 1 + src/it/unimi/dsi/fastutil/floats/package-info.java | 1 + src/it/unimi/dsi/fastutil/ints/package-info.java | 1 + src/it/unimi/dsi/fastutil/io/package-info.java | 1 + src/it/unimi/dsi/fastutil/longs/package-info.java | 1 + src/it/unimi/dsi/fastutil/objects/package-info.java | 1 + src/it/unimi/dsi/fastutil/package-info.java | 1 + src/it/unimi/dsi/fastutil/shorts/package-info.java | 1 + 11 files changed, 11 insertions(+) diff --git a/src/it/unimi/dsi/fastutil/booleans/package-info.java b/src/it/unimi/dsi/fastutil/booleans/package-info.java index 168771900..0a23239b1 100644 --- a/src/it/unimi/dsi/fastutil/booleans/package-info.java +++ b/src/it/unimi/dsi/fastutil/booleans/package-info.java @@ -6,4 +6,5 @@ * as they are useless. Unsorted sets and maps are kept around for orthogonality, whereas * {@link it.unimi.dsi.fastutil.booleans.BooleanCollection} is used by maps with boolean values. */ +@org.jspecify.annotations.NullMarked package it.unimi.dsi.fastutil.booleans; \ No newline at end of file diff --git a/src/it/unimi/dsi/fastutil/bytes/package-info.java b/src/it/unimi/dsi/fastutil/bytes/package-info.java index e641d52de..7142d6c76 100644 --- a/src/it/unimi/dsi/fastutil/bytes/package-info.java +++ b/src/it/unimi/dsi/fastutil/bytes/package-info.java @@ -1,4 +1,5 @@ /** * Type-specific classes for byte elements or keys. */ +@org.jspecify.annotations.NullMarked package it.unimi.dsi.fastutil.bytes; diff --git a/src/it/unimi/dsi/fastutil/chars/package-info.java b/src/it/unimi/dsi/fastutil/chars/package-info.java index e2cf56e3e..62ddf5a83 100644 --- a/src/it/unimi/dsi/fastutil/chars/package-info.java +++ b/src/it/unimi/dsi/fastutil/chars/package-info.java @@ -1,4 +1,5 @@ /** * Type-specific classes for character elements or keys. */ +@org.jspecify.annotations.NullMarked package it.unimi.dsi.fastutil.chars; diff --git a/src/it/unimi/dsi/fastutil/doubles/package-info.java b/src/it/unimi/dsi/fastutil/doubles/package-info.java index 845fb7027..602212a04 100644 --- a/src/it/unimi/dsi/fastutil/doubles/package-info.java +++ b/src/it/unimi/dsi/fastutil/doubles/package-info.java @@ -1,4 +1,5 @@ /** * Type-specific classes for double elements or keys. */ +@org.jspecify.annotations.NullMarked package it.unimi.dsi.fastutil.doubles; diff --git a/src/it/unimi/dsi/fastutil/floats/package-info.java b/src/it/unimi/dsi/fastutil/floats/package-info.java index ca58e9531..0c7f28c09 100644 --- a/src/it/unimi/dsi/fastutil/floats/package-info.java +++ b/src/it/unimi/dsi/fastutil/floats/package-info.java @@ -1,4 +1,5 @@ /** * Type-specific classes for float elements or keys. */ +@org.jspecify.annotations.NullMarked package it.unimi.dsi.fastutil.floats; diff --git a/src/it/unimi/dsi/fastutil/ints/package-info.java b/src/it/unimi/dsi/fastutil/ints/package-info.java index e9c920fd6..a1b41b1ba 100644 --- a/src/it/unimi/dsi/fastutil/ints/package-info.java +++ b/src/it/unimi/dsi/fastutil/ints/package-info.java @@ -1,4 +1,5 @@ /** * Type-specific classes for integer elements or keys. */ +@org.jspecify.annotations.NullMarked package it.unimi.dsi.fastutil.ints; diff --git a/src/it/unimi/dsi/fastutil/io/package-info.java b/src/it/unimi/dsi/fastutil/io/package-info.java index 454a0b0a9..cc676f2a8 100644 --- a/src/it/unimi/dsi/fastutil/io/package-info.java +++ b/src/it/unimi/dsi/fastutil/io/package-info.java @@ -15,4 +15,5 @@ * {@linkplain BinIO#storeInts(int[], CharSequence) arrays}, even * {@linkplain TextIO#storeInts(int[], CharSequence) in text form}. */ +@org.jspecify.annotations.NullMarked package it.unimi.dsi.fastutil.io; diff --git a/src/it/unimi/dsi/fastutil/longs/package-info.java b/src/it/unimi/dsi/fastutil/longs/package-info.java index 299b13aa2..88d359633 100644 --- a/src/it/unimi/dsi/fastutil/longs/package-info.java +++ b/src/it/unimi/dsi/fastutil/longs/package-info.java @@ -1,4 +1,5 @@ /** * Type-specific classes for long elements or keys. */ +@org.jspecify.annotations.NullMarked package it.unimi.dsi.fastutil.longs; diff --git a/src/it/unimi/dsi/fastutil/objects/package-info.java b/src/it/unimi/dsi/fastutil/objects/package-info.java index 36ad136b4..07de36d44 100644 --- a/src/it/unimi/dsi/fastutil/objects/package-info.java +++ b/src/it/unimi/dsi/fastutil/objects/package-info.java @@ -7,4 +7,5 @@ * reference-based collections}, which use identity ({@code ==}). See the related comments * in the overview. */ +@org.jspecify.annotations.NullMarked package it.unimi.dsi.fastutil.objects; diff --git a/src/it/unimi/dsi/fastutil/package-info.java b/src/it/unimi/dsi/fastutil/package-info.java index 4dcedae2f..b50ec461c 100644 --- a/src/it/unimi/dsi/fastutil/package-info.java +++ b/src/it/unimi/dsi/fastutil/package-info.java @@ -2,4 +2,5 @@ * Static classes and methods used by all implementations and some non-type-specific classes that do * not belong to {@link it.unimi.dsi.fastutil.objects}. */ +@org.jspecify.annotations.NullMarked package it.unimi.dsi.fastutil; diff --git a/src/it/unimi/dsi/fastutil/shorts/package-info.java b/src/it/unimi/dsi/fastutil/shorts/package-info.java index f6473e5a7..f79202910 100644 --- a/src/it/unimi/dsi/fastutil/shorts/package-info.java +++ b/src/it/unimi/dsi/fastutil/shorts/package-info.java @@ -1,4 +1,5 @@ /** * Type-specific classes for short elements or keys. */ +@org.jspecify.annotations.NullMarked package it.unimi.dsi.fastutil.shorts; From fbaf9b1f574f424e6aa94af8b67fa9e463be83aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E8=91=89=20Scarlet?= <93977077+mukjepscarlet@users.noreply.github.com> Date: Wed, 17 Dec 2025 18:55:11 +0800 Subject: [PATCH 3/3] for default classes --- src/it/unimi/dsi/fastutil/Function.java | 11 ++++++----- .../dsi/fastutil/IndirectPriorityQueue.java | 15 +++++++++------ .../dsi/fastutil/IndirectPriorityQueues.java | 6 ++++-- src/it/unimi/dsi/fastutil/Pair.java | 3 ++- src/it/unimi/dsi/fastutil/PriorityQueue.java | 16 +++++++++------- src/it/unimi/dsi/fastutil/PriorityQueues.java | 6 ++++-- src/it/unimi/dsi/fastutil/SortedPair.java | 7 ++++--- src/it/unimi/dsi/fastutil/Stack.java | 4 +++- .../fastutil/io/FastByteArrayInputStream.java | 6 ++++-- .../io/InspectableFileCachedInputStream.java | 3 ++- 10 files changed, 47 insertions(+), 30 deletions(-) diff --git a/src/it/unimi/dsi/fastutil/Function.java b/src/it/unimi/dsi/fastutil/Function.java index 4576b5dc4..6eb3a1ec8 100644 --- a/src/it/unimi/dsi/fastutil/Function.java +++ b/src/it/unimi/dsi/fastutil/Function.java @@ -22,6 +22,7 @@ import it.unimi.dsi.fastutil.bytes.Byte2CharFunction; import it.unimi.dsi.fastutil.ints.Int2IntFunction; import it.unimi.dsi.fastutil.ints.Int2LongFunction; +import org.jspecify.annotations.Nullable; /** A function mapping keys into values. * @@ -77,7 +78,7 @@ */ @FunctionalInterface -public interface Function extends java.util.function.Function { +public interface Function extends java.util.function.Function { /** {@inheritDoc} This is equivalent to calling {@link #get(Object)}. * @@ -112,7 +113,7 @@ default V put(final K key, final V value) { * @see java.util.Map#get(Object) */ - V get(Object key); + V get(@Nullable Object key); /** * Returns the value associated by this function to the specified key, or give the specified @@ -125,7 +126,7 @@ default V put(final K key, final V value) { * @see java.util.Map#getOrDefault(Object, Object) * @since 8.5.0 */ - default V getOrDefault(final Object key, final V defaultValue) { + default V getOrDefault(final @Nullable Object key, final V defaultValue) { final V value = get(key); return (value != null || containsKey(key)) ? value : defaultValue; } @@ -142,7 +143,7 @@ default V getOrDefault(final Object key, final V defaultValue) { * @see java.util.Map#containsKey(Object) */ - default boolean containsKey(final Object key) { + default boolean containsKey(final @Nullable Object key) { return true; } @@ -153,7 +154,7 @@ default boolean containsKey(final Object key) { * @see java.util.Map#remove(Object) */ - default V remove(final Object key) { + default V remove(final @Nullable Object key) { throw new UnsupportedOperationException(); } diff --git a/src/it/unimi/dsi/fastutil/IndirectPriorityQueue.java b/src/it/unimi/dsi/fastutil/IndirectPriorityQueue.java index 97727408c..88d5656a4 100644 --- a/src/it/unimi/dsi/fastutil/IndirectPriorityQueue.java +++ b/src/it/unimi/dsi/fastutil/IndirectPriorityQueue.java @@ -16,6 +16,8 @@ package it.unimi.dsi.fastutil; +import org.jspecify.annotations.Nullable; + import java.util.Comparator; import java.util.NoSuchElementException; @@ -52,7 +54,7 @@ *

Note that all element manipulation happens via indices. */ -public interface IndirectPriorityQueue { +public interface IndirectPriorityQueue { /** Enqueues a new element. * @@ -116,11 +118,12 @@ default void changed() { changed(first()); } - /** Returns the comparator associated with this queue, or {@code null} if it uses its elements' natural ordering. - * - * @return the comparator associated with this sorted set, or {@code null} if it uses its elements' natural ordering. - */ - Comparator comparator(); + /** + * Returns the comparator associated with this queue, or {@code null} if it uses its elements' natural ordering. + * + * @return the comparator associated with this sorted set, or {@code null} if it uses its elements' natural ordering. + */ + @Nullable Comparator comparator(); /** Notifies this queue that the specified element has changed (optional operation). * diff --git a/src/it/unimi/dsi/fastutil/IndirectPriorityQueues.java b/src/it/unimi/dsi/fastutil/IndirectPriorityQueues.java index 5a57ceb66..c1578cbdb 100644 --- a/src/it/unimi/dsi/fastutil/IndirectPriorityQueues.java +++ b/src/it/unimi/dsi/fastutil/IndirectPriorityQueues.java @@ -16,6 +16,8 @@ package it.unimi.dsi.fastutil; +import org.jspecify.annotations.Nullable; + import java.util.Comparator; import java.util.NoSuchElementException; @@ -60,7 +62,7 @@ public void clear() {} @Override public void allChanged() {} @Override - public Comparator comparator() { return null; } + public @Nullable Comparator comparator() { return null; } @Override public void changed(final int i) { throw new IllegalArgumentException("Index " + i + " is not in the queue"); } @Override @@ -120,7 +122,7 @@ protected SynchronizedIndirectPriorityQueue(final IndirectPriorityQueue q) { @Override public boolean remove(final int i) { synchronized(sync) { return q.remove(i); } } @Override - public Comparator comparator() { synchronized(sync) { return q.comparator(); } } + public @Nullable Comparator comparator() { synchronized(sync) { return q.comparator(); } } @Override public int front(final int[] a) { return q.front(a); } } diff --git a/src/it/unimi/dsi/fastutil/Pair.java b/src/it/unimi/dsi/fastutil/Pair.java index d904cd941..6fb90debb 100644 --- a/src/it/unimi/dsi/fastutil/Pair.java +++ b/src/it/unimi/dsi/fastutil/Pair.java @@ -19,6 +19,7 @@ import java.util.Comparator; import it.unimi.dsi.fastutil.objects.ObjectObjectImmutablePair; +import org.jspecify.annotations.Nullable; /** * A pair of elements. @@ -49,7 +50,7 @@ * @param the type of the right element. */ -public interface Pair { +public interface Pair { /** * Returns the left element of this pair. diff --git a/src/it/unimi/dsi/fastutil/PriorityQueue.java b/src/it/unimi/dsi/fastutil/PriorityQueue.java index 64918cb52..a8163a650 100644 --- a/src/it/unimi/dsi/fastutil/PriorityQueue.java +++ b/src/it/unimi/dsi/fastutil/PriorityQueue.java @@ -16,6 +16,8 @@ package it.unimi.dsi.fastutil; +import org.jspecify.annotations.Nullable; + import java.util.Comparator; import java.util.NoSuchElementException; @@ -36,7 +38,7 @@ * changed its relative position in the order}. */ -public interface PriorityQueue { +public interface PriorityQueue { /** Enqueues a new element. * @@ -98,10 +100,10 @@ default boolean isEmpty() { default void changed() { throw new UnsupportedOperationException(); } - - /** Returns the comparator associated with this queue, or {@code null} if it uses its elements' natural ordering. - * - * @return the comparator associated with this sorted set, or {@code null} if it uses its elements' natural ordering. - */ - Comparator comparator(); + /** + * Returns the comparator associated with this queue, or {@code null} if it uses its elements' natural ordering. + * + * @return the comparator associated with this sorted set, or {@code null} if it uses its elements' natural ordering. + */ + @Nullable Comparator comparator(); } diff --git a/src/it/unimi/dsi/fastutil/PriorityQueues.java b/src/it/unimi/dsi/fastutil/PriorityQueues.java index 14da80944..83ca0da5b 100644 --- a/src/it/unimi/dsi/fastutil/PriorityQueues.java +++ b/src/it/unimi/dsi/fastutil/PriorityQueues.java @@ -16,6 +16,8 @@ package it.unimi.dsi.fastutil; +import org.jspecify.annotations.Nullable; + import java.io.Serializable; import java.util.Comparator; import java.util.NoSuchElementException; @@ -66,7 +68,7 @@ public void clear() {} public void changed() { throw new NoSuchElementException(); } @Override - public Comparator comparator() { return null; } + public @Nullable Comparator comparator() { return null; } @Override public Object clone() { return EMPTY_QUEUE; } @@ -138,7 +140,7 @@ protected SynchronizedPriorityQueue(final PriorityQueue q) { public void changed() { synchronized(sync) { q.changed(); } } @Override - public Comparator comparator() { synchronized(sync) { return q.comparator(); } } + public @Nullable Comparator comparator() { synchronized(sync) { return q.comparator(); } } @Override public String toString() { synchronized(sync) { return q.toString(); } } diff --git a/src/it/unimi/dsi/fastutil/SortedPair.java b/src/it/unimi/dsi/fastutil/SortedPair.java index 7a480b071..6c0b0f495 100644 --- a/src/it/unimi/dsi/fastutil/SortedPair.java +++ b/src/it/unimi/dsi/fastutil/SortedPair.java @@ -20,6 +20,7 @@ import it.unimi.dsi.fastutil.objects.ObjectObjectImmutablePair; import it.unimi.dsi.fastutil.objects.ObjectObjectImmutableSortedPair; +import org.jspecify.annotations.Nullable; /** * A pair of sorted elements. @@ -40,7 +41,7 @@ * @param the type of the elements. */ -public interface SortedPair> extends Pair { +public interface SortedPair> extends Pair { /** * Returns a new immutable {@link it.unimi.dsi.fastutil.SortedPair SortedPair} with given left @@ -55,7 +56,7 @@ public interface SortedPair> extends Pair { * @implNote This factory method delegates to * {@link ObjectObjectImmutablePair#of(Object, Object)}. */ - public static > SortedPair of(final K l, final K r) { + public static > SortedPair of(final K l, final K r) { return ObjectObjectImmutableSortedPair.of(l, r); } @@ -65,7 +66,7 @@ public static > SortedPair of(final K l, final K r) { * @param o an object, or {@code null}- * @return true if one of the two elements of this sorted pair is equal to {@code o}. */ - default boolean contains(final Object o) { + default boolean contains(final @Nullable Object o) { return Objects.equals(o, left()) || Objects.equals(o, right()); } } diff --git a/src/it/unimi/dsi/fastutil/Stack.java b/src/it/unimi/dsi/fastutil/Stack.java index b1907afb9..32fd58fa3 100644 --- a/src/it/unimi/dsi/fastutil/Stack.java +++ b/src/it/unimi/dsi/fastutil/Stack.java @@ -16,6 +16,8 @@ package it.unimi.dsi.fastutil; +import org.jspecify.annotations.Nullable; + import java.util.NoSuchElementException; /** A stack. @@ -30,7 +32,7 @@ * @param the types of elements in the stack. */ -public interface Stack { +public interface Stack { /** Pushes the given object on the stack. * diff --git a/src/it/unimi/dsi/fastutil/io/FastByteArrayInputStream.java b/src/it/unimi/dsi/fastutil/io/FastByteArrayInputStream.java index e0fd9946f..90ce3065c 100644 --- a/src/it/unimi/dsi/fastutil/io/FastByteArrayInputStream.java +++ b/src/it/unimi/dsi/fastutil/io/FastByteArrayInputStream.java @@ -15,6 +15,8 @@ */ package it.unimi.dsi.fastutil.io; +import org.jspecify.annotations.Nullable; + import java.io.DataInputStream; import java.io.IOException; import java.io.ObjectInput; @@ -219,7 +221,7 @@ public double readDouble () { } @Override @Deprecated - public String readLine () { + public @Nullable String readLine () { final StringBuilder sb = new StringBuilder(99); loop: for (int c;;){ @@ -245,7 +247,7 @@ public String readLine () { @Override public String readUTF () throws UTFDataFormatException { try { - return available() > 0 ? DataInputStream.readUTF(this) : null; + return available() > 0 ? DataInputStream.readUTF(this) : null; // FIXME: DataInput.readUTF should be NotNull } catch (final UTFDataFormatException badBinaryFormatting){ throw badBinaryFormatting; } catch (final IOException e){ diff --git a/src/it/unimi/dsi/fastutil/io/InspectableFileCachedInputStream.java b/src/it/unimi/dsi/fastutil/io/InspectableFileCachedInputStream.java index b92a2fc8c..442010046 100644 --- a/src/it/unimi/dsi/fastutil/io/InspectableFileCachedInputStream.java +++ b/src/it/unimi/dsi/fastutil/io/InspectableFileCachedInputStream.java @@ -27,6 +27,7 @@ import java.nio.channels.WritableByteChannel; import it.unimi.dsi.fastutil.bytes.ByteArrays; +import org.jspecify.annotations.Nullable; /** A {@linkplain RepositionableStream repositionable} {@link MeasurableInputStream} based on * cached data received by a {@link WritableByteChannel} whose first bytes can be inspected directly. @@ -95,7 +96,7 @@ public class InspectableFileCachedInputStream extends MeasurableInputStream impl * @param bufferSize the buffer size, in bytes. * @param overflowFile the directory where the overflow file should be created, or {@code null} for the default temporary directory. */ - public InspectableFileCachedInputStream(final int bufferSize, final File overflowFile) throws IOException { + public InspectableFileCachedInputStream(final int bufferSize, final @Nullable File overflowFile) throws IOException { if (bufferSize <= 0) throw new IllegalArgumentException("Illegal buffer size " + bufferSize); if (overflowFile != null) this.overflowFile = overflowFile; else (this.overflowFile = File.createTempFile(getClass().getSimpleName(), "overflow")).deleteOnExit();