00001
00005 package edu.mit.csail.sdg.squander.absstate;
00006
00007 import java.util.Arrays;
00008 import java.util.Iterator;
00009 import java.util.List;
00010
00018 public class ObjTuple implements Iterable<Object> {
00019
00020 private final int arity;
00021 private final Object[] tuple;
00022
00023 public ObjTuple(Object... tuple) {
00024 this.tuple = tuple;
00025 this.arity = tuple.length;
00026 }
00027
00028 public ObjTuple(List<Object> tuple) {
00029 this(tuple.toArray());
00030 }
00031
00032 public int arity() { return arity; }
00033 public Object[] atoms() { return tuple; }
00034
00035 public ObjTuple projection(int startCol, int endCol) {
00036 Object[] a = new Object[endCol - startCol + 1];
00037 System.arraycopy(tuple, startCol, a, 0, a.length);
00038 return new ObjTuple(a);
00039 }
00040
00041 public Object get(int index) {
00042 return tuple[index];
00043 }
00044
00045 public Object[] tuple() { return tuple; }
00046
00047 @Override
00048 public Iterator<Object> iterator() {
00049 return Arrays.asList(tuple).iterator();
00050 }
00051
00052 public ObjTuple product(ObjTuple t) {
00053 return product(this, t);
00054 }
00055
00056 @Override
00057 public int hashCode() {
00058 final int prime = 31;
00059 int result = 1;
00060 result = prime * result + arity;
00061 result = prime * result + Arrays.hashCode(tuple);
00062 return result;
00063 }
00064
00065 @Override
00066 public boolean equals(Object obj) {
00067 if (this == obj)
00068 return true;
00069 if (obj == null)
00070 return false;
00071 if (getClass() != obj.getClass())
00072 return false;
00073 ObjTuple other = (ObjTuple) obj;
00074 if (arity != other.arity)
00075 return false;
00076 if (!arrayEquals(tuple, other.tuple))
00077 return false;
00078 return true;
00079 }
00080
00081 @Override
00082 public String toString() {
00083 return Arrays.toString(tuple);
00084 }
00085
00086 public static ObjTuple product(ObjTuple tuple, Object atom) {
00087 return product(tuple, new ObjTuple(atom));
00088 }
00089
00090 public static ObjTuple product(ObjTuple t1, ObjTuple t2) {
00091 int arity = t1.arity + t2.arity;
00092 Object[] atoms = new Object[arity];
00093 System.arraycopy(t1.tuple, 0, atoms, 0, t1.arity);
00094 System.arraycopy(t2.tuple, 0, atoms, t1.arity, t2.arity);
00095 return new ObjTuple(atoms);
00096 }
00097
00098 private static boolean arrayEquals(Object[] a1, Object[] a2) {
00099 if (a1 == null)
00100 return a2 == null;
00101 if (a2 == null)
00102 return false;
00103 if (a1.length != a2.length)
00104 return false;
00105 for (int i = 0; i < a1.length; i++) {
00106 if (!objLiteralsEquals(a1[i], a2[i]))
00107 return false;
00108 }
00109 return true;
00110 }
00111
00112 private static boolean objLiteralsEquals(Object o1, Object o2) {
00113
00114
00115 if (o1 == null)
00116 return o2 == null;
00117 if (o1 instanceof String || o1 instanceof Integer || o1 instanceof Boolean)
00118 return o1.equals(o2);
00119 return o1 == o2;
00120 }
00121
00122 }