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

import go.Seq;

public abstract class Ignore {
    static {
        Seq.touch(); // for loading the native library
        init();
    }
    
    private Ignore() {} // 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 S extends Seq.Proxy implements I {
        private S(go.Seq.Ref ref) { super(ref); }
        
        // skipped field S.F with unsupported type: *types.Interface
        
        // skipped method S.Argument with unsupported parameter or return types
        
        // skipped method S.Result with unsupported parameter or return types
        
        @Override public boolean equals(Object o) {
            if (o == null || !(o instanceof S)) {
                return false;
            }
            S that = (S)o;
            // skipped field S.F with unsupported type: *types.Interface
            
            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();
        }
    }
    
    public interface I {
        // skipped method I.Argument with unsupported parameter or return types
        
        // skipped method I.Result with unsupported parameter or return types
        
    }
    
    private static final class proxyI extends Seq.Proxy implements I {
        proxyI(Seq.Ref ref) { super(ref); }
    
        // skipped method I.Argument with unsupported parameter or return types
        
        // skipped method I.Result with unsupported parameter or return types
        
    }
    
    // skipped const NamedConst with unsupported type: *types.Const
    
    
    // skipped variable V with unsupported type: *types.Interface
    
    // skipped variable Var with unsupported type: *types.Interface
    
    // skipped function Argument with unsupported parameter or return types
    
    // skipped function Result with unsupported parameter or return types
    
}
