Warning: session_start(): open(/var/lib/php/sessions/sess_3tijfe15c75s6dubujjv4nqoi8, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
sclass FreeList {
MultiSetMap byLength = multiSetMap_innerCustomCompactTreeSet_outerTreeMap(intRangeComparator());
CompactTreeSet inOrder = new(intRangeComparator());
int totalFree;
void add(IntRange r) {
if (empty(r)) ret;
// only special case here is merging with previous and/or following entry
IntRange before = inOrder.floor(r), after = inOrder.ceiling(r);
if (before != null && before.end == r.start) {
r = IntRange(before.start, r.end);
remove(before);
}
if (after != null && after.start == r.end) {
r = IntRange(r.start, after.end);
remove(after);
}
inOrder.add(r);
byLength.add(r.length(), r);
totalFree += r.length();
}
void remove(IntRange r) {
if (empty(r)) ret;
IntRange r2 = inOrder.floor(r);
if (r2 == null) fail("User error");
if (eq(r, r2)) {
inOrder.remove(r2);
byLength.remove(r2.length(), r2);
totalFree -= r2.length();
ret;
}
// remove full range, add back left and right remainders
remove(r2);
add(IntRange(r2.start, r.start));
add(IntRange(r.end, r2.end));
}
IntRange findFreeSpace(int minSize) {
Map.Entry> e = ((NavigableMap) byLength.data).ceilingEntry(minSize);
ret e == null ? null : first(e.getValue());
}
int totalFree() { ret totalFree; }
void clear {
byLength.clear();
inOrder.clear();
totalFree = 0;
}
IntRange highestFreeRange() { ret last(inOrder); }
L asList() { ret cloneList(inOrder); }
}