/* * xtc - The eXTensible Compiler * Copyright (C) 2007 New York University * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * version 2.1 as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. */ package xtc.typical; /** * The superclass of all anonymous tuples. * * @author Laune Harris * @version $Revision: 1.38 $ */ public abstract class Tuple { /** Create a new tuple. */ public Tuple() { /* Nothing to do. */ } /** * Get this tuple's size. * * @return The size. */ public abstract int size(); // ========================================================================= /** The canonical empty tuple. */ public final static T0 EMPTY = new T0(); /** Get the first element. */ public <A> A get1() { throw new IllegalStateException("Empty tuple"); } /** Get the second element. */ public <B> B get2() { throw new IllegalStateException("Empty tuple"); } /** Get the third element. */ public <C> C get3() { throw new IllegalStateException("Empty tuple"); } /** Get the fourth element. */ public <D> D get4() { throw new IllegalStateException("Empty tuple"); } /** Get the fifth element. */ public <E> E get5() { throw new IllegalStateException("Empty tuple"); } /** Get the sixth element. */ public <F> F get6() { throw new IllegalStateException("Empty tuple"); } /** Get the seventh element. */ public <G> G get7() { throw new IllegalStateException("Empty tuple"); } /** A tuple with zero members. */ public static class T0 extends Tuple { /** Create an empty tuple. */ public T0() { /* Nothing to do. */ } public int size() { return 0; } public int hashCode() { return 0; } public boolean equals(Object o) { if (this == o) return true; return (o instanceof T0); } public String toString() { return "()"; } } /** A tuple with one member. */ public static class T1<A> extends Tuple { /** The first member. */ A member1; /** Create a new T1. */ public T1(A m1){ member1 = m1; } public int size() { return 1; } @SuppressWarnings("unchecked") public A get1() { return member1; } public int hashcode() { return member1.hashCode() + 7; } public boolean equals(Object o) { if (this == o) return true; if (o instanceof T1) { T1<?> t = (T1<?>)o; return member1.equals(t.member1); } return false; } public String toString() { return "(" + toString(member1) + ")"; } } /** A tuple witn 2 members. */ public static class T2<A,B> extends Tuple { /** The first member. */ A member1; /** The second member. */ B member2; /** Create a new T2. */ public T2(A m1, B m2){ member1 = m1; member2 = m2; } public int size() { return 2; } @SuppressWarnings("unchecked") public A get1() { return member1; } @SuppressWarnings("unchecked") public B get2() { return member2; } public int hashCode(){ return member1.hashCode() * member2.hashCode() + 7; } public boolean equals(Object o) { if (this == o) return true; if (this == o) return true; if (o instanceof T2) { T2<?,?> other = (T2<?,?>)o; return member1.equals(other.member1) && member2.equals(other.member2); } return false; } public String toString() { return "(" + toString(member1) + "," + toString(member2) + ")"; } } /** A tuple witn 3 members. */ public static class T3<A,B,C> extends Tuple{ /** The first member. */ A member1; /** The second member. */ B member2; /** The third member. */ C member3; /** Createa a new T3.*/ public T3(A m1, B m2, C m3){ member1 = m1; member2 = m2; member3 = m3; } public int size() { return 3; } @SuppressWarnings("unchecked") public A get1() { return member1; } @SuppressWarnings("unchecked") public B get2() { return member2; } @SuppressWarnings("unchecked") public C get3() { return member3; } public int hashCode(){ return member1.hashCode() * member2.hashCode() * member3.hashCode() + 7; } public boolean equals(Object o) { if (this == o) return true; if (o instanceof T3) { T3<?,?,?> t = (T3<?,?,?>)o; return member1.equals(t.get1()) && member2.equals(t.get2()) && member3.equals(t.get3()); } return false; } public String toString() { return "(" + toString(member1) + "," + toString(member2) + "," + toString(member3) + ")"; } } /** A tuple witn 4 members. */ public static class T4<A,B,C,D> extends Tuple { /** The first member. */ A member1; /** The second member. */ B member2; /** The third member. */ C member3; /** The fourth member. */ D member4; /** Create a new T4. */ public T4(A m1, B m2, C m3, D m4){ member1 = m1; member2 = m2; member3 = m3; member4 = m4; } public int size() { return 4; } @SuppressWarnings("unchecked") public A get1() { return member1; } @SuppressWarnings("unchecked") public B get2() { return member2; } @SuppressWarnings("unchecked") public C get3() { return member3; } @SuppressWarnings("unchecked") public D get4() { return member4; } public int hashCode(){ return member1.hashCode() * member2.hashCode() * member3.hashCode() * member4.hashCode() + 7; } public boolean equals(Object o) { if (this == o) return true; if (o instanceof T4) { T4<?,?,?,?> t = (T4<?,?,?,?>)o; return member1.equals(t.get1()) && member2.equals(t.get2()) && member3.equals(t.get3()) && member4.equals(t.get4()); } return false; } public String toString() { return "(" + toString(member1) + "," + toString(member2) + "," + toString(member3) + "," + toString(member4) + ")"; } } /** A tuple witn 5 members. */ public static class T5<A,B,C,D,E> extends Tuple{ /** The first member. */ A member1; /** The second member. */ B member2; /** The third member. */ C member3; /** The fourth member. */ D member4; /** The fifth member. */ E member5; /** Create a new T5. */ public T5(A m1, B m2, C m3, D m4, E m5){ member1 = m1; member2 = m2; member3 = m3; member4 = m4; member5 = m5; } public int size() { return 5; } @SuppressWarnings("unchecked") public A get1() { return member1; } @SuppressWarnings("unchecked") public B get2() { return member2; } @SuppressWarnings("unchecked") public C get3() { return member3; } @SuppressWarnings("unchecked") public D get4() { return member4; } @SuppressWarnings("unchecked") public E get5() { return member5; } public int hashCode(){ return member1.hashCode() * member2.hashCode() * member3.hashCode() * member4.hashCode() * member5.hashCode() + 7; } public boolean equals(Object o) { if (this == o) return true; if (o instanceof T5) { T5<?,?,?,?,?> t = (T5<?,?,?,?,?>)o; return member1.equals(t.get1()) && member2.equals(t.get2()) && member3.equals(t.get3()) && member4.equals(t.get4()) && member5.equals(t.get5()); } return false; } public String toString() { return "(" + toString(member1) + "," + toString(member2) + "," + toString(member3) + "," + toString(member4) + "," + toString(member5) + ")"; } } /** A tuple with 6 members. */ @SuppressWarnings ("unchecked") public static class T6<A,B,C,D,E,F> extends Tuple { /** The first member. */ A member1; /** The second member. */ B member2; /** The third member. */ C member3; /** The fourth member. */ D member4; /** The fifth member. */ E member5; /** The sixth member. */ F member6; /** Create a new T6. */ public T6(A m1, B m2, C m3, D m4, E m5, F m6){ member1 = m1; member2 = m2; member3 = m3; member4 = m4; member5 = m5; member6 = m6; } public int size() { return 6; } public A get1() { return member1; } public B get2() { return member2; } public C get3() { return member3; } public D get4() { return member4; } public E get5() { return member5; } public F get6() { return member6; } public int hashCode(){ return member1.hashCode() * member2.hashCode() * member3.hashCode() * member4.hashCode() * member5.hashCode() * member6.hashCode() + 7; } public boolean equals(Object o) { if (this == o) return true; if (o instanceof T6) { T6<?,?,?,?,?,?> t = (T6<?,?,?,?,?,?>)o; return member1.equals(t.get1()) && member2.equals(t.get2()) && member3.equals(t.get3()) && member4.equals(t.get4()) && member5.equals(t.get5()) && member6.equals(t.get6()); } return false; } public String toString() { return "(" + toString(member1) + "," + toString(member2) + "," + toString(member3) + "," + toString(member4) + "," + toString(member5) + "," + toString(member6) + ")"; } } /** A tuple with 7 members. */ @SuppressWarnings ("unchecked") public static class T7<A,B,C,D,E,F,G> extends Tuple { /** The first member. */ A member1; /** The second member. */ B member2; /** The third member. */ C member3; /** The fourth member. */ D member4; /** The fifth member. */ E member5; /** The sixth member. */ F member6; /** The seventh member. */ G member7; /** Create a new T7. */ public T7(A m1, B m2, C m3, D m4, E m5, F m6, G m7){ member1 = m1; member2 = m2; member3 = m3; member4 = m4; member5 = m5; member6 = m6; member7 = m7; } public int size() { return 7; } public A get1() { return member1; } public B get2() { return member2; } public C get3() { return member3; } public D get4() { return member4; } public E get5() { return member5; } public F get6() { return member6; } public G get7() { return member7; } public int hashCode(){ return member1.hashCode() * member2.hashCode() * member3.hashCode() * member4.hashCode() * member5.hashCode() * member7.hashCode() + 7; } public boolean equals(Object o) { if (o instanceof T7) { T7<?,?,?,?,?,?,?> t = (T7<?,?,?,?,?,?,?>)o; return member1.equals(t.get1()) && member2.equals(t.get2()) && member3.equals(t.get3()) && member4.equals(t.get4()) && member5.equals(t.get5()) && member6.equals(t.get6()) && member7.equals(t.get7()); } return false; } public String toString() { return "(" + toString(member1) + "," + toString(member2) + "," + toString(member3) + "," + toString(member4) + "," + toString(member5) + "," + toString(member6) + "," + toString(member7) + ")"; } } /** * Print an object as a string. * * @param o The object. * @return The corresponding string. */ public final static String toString(Object o) { return (null == o) ? "?" : o.toString(); } }