package net.sourceforge.pain.logic.fn;
import net.sourceforge.pain.data.type.*;
/**
* PAiN Date: 14.04.2003 Time: 0:50:45
*/
public final class RelocateFn {
public static void relocate(Located obj, Space dst) {
removeFromSpace(obj); // removing obj from src space
addToSpace(dst, obj); // adding obj to dst space
}
public static void removeFromSpace(Located obj) {
final Space space = obj.getLocation();
final Located prev = obj.getPrevInSpace();
final Located next = obj.getNextInSpace();
if (prev != obj) { // backward iteration has no nulls! see Located.java
final Located firstInSpace = space.getFirstInSpace();
if (next != null) {
next.setPrevInSpace(prev);
} else { // obj is last, and obj was prev for first
firstInSpace.setPrevInSpace(prev);
}
if (obj != firstInSpace) { //last in list should have next = null
prev.setNextInSpace(next);
} else {
space.setFirstInSpace(next);
}
} else { // there only one obj in space
space.setFirstInSpace(null);
}
obj.setLocation(null);
obj.setNextInSpace(null);
obj.setPrevInSpace(null);
}
/** used for new created objects*/
public static void addToSpace(Space space, Located obj) {
Located first = space.getFirstInSpace();
if (first != null) {
final Located prev = first.getPrevInSpace(); // last in list
prev.setNextInSpace(obj);
obj.setPrevInSpace(prev);
} else {
space.setFirstInSpace(obj);
first = obj;
}
first.setPrevInSpace(obj); //backward list should be without nulls!
obj.setNextInSpace(null); // forward list finished on null!
obj.setLocation(space);
}
}