package jetbrains.mps.ide.dataFlow.presentation;
/*Generated by MPS */
public class FreeZone {
private FreeZone myNext;
private FreeZone myPrev;
private int myFirstIndex;
private int myLastIndex;
private boolean myIsDeleted = false;
public FreeZone(int firstIndex, int lastIndex) {
this.myFirstIndex = firstIndex;
this.myLastIndex = lastIndex;
}
public boolean insert(int first, int last) {
if (this.myIsDeleted) {
return false;
}
if (first < this.myFirstIndex) {
return false;
}
if (last > this.myLastIndex) {
return false;
}
FreeZone before;
FreeZone after;
int wasFirstIndex = this.myFirstIndex;
int wasLastIndex = this.myLastIndex;
if (this.myPrev == null) {
before = this;
} else {
before = new FreeZone(-1, -1);
before.myNext = this;
before.myPrev = this.myPrev;
if (this.myPrev != null) {
this.myPrev.myNext = before;
}
this.myPrev = before;
}
before.myFirstIndex = wasFirstIndex;
before.myLastIndex = first - 1;
if (first == wasFirstIndex) {
before.delete();
}
if (this.myNext == null && before != this) {
after = this;
} else {
after = new FreeZone(-1, -1);
after.myPrev = this;
after.myNext = this.myNext;
if (this.myNext != null) {
this.myNext.myPrev = after;
}
this.myNext = after;
}
after.myFirstIndex = last + 1;
after.myLastIndex = wasLastIndex;
if (last == wasLastIndex) {
after.delete();
}
return true;
}
public boolean canBeAdded(int first, int last) {
FreeZone current = this;
while (current != null) {
if (current.insert(first, last)) {
return true;
}
current = current.myNext;
}
return false;
}
private void delete() {
if (this.myPrev != null) {
this.myPrev.myNext = this.myNext;
}
if (this.myNext != null) {
this.myNext.myPrev = this.myPrev;
}
this.myIsDeleted = true;
}
}