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 Enumerated extends Type implements BirConstants {
00045
00046 int minElement;
00047 int maxElement;
00048 Hashtable elementName = new Hashtable();
00049 Hashtable elementValue = new Hashtable();
00050 Vector constants = new Vector();
00051
00052
00053
00054
00055
00056
00057
00058
00059 public Constant add(String name) {
00060 if (elementName.size() == 0)
00061 return add(name, 0);
00062 else
00063 return add(name, maxElement + 1);
00064 }
00065
00066
00067
00068
00069
00070
00071
00072 public Constant add(String name, int value) {
00073 if (elementName.size() == 0)
00074 minElement = maxElement = value;
00075 else if (value > maxElement)
00076 maxElement = value;
00077 else if (value < minElement)
00078 minElement = value;
00079 Integer val = new Integer(value);
00080 elementName.put(val, name);
00081 elementValue.put(name, val);
00082 Constant constant = new Constant(name,value,this);
00083 constants.addElement(constant);
00084 return constant;
00085 }
00086 public void apply(TypeSwitch sw, Object o)
00087 {
00088 sw.caseEnumerated(this, o);
00089 }
00090 public boolean compatibleWith(Type type) {
00091 return this == type;
00092 }
00093 public boolean containsValue(Object value) {
00094 return (value instanceof Constant) &&
00095 (((Constant)value).getType() == this);
00096 }
00097 public Expr defaultVal() {
00098 return new Constant(getNameOf(minElement),minElement,this);
00099 }
00100 public boolean equals(Object o) {
00101 if (o instanceof Enumerated) {
00102 Vector o_constants = ((Enumerated)o).constants;
00103 for (int i = 0; i < constants.size(); i++)
00104 if (! o_constants.contains(constants.elementAt(i)))
00105 return false;
00106 return o_constants.size() == constants.size();
00107 }
00108 return false;
00109 }
00110
00111
00112
00113
00114
00115 public Vector getConstants() { return constants; }
00116
00117
00118
00119
00120
00121
00122 public int getEnumeratedSize() {
00123 return (elementName.size() == 0) ? 0 : (maxElement - minElement) + 1;
00124 }
00125 public int getFirstElement() { return minElement; }
00126 public String getNameOf(int value) {
00127 Object name = elementName.get(new Integer(value));
00128 if (name != null)
00129 return (String) name;
00130 else
00131 return null;
00132 }
00133 public int getValueOf(String name) {
00134 return ((Integer)elementValue.get(name)).intValue();
00135 }
00136 public boolean isKind(int kind) {
00137 return (kind & ENUMERATED) != 0;
00138 }
00139
00140 public String toString() {
00141 String range = "enum {";
00142 boolean first = true;
00143 for (int i = getFirstElement(); i < getEnumeratedSize(); i++) {
00144 String name = (String) elementName.get(new Integer(i));
00145 if (name != null) {
00146 if (! first)
00147 range += ",";
00148 else
00149 first = false;
00150 range += name + "=" + i;
00151 }
00152 }
00153 return range + "}";
00154 }
00155 }