in jflex/src/main/java/jflex/core/unicode/IntCharSet.java [212:259]
public void add(int c) {
int size = intervals.size();
for (int i = 0; i < size; i++) {
Interval elem = intervals.get(i);
if (elem.end + 1 < c) continue;
if (elem.contains(c)) return; // already there, nothing to do
if (DEBUG) assert (elem.end + 1 >= c && (elem.start > c || elem.end < c));
if (elem.start > c + 1) {
intervals.add(i, Interval.ofCharacter(c));
if (DEBUG) assert invariants();
return;
}
if (DEBUG)
assert (elem.end + 1 >= c && elem.start <= c + 1 && (elem.start > c || elem.end < c));
if (c + 1 == elem.start) {
elem.start = c;
if (DEBUG) assert invariants();
return;
}
if (DEBUG) assert (elem.end + 1 == c);
elem.end = c;
// merge with next interval if it contains c
if (i + 1 >= size) {
if (DEBUG) assert invariants();
return;
}
Interval x = intervals.get(i + 1);
if (x.start <= c + 1) {
elem.end = x.end;
intervals.remove(i + 1);
}
if (DEBUG) assert invariants();
return;
}
// end reached but nothing found -> append at end
intervals.add(Interval.ofCharacter(c));
if (DEBUG) assert invariants();
}