X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FResultNode.java;h=579a86874726b882293402f841e57f8701dcbe26;hp=e22bd45a41c07ea64b1f32e64c393481adec021e;hb=d96df56ee69e62c4d4d6dfe3786ea4853e5120eb;hpb=76ce41540f06ac1fbcb44332dd62f53e88c27cf1 diff --git a/src/edu/berkeley/sbp/ResultNode.java b/src/edu/berkeley/sbp/ResultNode.java index e22bd45..579a868 100644 --- a/src/edu/berkeley/sbp/ResultNode.java +++ b/src/edu/berkeley/sbp/ResultNode.java @@ -10,90 +10,37 @@ final class ResultNode extends Node { private Forest.Many f = new Forest.Many(); - private boolean destroyed = false; - private boolean primordeal; - private int usedByNonDoomedNode = 0; private Pos reduction; - private GSS.Phase predPhase; + public void merge(Forest newf) { this.f.merge(newf); } public Pos reduction() { return reduction; } - public void merge(Forest newf) { - this.f.merge(newf); - /* - if (predecessors.contains(pred)) return; - addPred(pred); - if (fromEmptyReduction) return; - n.state().invokeReductions(n.phase().getToken(), n, this); - */ - } - - public GSS.Phase phase() { return predPhase; } + public boolean isDoomedState() { /* this is irrelevant */ return false; } public Forest getForest() { return f; } - public void addSucc(StateNode succ) { - if (successors.contains(succ)) return; - successors.add(succ); - usedByNonDoomedNode += succ.state().doomed ? 0 : 1; - if (predecessors.size() > 1) throw new Error(); - } - public void removeSucc(StateNode succ) { - if (!successors.contains(succ)) return; - successors.remove(succ); - usedByNonDoomedNode -= succ.state().doomed ? 0 : 1; - check(); - } - - public boolean usedByAnyNode() { return successors.size() > 0; } - public boolean usedByNonDoomedNode() { return usedByNonDoomedNode > 0; } - - public String toString() { return super.toString()+"->"+predPhase; } + public String toString() { return super.toString()+"->"+phase(); } public void check() { + if (destroyed) return; if (successors.size()==0) destroy(); else if (predecessors.size()==0) destroy(); } - public void destroy() { + protected void destroy() { if (destroyed) return; - if (primordeal) return; // never destroy the "primordeal" result - destroyed = true; - while(predecessors.size() > 0) - for(StateNode pred : predecessors) { - removePred(pred); - pred.removeSucc(this); - break; - } - predecessors = null; - while(successors.size() > 0) - for(StateNode succ : successors) { - removeSucc(succ); - succ.removePred(this); - break; - } - successors = null; - } - - public void removePred(StateNode pred) { - if (!predecessors.contains(pred)) return; - predecessors.remove(pred); - check(); + if (predecessorPhase()==null) return; // never destroy the "primordeal" result + super.destroy(); } public void addPred(StateNode pred) { - if (predPhase==null) predPhase = pred.phase(); - if (predPhase != pred.phase()) throw new Error(); - predecessors.add(pred); - pred.addSucc(this); + super.addPred(pred); + // results have only one predecessor if (predecessors.size() > 1) throw new Error(); } - public ResultNode() { - this(null, null, null); - this.primordeal = true; - } + public ResultNode() { this(null, null, null); } public ResultNode(Forest f, Pos reduction, StateNode pred) { + super(pred==null ? null : pred.phase(), + pred==null ? null : pred.phase()); this.f.merge(f); this.reduction = reduction; if (pred != null) addPred(pred); } - - } \ No newline at end of file