// Package go_interfaces is an autogenerated binder stub for package interfaces.
//   gobind -lang=go interfaces
//
// File is generated by gobind. Do not edit.
package go_interfaces

import (
	"golang.org/x/mobile/bind/seq"
	"interfaces"
)

func proxy_Add3(out, in *seq.Buffer) {
	var param_r interfaces.I
	param_r_ref := in.ReadRef()
	if param_r_ref.Num < 0 { // go object
		param_r = param_r_ref.Get().(interfaces.I)
	} else { // foreign object
		param_r = (*proxyI)(param_r_ref)
	}
	res := interfaces.Add3(param_r)
	out.WriteInt32(res)
}

const (
	proxyI_Descriptor = "go.interfaces.I"
	proxyI_Rand_Code  = 0x10a
)

func proxyI_Rand(out, in *seq.Buffer) {
	ref := in.ReadRef()
	v := ref.Get().(interfaces.I)
	res := v.Rand()
	out.WriteInt32(res)
}

func init() {
	seq.Register(proxyI_Descriptor, proxyI_Rand_Code, proxyI_Rand)
}

type proxyI seq.Ref

func (p *proxyI) Rand() int32 {
	in := new(seq.Buffer)
	out := seq.Transact((*seq.Ref)(p), "go.interfaces.I", proxyI_Rand_Code, in)
	res_0 := out.ReadInt32()
	return res_0
}

func proxy_Seven(out, in *seq.Buffer) {
	res := interfaces.Seven()
	out.WriteGoRef(res)
}

const (
	proxyWithParam_Descriptor    = "go.interfaces.WithParam"
	proxyWithParam_HasParam_Code = 0x10a
)

func proxyWithParam_HasParam(out, in *seq.Buffer) {
	ref := in.ReadRef()
	v := ref.Get().(interfaces.WithParam)
	param_p0 := in.ReadBool()
	v.HasParam(param_p0)
}

func init() {
	seq.Register(proxyWithParam_Descriptor, proxyWithParam_HasParam_Code, proxyWithParam_HasParam)
}

type proxyWithParam seq.Ref

func (p *proxyWithParam) HasParam(p0 bool) {
	in := new(seq.Buffer)
	in.WriteBool(p0)
	seq.Transact((*seq.Ref)(p), "go.interfaces.WithParam", proxyWithParam_HasParam_Code, in)
}

func init() {
	seq.Register("interfaces", 1, proxy_Add3)
	seq.Register("interfaces", 2, proxy_Seven)
}
