00001 package edu.ksu.cis.bandera.bir;
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 import ca.mcgill.sable.util.*;
00036
00037 import java.io.*;
00038 import java.util.*;
00039
00040
00041
00042
00043
00044 public class Range extends Type implements BirConstants {
00045
00046 int rangeSize = 0;
00047 int firstElement = 0;
00048 ConstExpr fromVal;
00049 ConstExpr toVal;
00050
00051 public Range() {
00052 this(- (1 << 31), (1 << 31) - 1);
00053 }
00054 public Range(int lo, int hi) {
00055 this.rangeSize = (hi - lo) + 1;
00056 this.firstElement = lo;
00057 this.fromVal = new IntLit(lo);
00058 this.toVal = new IntLit(hi);
00059 }
00060 public Range(ConstExpr fromVal, ConstExpr toVal) {
00061 this.fromVal = fromVal;
00062 this.toVal = toVal;
00063 this.firstElement = fromVal.getValue();
00064 this.rangeSize = (toVal.getValue() - fromVal.getValue()) + 1;
00065 }
00066 public void apply(TypeSwitch sw, Object o)
00067 {
00068 sw.caseRange(this, o);
00069 }
00070 public boolean containsValue(Object value) {
00071 int val;
00072 if (value instanceof Integer)
00073 val = ((Integer)value).intValue();
00074 else if (value instanceof ConstExpr)
00075 val = ((ConstExpr)value).getValue();
00076 else
00077 return false;
00078 return (val >= firstElement && val < firstElement + rangeSize);
00079 }
00080 public Expr defaultVal() {
00081
00082 if (firstElement <= 0 && 0 <= (firstElement + rangeSize))
00083 return new IntLit(0);
00084 else
00085 return new IntLit(firstElement);
00086 }
00087 public boolean equals(Object o) {
00088 return (o instanceof Range) && ((Range)o).rangeSize == this.rangeSize
00089 && ((Range)o).firstElement == this.firstElement;
00090 }
00091 public int getFirstElement() { return firstElement; }
00092 public ConstExpr getFromVal() { return fromVal; }
00093 public int getRangeSize() { return rangeSize; }
00094 public ConstExpr getToVal() { return toVal; }
00095 public boolean isKind(int kind) {
00096 return (kind & RANGE) != 0;
00097 }
00098 public boolean isSubtypeOf(Type type) {
00099 if (! type.isKind(RANGE))
00100 return false;
00101 Range other = (Range) type;
00102 return this.fromVal.getValue() >= other.fromVal.getValue()
00103 && this.toVal.getValue() <= other.toVal.getValue();
00104 }
00105 public String toString() {
00106 return "range " + fromVal + ".." + toVal;
00107 }
00108 }