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 ---