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

import go.Seq;

public abstract class Interfaces {
    private Interfaces() {} // uninstantiable
    
    public static int Add3(I r) {
        go.Seq _in = new go.Seq();
        go.Seq _out = new go.Seq();
        int _result;
        _in.writeRef(r.ref());
        Seq.send(DESCRIPTOR, CALL_Add3, _in, _out);
        _result = _out.readInt32();
        return _result;
    }
    
    public interface I extends go.Seq.Object {
        public int Rand();
        
        public static abstract class Stub implements I {
            static final String DESCRIPTOR = "go.interfaces.I";
            
            private final go.Seq.Ref ref;
            public Stub() {
                ref = go.Seq.createRef(this);
            }
            
            public go.Seq.Ref ref() { return ref; }
            
            public void call(int code, go.Seq in, go.Seq out) {
                switch (code) {
                case Proxy.CALL_Rand: {
                    int result = this.Rand();
                    out.writeInt32(result);
                    return;
                }
                default:
                    throw new RuntimeException("unknown code: "+ code);
                }
            }
        }
        
        static final class Proxy implements I {
            static final String DESCRIPTOR = Stub.DESCRIPTOR;
        
            private go.Seq.Ref ref;
        
            Proxy(go.Seq.Ref ref) { this.ref = ref; }
        
            public go.Seq.Ref ref() { return ref; }
        
            public void call(int code, go.Seq in, go.Seq out) {
                throw new RuntimeException("cycle: cannot call proxy");
            }
        
            public int Rand() {
                go.Seq _in = new go.Seq();
                go.Seq _out = new go.Seq();
                int _result;
                _in.writeRef(ref);
                Seq.send(DESCRIPTOR, CALL_Rand, _in, _out);
                _result = _out.readInt32();
                return _result;
            }
            
            static final int CALL_Rand = 0x10a;
        }
    }
    
    public static I Seven() {
        go.Seq _in = new go.Seq();
        go.Seq _out = new go.Seq();
        I _result;
        Seq.send(DESCRIPTOR, CALL_Seven, _in, _out);
        _result = new I.Proxy(_out.readRef());
        return _result;
    }
    
    public interface WithParam extends go.Seq.Object {
        public void HasParam(boolean p0);
        
        public static abstract class Stub implements WithParam {
            static final String DESCRIPTOR = "go.interfaces.WithParam";
            
            private final go.Seq.Ref ref;
            public Stub() {
                ref = go.Seq.createRef(this);
            }
            
            public go.Seq.Ref ref() { return ref; }
            
            public void call(int code, go.Seq in, go.Seq out) {
                switch (code) {
                case Proxy.CALL_HasParam: {
                    boolean param_p0;
                    param_p0 = in.readBool();
                    this.HasParam(param_p0);
                    return;
                }
                default:
                    throw new RuntimeException("unknown code: "+ code);
                }
            }
        }
        
        static final class Proxy implements WithParam {
            static final String DESCRIPTOR = Stub.DESCRIPTOR;
        
            private go.Seq.Ref ref;
        
            Proxy(go.Seq.Ref ref) { this.ref = ref; }
        
            public go.Seq.Ref ref() { return ref; }
        
            public void call(int code, go.Seq in, go.Seq out) {
                throw new RuntimeException("cycle: cannot call proxy");
            }
        
            public void HasParam(boolean p0) {
                go.Seq _in = new go.Seq();
                go.Seq _out = new go.Seq();
                _in.writeRef(ref);
                _in.writeBool(p0);
                Seq.send(DESCRIPTOR, CALL_HasParam, _in, _out);
            }
            
            static final int CALL_HasParam = 0x10a;
        }
    }
    
    private static final int CALL_Add3 = 1;
    private static final int CALL_Seven = 2;
    private static final String DESCRIPTOR = "interfaces";
}
