1 package jdk.internal.nicl.types; 2 3 import java.util.Arrays; 4 import java.util.stream.Stream; 5 import jdk.internal.nicl.Platform; 6 7 public class Container implements Type { 8 final Type[] members; 9 final boolean isUnion; 10 11 public Container(boolean isUnion, Type... members) { 12 this.members = members; 13 this.isUnion = isUnion; 14 } 15 16 @Override 17 public long getSize() { 18 return Platform.getInstance().getABI().sizeof(this); 19 } 20 21 public boolean isUnion() { 22 return isUnion; 23 } 24 25 public Stream<Type> getMembers() { 26 return Stream.of(members); 27 } 28 29 public int memberCount() { 30 return members.length; 31 } 32 33 public Type getMember(int index) { 34 return members[index]; 35 } 36 37 @Override 38 public int hashCode() { 39 return (isUnion ? 0x40000000 : 0x60000000) | Arrays.hashCode(members); 40 } 41 42 @Override 43 public boolean equals(Object o) { 44 if (!(o instanceof jdk.internal.nicl.types.Container)) { 45 return false; 46 } 47 48 jdk.internal.nicl.types.Container other = (jdk.internal.nicl.types.Container) o; 49 if (other.isUnion != isUnion) { 50 return false; 51 } 52 if (other.members.length != members.length) { 53 return false; 54 } 55 for (int i = 0; i < members.length; i++) { 56 if (!members[i].equals(other.members[i])) { 57 return false; 58 } 59 } 60 return true; 61 } 62 63 @Override 64 public String toString() { 65 StringBuffer sb = new StringBuffer(); 66 sb.append("["); 67 for (Type t : members) { 68 sb.append(t); 69 if (isUnion) { 70 sb.append('|'); 71 } 72 } 73 if (isUnion) { 74 sb.setCharAt(sb.length() - 1, ']'); 75 } else { 76 sb.append(']'); 77 } 78 return sb.toString(); 79 } 80 } --- EOF ---