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

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

const (
	proxyTestInterfaceDescriptor                = "go.issue10788.TestInterface"
	proxyTestInterfaceDoSomeWorkCode            = 0x10a
	proxyTestInterfaceMultipleUnnamedParamsCode = 0x20a
)

func proxyTestInterfaceDoSomeWork(out, in *seq.Buffer) {
	ref := in.ReadRef()
	v := ref.Get().(issue10788.TestInterface)
	// Must be a Go object
	param_s_ref := in.ReadRef()
	param_s := param_s_ref.Get().(*issue10788.TestStruct)
	v.DoSomeWork(param_s)
}

func proxyTestInterfaceMultipleUnnamedParams(out, in *seq.Buffer) {
	ref := in.ReadRef()
	v := ref.Get().(issue10788.TestInterface)
	param_p0 := in.ReadInt()
	param_p1 := in.ReadString()
	param_p2 := in.ReadInt64()
	v.MultipleUnnamedParams(param_p0, param_p1, param_p2)
}

func init() {
	seq.Register(proxyTestInterfaceDescriptor, proxyTestInterfaceDoSomeWorkCode, proxyTestInterfaceDoSomeWork)
	seq.Register(proxyTestInterfaceDescriptor, proxyTestInterfaceMultipleUnnamedParamsCode, proxyTestInterfaceMultipleUnnamedParams)
}

type proxyTestInterface seq.Ref

func (p *proxyTestInterface) DoSomeWork(s *issue10788.TestStruct) {
	in := new(seq.Buffer)
	in.WriteGoRef(s)
	seq.Transact((*seq.Ref)(p), proxyTestInterfaceDoSomeWorkCode, in)
}

func (p *proxyTestInterface) MultipleUnnamedParams(p0 int, p1 string, p2 int64) {
	in := new(seq.Buffer)
	in.WriteInt(p0)
	in.WriteString(p1)
	in.WriteInt64(p2)
	seq.Transact((*seq.Ref)(p), proxyTestInterfaceMultipleUnnamedParamsCode, in)
}

const (
	proxyTestStructDescriptor   = "go.issue10788.TestStruct"
	proxyTestStructValueGetCode = 0x00f
	proxyTestStructValueSetCode = 0x01f
)

type proxyTestStruct seq.Ref

func proxyTestStructValueSet(out, in *seq.Buffer) {
	ref := in.ReadRef()
	v := in.ReadString()
	ref.Get().(*issue10788.TestStruct).Value = v
}

func proxyTestStructValueGet(out, in *seq.Buffer) {
	ref := in.ReadRef()
	v := ref.Get().(*issue10788.TestStruct).Value
	out.WriteString(v)
}

func init() {
	seq.Register(proxyTestStructDescriptor, proxyTestStructValueSetCode, proxyTestStructValueSet)
	seq.Register(proxyTestStructDescriptor, proxyTestStructValueGetCode, proxyTestStructValueGet)
}

func init() {
}
