// Java class underscore_pkg.Underscore_struct is a proxy for talking to a Go program.
//   gobind -lang=java underscores
//
// File is generated by gobind. Do not edit.
package underscore_pkg;

import go.Seq;

public final class Underscore_struct implements Seq.Proxy {
    static { Underscore_pkg.touch(); }
    
    private final Seq.Ref ref;
    
    @Override public final int incRefnum() {
          int refnum = ref.refnum;
          Seq.incGoRef(refnum);
          return refnum;
    }
    
    Underscore_struct(Seq.Ref ref) { this.ref = ref; }
    
    public Underscore_struct() { this.ref = __New(); }
    
    private static native Seq.Ref __New();
    
    public final native String getUnderscore_field();
    public final native void setUnderscore_field(String v);
    
    @Override public boolean equals(Object o) {
        if (o == null || !(o instanceof Underscore_struct)) {
            return false;
        }
        Underscore_struct that = (Underscore_struct)o;
        String thisUnderscore_field = getUnderscore_field();
        String thatUnderscore_field = that.getUnderscore_field();
        if (thisUnderscore_field == null) {
            if (thatUnderscore_field != null) {
                return false;
            }
        } else if (!thisUnderscore_field.equals(thatUnderscore_field)) {
            return false;
        }
        return true;
    }
    
    @Override public int hashCode() {
        return java.util.Arrays.hashCode(new Object[] {getUnderscore_field()});
    }
    
    @Override public String toString() {
        StringBuilder b = new StringBuilder();
        b.append("Underscore_struct").append("{");
        b.append("Underscore_field:").append(getUnderscore_field()).append(",");
        return b.append("}").toString();
    }
}

// Java class underscore_pkg.Underscore_pkg is a proxy for talking to a Go program.
//   gobind -lang=java underscores
//
// File is generated by gobind. Do not edit.
package underscore_pkg;

import go.Seq;

public abstract class Underscore_pkg {
    static {
        Seq.touch(); // for loading the native library
        _init();
    }
    
    private Underscore_pkg() {} // 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 setUnderscore_var(long v);
    public static native long getUnderscore_var();
    
    public static native void underscore_func();
}
