package Tree;
import DPJRuntime.*;
import Tree.RecursiveTreeBuild.*;
class RecursiveTreeUpdate {
public static <region R>Body updateCenterOfMass(Node<R> node) writes R:* {
if (node == null) return null;
if (node instanceof LeafNode<R>)
return node.centerOfMass;
Body leftCoM, rightCoM;
InnerNode<R> innerNode = (InnerNode<R>) node;
cobegin {
// Effect is 'writes R:InnerNode.LeftRgn:*'
leftCoM = updateCenterOfMass(innerNode.leftChild);
// Effect is 'writes R:InnerNode.RightRgn:*'
rightCoM = updateCenterOfMass(innerNode.rightChild);
}
Body result = null;
if (leftCoM != null && rightCoM != null)
result = new Body((leftCoM.mass+rightCoM.mass)/2,
(leftCoM.pos+rightCoM.pos)/2);
else if (leftCoM != null)
result = new Body(leftCoM.mass, leftCoM.pos);
else if (rightCoM != null)
result = new Body(rightCoM.mass, rightCoM.pos);
innerNode.centerOfMass = result;
return result;
}
}