// 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 (
	proxyTestInterface_Descriptor                 = "go.issue10788.TestInterface"
	proxyTestInterface_DoSomeWork_Code            = 0x10a
	proxyTestInterface_MultipleUnnamedParams_Code = 0x20a
)

func proxyTestInterface_DoSomeWork(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 proxyTestInterface_MultipleUnnamedParams(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(proxyTestInterface_Descriptor, proxyTestInterface_DoSomeWork_Code, proxyTestInterface_DoSomeWork)
	seq.Register(proxyTestInterface_Descriptor, proxyTestInterface_MultipleUnnamedParams_Code, proxyTestInterface_MultipleUnnamedParams)
}

type proxyTestInterface seq.Ref

func (p *proxyTestInterface) DoSomeWork(s *issue10788.TestStruct) {
	in := new(seq.Buffer)
	in.WriteGoRef(s)
	seq.Transact((*seq.Ref)(p), "go.issue10788.TestInterface", proxyTestInterface_DoSomeWork_Code, 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), "go.issue10788.TestInterface", proxyTestInterface_MultipleUnnamedParams_Code, in)
}

const (
	proxyTestStruct_Descriptor     = "go.issue10788.TestStruct"
	proxyTestStruct_Value_Get_Code = 0x00f
	proxyTestStruct_Value_Set_Code = 0x01f
)

type proxyTestStruct seq.Ref

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

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

func init() {
	seq.Register(proxyTestStruct_Descriptor, proxyTestStruct_Value_Set_Code, proxyTestStruct_Value_Set)
	seq.Register(proxyTestStruct_Descriptor, proxyTestStruct_Value_Get_Code, proxyTestStruct_Value_Get)
}
