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

import go.Seq;

public abstract class Issue10788 {
    static {
        Seq.touch(); // for loading the native library
        init();
    }
    
    private Issue10788() {} // uninstantiable
    
    // touch is called from other bound packages to initialize this package
    public static void touch() {}
    
    private static native void init();
    
    public static final class TestStruct extends Seq.Proxy {
        private TestStruct(go.Seq.Ref ref) { super(ref); }
        
        public final native String getValue();
        public final native void setValue(String v);
        
        @Override public boolean equals(Object o) {
            if (o == null || !(o instanceof TestStruct)) {
                return false;
            }
            TestStruct that = (TestStruct)o;
            String thisValue = getValue();
            String thatValue = that.getValue();
            if (thisValue == null) {
                if (thatValue != null) {
                    return false;
                }
            } else if (!thisValue.equals(thatValue)) {
                return false;
            }
            return true;
        }
        
        @Override public int hashCode() {
            return java.util.Arrays.hashCode(new Object[] {getValue()});
        }
        
        @Override public String toString() {
            StringBuilder b = new StringBuilder();
            b.append("TestStruct").append("{");
            b.append("Value:").append(getValue()).append(",");
            return b.append("}").toString();
        }
    }
    
    public interface TestInterface {
        public void DoSomeWork(TestStruct s);
        public void MultipleUnnamedParams(long p0, String p1, long p2);
    }
    
    private static final class proxyTestInterface extends Seq.Proxy implements TestInterface {
        proxyTestInterface(Seq.Ref ref) { super(ref); }
    
        public native void DoSomeWork(TestStruct s);
        public native void MultipleUnnamedParams(long p0, String p1, long p2);
    }
    
    
}
