00001
00005 package edu.mit.csail.sdg.squander.spec.constant;
00006
00007 import java.util.ArrayList;
00008 import java.util.Collections;
00009 import java.util.HashSet;
00010 import java.util.Set;
00011
00012 import edu.mit.csail.sdg.squander.absstate.ObjTuple;
00013 import edu.mit.csail.sdg.squander.absstate.ObjTupleSet;
00014 import edu.mit.csail.sdg.squander.engine.ForgeConverter;
00015 import edu.mit.csail.sdg.squander.spec.ForgeScene;
00016
00017
00018 public class ConstRel2Bound implements ConstRelVisitor<ObjTupleSet> {
00019
00020 private final ForgeConverter fconv;
00021 private final ArrayList<Integer> ints;
00022
00023 public ConstRel2Bound(ForgeConverter fconv) {
00024 this.fconv = fconv;
00025 this.ints = new ArrayList<Integer>(allInts());
00026 Collections.sort(ints);
00027 }
00028
00029 @Override
00030 public ObjTupleSet visitDec() {
00031 ObjTupleSet fc = new ObjTupleSet(2);
00032 for (int i = 1; i < ints.size(); i++)
00033 fc.add(new ObjTuple(i, i - 1));
00034 return fc;
00035 }
00036
00037 @Override
00038 public ObjTupleSet visitInc() {
00039 ObjTupleSet fc = new ObjTupleSet(2);
00040 for (int i = 0; i < ints.size() - 1; i++)
00041 fc.add(new ObjTuple(i, i + 1));
00042 return fc;
00043 }
00044
00045 @Override
00046 public ObjTupleSet visitIdent() {
00047 throw new RuntimeException("not implemented");
00048 }
00049
00050 @Override
00051 public ObjTupleSet visitNone() {
00052
00053 throw new RuntimeException("not implemented");
00054 }
00055
00056 @Override
00057 public ObjTupleSet visitUniv() {
00058 throw new RuntimeException("not implemented");
00059 }
00060
00061 protected Set<Integer> allInts() {
00062 Set<Integer> ints = new HashSet<Integer>();
00063 ForgeScene forgeScene = fconv.forgeScene();
00064 if (forgeScene.isEnsureAllInts()) {
00065 for (int i = fconv.minInt(); i <= fconv.maxInt(); i++)
00066 ints.add(i);
00067 } else {
00068 for (int i : forgeScene.ints())
00069 if (i >= fconv.minInt() && i <= fconv.maxInt())
00070 ints.add(i);
00071 }
00072 return ints;
00073 }
00074
00075 }