Skip to content
Open
1 change: 1 addition & 0 deletions build.xml
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,7 @@
debug="on"
deprecation="on"
optimize="on"
classpath="lib/jspecify-1.0.1.jar:lib"
destdir="${build}"
memoryMaximumSize="2G"
fork="yes"
Expand Down
86 changes: 44 additions & 42 deletions drv/AVLTreeMap.drv
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@

package PACKAGE;

import org.jspecify.annotations.Nullable;

#if ! KEYS_REFERENCE
import it.unimi.dsi.fastutil.objects.AbstractObjectSortedSet;
import it.unimi.dsi.fastutil.objects.ObjectBidirectionalIterator;
Expand Down Expand Up @@ -47,40 +49,40 @@ import java.util.NoSuchElementException;
* to a type-specific {@linkplain java.util.ListIterator list iterator}.
*/

public class AVL_TREE_MAP KEY_VALUE_GENERIC extends ABSTRACT_SORTED_MAP KEY_VALUE_GENERIC implements java.io.Serializable, Cloneable {
public class AVL_TREE_MAP KEY_VALUE_GENERIC_DEFINITION extends ABSTRACT_SORTED_MAP KEY_VALUE_GENERIC implements java.io.Serializable, Cloneable {

/** A reference to the root entry. */
protected transient Entry KEY_VALUE_GENERIC tree;
protected transient @Nullable Entry KEY_VALUE_GENERIC tree;

/** Number of entries in this map. */
protected int count;

/** The first key in this map. */
protected transient Entry KEY_VALUE_GENERIC firstEntry;
protected transient @Nullable Entry KEY_VALUE_GENERIC firstEntry;

/** The last key in this map. */
protected transient Entry KEY_VALUE_GENERIC lastEntry;
protected transient @Nullable Entry KEY_VALUE_GENERIC lastEntry;

/** Cached set of entries. */
protected transient ObjectSortedSet<MAP.Entry KEY_VALUE_GENERIC> entries;
protected transient @Nullable ObjectSortedSet<MAP.Entry KEY_VALUE_GENERIC> entries;

/** Cached set of keys. */
protected transient SORTED_SET KEY_GENERIC keys;
protected transient @Nullable SORTED_SET KEY_GENERIC keys;

/** Cached collection of values. */
protected transient VALUE_COLLECTION VALUE_GENERIC values;
protected transient @Nullable VALUE_COLLECTION VALUE_GENERIC values;

/** The value of this variable remembers, after a {@code put()}
* or a {@code remove()}, whether the <em>domain</em> of the map
* has been modified. */
protected transient boolean modified;

/** This map's comparator, as provided in the constructor. */
protected Comparator<? super KEY_GENERIC_CLASS> storedComparator;
protected @Nullable Comparator<? super KEY_GENERIC_CLASS> storedComparator;

/** This map's actual comparator; it may differ from {@link #storedComparator} because it is
always a type-specific comparator, so it could be derived from the former by wrapping. */
protected transient KEY_COMPARATOR KEY_SUPER_GENERIC actualComparator;
protected transient @Nullable KEY_COMPARATOR KEY_SUPER_GENERIC actualComparator;

private static final long serialVersionUID = -7046029254386353129L;

Expand Down Expand Up @@ -254,7 +256,7 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC extends ABSTRACT_SORTED_MAP KEY_VAL

/** This vector remembers the directions followed during
* the current insertion. It suffices for about 2<sup>32</sup> entries. */
private transient boolean dirPath[];
private transient boolean dirPath@Nullable[];

private void allocatePaths() {
dirPath = new boolean[48];
Expand Down Expand Up @@ -487,7 +489,7 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC extends ABSTRACT_SORTED_MAP KEY_VAL
* @return the parent of the given node, or {@code null} for the root.
*/

private Entry KEY_VALUE_GENERIC parent(final Entry KEY_VALUE_GENERIC e) {
private @Nullable Entry KEY_VALUE_GENERIC parent(final Entry KEY_VALUE_GENERIC e) {
if (e == tree) return null;

Entry KEY_VALUE_GENERIC x, y, p;
Expand Down Expand Up @@ -522,7 +524,7 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC extends ABSTRACT_SORTED_MAP KEY_VAL

SUPPRESS_WARNINGS_KEY_UNCHECKED
@Override
public VALUE_GENERIC_TYPE REMOVE_VALUE(final KEY_TYPE k) {
public VALUE_GENERIC_TYPE REMOVE_VALUE(final KEY_TYPE_NULLABLE k) {
modified = false;

if (tree == null) return defRetValue;
Expand Down Expand Up @@ -794,7 +796,7 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC extends ABSTRACT_SORTED_MAP KEY_VAL


@Override
public boolean containsValue(final VALUE_TYPE v) {
public boolean containsValue(final VALUE_TYPE_NULLABLE v) {
final ValueIterator i = new ValueIterator();
VALUE_GENERIC_TYPE ev;

Expand Down Expand Up @@ -827,15 +829,15 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC extends ABSTRACT_SORTED_MAP KEY_VAL
* considered equivalently a tree.
*/

private static final class Entry KEY_VALUE_GENERIC extends ABSTRACT_MAP.BasicEntry KEY_VALUE_GENERIC implements Cloneable {
private static final class Entry KEY_VALUE_GENERIC_DEFINITION extends ABSTRACT_MAP.BasicEntry KEY_VALUE_GENERIC implements Cloneable {
/** If the bit in this mask is true, {@link #right} points to a successor. */
private static final int SUCC_MASK = 1 << 31;
/** If the bit in this mask is true, {@link #left} points to a predecessor. */
private static final int PRED_MASK = 1 << 30;
/** The bits in this mask hold the node balance info. You can get it just by casting to byte. */
private static final int BALANCE_MASK = 0xFF;
/** The pointers to the left and right subtrees. */
Entry KEY_VALUE_GENERIC left, right;
@Nullable Entry KEY_VALUE_GENERIC left, right;
/** This integers holds different information in different bits (see {@link #SUCC_MASK}, {@link #PRED_MASK} and {@link #BALANCE_MASK}). */
int info;

Expand All @@ -858,7 +860,7 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC extends ABSTRACT_SORTED_MAP KEY_VAL
* @return the left subtree ({@code null} if the left
* subtree is empty).
*/
Entry KEY_VALUE_GENERIC left() {
@Nullable Entry KEY_VALUE_GENERIC left() {
return (info & PRED_MASK) != 0 ? null : left;
}

Expand All @@ -867,7 +869,7 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC extends ABSTRACT_SORTED_MAP KEY_VAL
* @return the right subtree ({@code null} if the right
* subtree is empty).
*/
Entry KEY_VALUE_GENERIC right() {
@Nullable Entry KEY_VALUE_GENERIC right() {
return (info & SUCC_MASK) != 0 ? null : right;
}

Expand Down Expand Up @@ -904,15 +906,15 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC extends ABSTRACT_SORTED_MAP KEY_VAL
/** Sets the left pointer to a predecessor.
* @param pred the predecessr.
*/
void pred(final Entry KEY_VALUE_GENERIC pred) {
void pred(final @Nullable Entry KEY_VALUE_GENERIC pred) {
info |= PRED_MASK;
left = pred;
}

/** Sets the right pointer to a successor.
* @param succ the successor.
*/
void succ(final Entry KEY_VALUE_GENERIC succ) {
void succ(final @Nullable Entry KEY_VALUE_GENERIC succ) {
info |= SUCC_MASK;
right = succ;
}
Expand Down Expand Up @@ -1007,7 +1009,7 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC extends ABSTRACT_SORTED_MAP KEY_VAL

@Override
@SuppressWarnings("unchecked")
public boolean equals(final Object o) {
public boolean equals(final @Nullable Object o) {
if (!(o instanceof Map.Entry)) return false;
Map.Entry<KEY_GENERIC_CLASS, VALUE_GENERIC_CLASS> e = (Map.Entry<KEY_GENERIC_CLASS, VALUE_GENERIC_CLASS>)o;

Expand Down Expand Up @@ -1062,7 +1064,7 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC extends ABSTRACT_SORTED_MAP KEY_VAL

SUPPRESS_WARNINGS_KEY_UNCHECKED
@Override
public boolean containsKey(final KEY_TYPE k) {
public boolean containsKey(final KEY_TYPE_NULLABLE k) {
RETURN_FALSE_IF_KEY_NULL(k)
return findKey(KEY_GENERIC_CAST k) != null;
}
Expand All @@ -1079,7 +1081,7 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC extends ABSTRACT_SORTED_MAP KEY_VAL

SUPPRESS_WARNINGS_KEY_UNCHECKED
@Override
public VALUE_GENERIC_TYPE GET_VALUE(final KEY_TYPE k) {
public VALUE_GENERIC_TYPE GET_VALUE(final KEY_TYPE_NULLABLE k) {
final Entry KEY_VALUE_GENERIC e = findKey(KEY_GENERIC_CAST k);
return e == null ? defRetValue : e.value;
}
Expand All @@ -1104,11 +1106,11 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC extends ABSTRACT_SORTED_MAP KEY_VAL

private class TreeIterator {
/** The entry that will be returned by the next call to {@link java.util.ListIterator#previous()} (or {@code null} if no previous entry exists). */
Entry KEY_VALUE_GENERIC prev;
@Nullable Entry KEY_VALUE_GENERIC prev;
/** The entry that will be returned by the next call to {@link java.util.ListIterator#next()} (or {@code null} if no next entry exists). */
Entry KEY_VALUE_GENERIC next;
@Nullable Entry KEY_VALUE_GENERIC next;
/** The last entry that was returned (or {@code null} if we did not iterate or used {@link #remove()}). */
Entry KEY_VALUE_GENERIC curr;
@Nullable Entry KEY_VALUE_GENERIC curr;
/** The current index (in the sense of a {@link java.util.ListIterator}). Note that this value is not meaningful when this {@link TreeIterator} has been created using the nonempty constructor.*/
int index = 0;

Expand Down Expand Up @@ -1234,7 +1236,7 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC extends ABSTRACT_SORTED_MAP KEY_VAL

@Override
SUPPRESS_WARNINGS_KEY_UNCHECKED
public boolean contains(final Object o) {
public boolean contains(final @Nullable Object o) {
if (o == null || !(o instanceof Map.Entry)) return false;
final Map.Entry<?,?> e = (Map.Entry<?,?>)o;
if (e.getKey() == null) return false;
Expand All @@ -1250,7 +1252,7 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC extends ABSTRACT_SORTED_MAP KEY_VAL

@Override
SUPPRESS_WARNINGS_KEY_UNCHECKED
public boolean remove(final Object o) {
public boolean remove(final @Nullable Object o) {
if (!(o instanceof Map.Entry)) return false;
final Map.Entry<?,?> e = (Map.Entry<?,?>)o;
if (e.getKey() == null) return false;
Expand Down Expand Up @@ -1355,7 +1357,7 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC extends ABSTRACT_SORTED_MAP KEY_VAL
@Override
public VALUE_ITERATOR VALUE_GENERIC iterator() { return new ValueIterator(); }
@Override
public boolean contains(final VALUE_TYPE k) { return containsValue(k); }
public boolean contains(final VALUE_TYPE_NULLABLE k) { return containsValue(k); }
@Override
public int size() { return count; }
@Override
Expand Down Expand Up @@ -1398,11 +1400,11 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC extends ABSTRACT_SORTED_MAP KEY_VAL
/** If true, the submap range goes to &infin;. */
boolean top;
/** Cached set of entries. */
protected transient ObjectSortedSet<MAP.Entry KEY_VALUE_GENERIC> entries;
protected transient @Nullable ObjectSortedSet<MAP.Entry KEY_VALUE_GENERIC> entries;
/** Cached set of keys. */
protected transient SORTED_SET KEY_GENERIC keys;
protected transient @Nullable SORTED_SET KEY_GENERIC keys;
/** Cached collection of values. */
protected transient VALUE_COLLECTION VALUE_GENERIC values;
protected transient @Nullable VALUE_COLLECTION VALUE_GENERIC values;

/** Creates a new submap with given key range.
*
Expand Down Expand Up @@ -1450,7 +1452,7 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC extends ABSTRACT_SORTED_MAP KEY_VAL
public Comparator<? super MAP.Entry KEY_VALUE_GENERIC> comparator() { return AVL_TREE_MAP.this.ENTRYSET().comparator(); }
@Override
SUPPRESS_WARNINGS_KEY_UNCHECKED
public boolean contains(final Object o) {
public boolean contains(final @Nullable Object o) {
if (!(o instanceof Map.Entry)) return false;
final Map.Entry<?,?> e = (Map.Entry<?,?>)o;
#if KEYS_PRIMITIVE
Expand All @@ -1464,7 +1466,7 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC extends ABSTRACT_SORTED_MAP KEY_VAL
}
@Override
SUPPRESS_WARNINGS_KEY_UNCHECKED
public boolean remove(final Object o) {
public boolean remove(final @Nullable Object o) {
if (!(o instanceof Map.Entry)) return false;
final Map.Entry<?,?> e = (Map.Entry<?,?>)o;
#if KEYS_PRIMITIVE
Expand Down Expand Up @@ -1522,7 +1524,7 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC extends ABSTRACT_SORTED_MAP KEY_VAL
@Override
public VALUE_ITERATOR VALUE_GENERIC iterator() { return new SubmapValueIterator(); }
@Override
public boolean contains(final VALUE_TYPE k) { return containsValue(k); }
public boolean contains(final VALUE_TYPE_NULLABLE k) { return containsValue(k); }
@Override
public int size() { return Submap.this.size();}
@Override
Expand All @@ -1534,13 +1536,13 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC extends ABSTRACT_SORTED_MAP KEY_VAL

@Override
SUPPRESS_WARNINGS_KEY_UNCHECKED
public boolean containsKey(final KEY_TYPE k) {
public boolean containsKey(final KEY_TYPE_NULLABLE k) {
RETURN_FALSE_IF_KEY_NULL(k)
return in(KEY_GENERIC_CAST k) && AVL_TREE_MAP.this.containsKey(k);
}

@Override
public boolean containsValue(final VALUE_TYPE v) {
public boolean containsValue(final VALUE_TYPE_NULLABLE v) {
final SubmapIterator i = new SubmapIterator();
VALUE_TYPE ev;

Expand All @@ -1554,7 +1556,7 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC extends ABSTRACT_SORTED_MAP KEY_VAL

@Override
SUPPRESS_WARNINGS_KEY_UNCHECKED
public VALUE_GENERIC_TYPE GET_VALUE(final KEY_TYPE k) {
public VALUE_GENERIC_TYPE GET_VALUE(final KEY_TYPE_NULLABLE k) {
final AVL_TREE_MAP.Entry KEY_VALUE_GENERIC e;
final KEY_GENERIC_TYPE kk = KEY_GENERIC_CAST k;
return in(kk) && (e = findKey(kk)) != null ? e.value : this.defRetValue;
Expand All @@ -1570,7 +1572,7 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC extends ABSTRACT_SORTED_MAP KEY_VAL

@Override
SUPPRESS_WARNINGS_KEY_UNCHECKED
public VALUE_GENERIC_TYPE REMOVE_VALUE(final KEY_TYPE k) {
public VALUE_GENERIC_TYPE REMOVE_VALUE(final KEY_TYPE_NULLABLE k) {
modified = false;
if (! in(KEY_GENERIC_CAST k)) return this.defRetValue;
final VALUE_GENERIC_TYPE oldValue = AVL_TREE_MAP.this.REMOVE_VALUE(k);
Expand Down Expand Up @@ -1621,7 +1623,7 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC extends ABSTRACT_SORTED_MAP KEY_VAL
*
* @return the first entry of this submap, or {@code null} if the submap is empty.
*/
public AVL_TREE_MAP.Entry KEY_VALUE_GENERIC firstEntry() {
public AVL_TREE_MAP.@Nullable Entry KEY_VALUE_GENERIC firstEntry() {
if (tree == null) return null;
// If this submap goes to -infinity, we return the main map first entry; otherwise, we locate the start of the map.
AVL_TREE_MAP.Entry KEY_VALUE_GENERIC e;
Expand All @@ -1640,7 +1642,7 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC extends ABSTRACT_SORTED_MAP KEY_VAL
*
* @return the last entry of this submap, or {@code null} if the submap is empty.
*/
public AVL_TREE_MAP.Entry KEY_VALUE_GENERIC lastEntry() {
public AVL_TREE_MAP.@Nullable Entry KEY_VALUE_GENERIC lastEntry() {
if (tree == null) return null;
// If this submap goes to infinity, we return the main map last entry; otherwise, we locate the end of the map.
AVL_TREE_MAP.Entry KEY_VALUE_GENERIC e;
Expand Down Expand Up @@ -1856,7 +1858,7 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC extends ABSTRACT_SORTED_MAP KEY_VAL
* @param succ the entry containing the key that follows the last key in the tree.
*/
SUPPRESS_WARNINGS_KEY_VALUE_UNCHECKED
private Entry KEY_VALUE_GENERIC readTree(final java.io.ObjectInputStream s, final int n, final Entry KEY_VALUE_GENERIC pred, final Entry KEY_VALUE_GENERIC succ) throws java.io.IOException, ClassNotFoundException {
private Entry KEY_VALUE_GENERIC readTree(final java.io.ObjectInputStream s, final int n, final @Nullable Entry KEY_VALUE_GENERIC pred, final @Nullable Entry KEY_VALUE_GENERIC succ) throws java.io.IOException, ClassNotFoundException {
if (n == 1) {
final Entry KEY_VALUE_GENERIC top = new Entry KEY_VALUE_GENERIC_DIAMOND(KEY_GENERIC_CAST s.READ_KEY(), VALUE_GENERIC_CAST s.READ_VALUE());
top.pred(pred);
Expand Down Expand Up @@ -1920,7 +1922,7 @@ public class AVL_TREE_MAP KEY_VALUE_GENERIC extends ABSTRACT_SORTED_MAP KEY_VAL


#ifdef ASSERTS_CODE
private static KEY_VALUE_GENERIC int checkTree(Entry KEY_VALUE_GENERIC e) {
private static KEY_VALUE_GENERIC_DEFINITION int checkTree(Entry KEY_VALUE_GENERIC e) {
if (e == null) return 0;

final int leftN = checkTree(e.left()), rightN = checkTree(e.right());
Expand Down
Loading