import org.checkerframework.checker.initialization.qual.NotOnlyInitialized;
import org.checkerframework.checker.initialization.qual.UnderInitialization;
import org.checkerframework.checker.nullness.qual.Nullable;
// This example is taken from the FBC paper, figure 1 (and has some additional code in main below).
// We made the list generic.
public class List<T> {
@NotOnlyInitialized Node<T> sentinel;
public List() {
this.sentinel = new Node<T>(this);
}
void insert(@Nullable T data) {
this.sentinel.insertAfter(data);
}
public static void main() {
List<Integer> l = new List<Integer>();
l.insert(1);
l.insert(2);
}
}
class Node<T> {
@NotOnlyInitialized Node<T> prev;
@NotOnlyInitialized Node<T> next;
@NotOnlyInitialized List parent;
@Nullable T data;
// for sentinel construction
Node(@UnderInitialization List parent) {
this.parent = parent;
this.prev = this;
this.next = this;
}
// for data node construction
Node(Node<T> prev, Node<T> next, @Nullable T data) {
this.parent = prev.parent;
this.prev = prev;
this.next = next;
this.data = data;
}
void insertAfter(@Nullable T data) {
Node<T> n = new Node<T>(this, this.next, data);
this.next.prev = n;
this.next = n;
}
}