// Code generated by gobind. DO NOT EDIT.

// Java class aliases.S is a proxy for talking to a Go program.
//
//   autogenerated by gobind -lang=java aliases
package aliases;

import go.Seq;

public final class S implements Seq.Proxy {
    static { Aliases.touch(); }
    
    private final int refnum;
    
    @Override public final int incRefnum() {
          Seq.incGoRef(refnum, this);
          return refnum;
    }
    
    S(int refnum) { this.refnum = refnum; Seq.trackGoRef(refnum, this); }
    
    public S() { this.refnum = __New(); Seq.trackGoRef(refnum, this); }
    
    private static native int __New();
    
    @Override public boolean equals(Object o) {
        if (o == null || !(o instanceof S)) {
            return false;
        }
        S that = (S)o;
        return true;
    }
    
    @Override public int hashCode() {
        return java.util.Arrays.hashCode(new Object[] {});
    }
    
    @Override public String toString() {
        StringBuilder b = new StringBuilder();
        b.append("S").append("{");
        return b.append("}").toString();
    }
}

// Code generated by gobind. DO NOT EDIT.

// Java class aliases.Aliases is a proxy for talking to a Go program.
//
//   autogenerated by gobind -lang=java aliases
package aliases;

import go.Seq;

public abstract class Aliases {
    static {
        Seq.touch(); // for loading the native library
        _init();
    }
    
    private Aliases() {} // uninstantiable
    
    // touch is called from other bound packages to initialize this package
    public static void touch() {}
    
    private static native void _init();
    
    
    
    public static native void takesAByte(byte a);
    public static native void takesAByteSlice(byte[] a);
    public static native void takesAByteSliceAlias(byte[] a);
    public static native void takesAStructPtr(S a);
    public static native void takesAStructPtrAlias(S a);
}
