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

/*
#include <stdlib.h>
#include <stdint.h>
#include "seq.h"
#include "issue10788.h"

*/
import "C"

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

// suppress the error if seq ends up unused
var _ = _seq.FromRefNum

//export proxyissue10788_TestStruct_Value_Set
func proxyissue10788_TestStruct_Value_Set(refnum C.int32_t, v C.nstring) {
	ref := _seq.FromRefNum(int32(refnum))
	_v := decodeString(v)
	ref.Get().(*issue10788.TestStruct).Value = _v
}

//export proxyissue10788_TestStruct_Value_Get
func proxyissue10788_TestStruct_Value_Get(refnum C.int32_t) C.nstring {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(*issue10788.TestStruct).Value
	_v := encodeString(v)
	return _v
}

//export proxyissue10788_TestInterface_DoSomeWork
func proxyissue10788_TestInterface_DoSomeWork(refnum C.int32_t, param_s C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(issue10788.TestInterface)
	// Must be a Go object
	_param_s_ref := _seq.FromRefNum(int32(param_s))
	_param_s := _param_s_ref.Get().(*issue10788.TestStruct)
	v.DoSomeWork(_param_s)
}

//export proxyissue10788_TestInterface_MultipleUnnamedParams
func proxyissue10788_TestInterface_MultipleUnnamedParams(refnum C.int32_t, param_p0 C.nint, param_p1 C.nstring, param_p2 C.int64_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(issue10788.TestInterface)
	_param_p0 := int(param_p0)
	_param_p1 := decodeString(param_p1)
	_param_p2 := int64(param_p2)
	v.MultipleUnnamedParams(_param_p0, _param_p1, _param_p2)
}

type proxyissue10788_TestInterface _seq.Ref

func (p *proxyissue10788_TestInterface) Bind_proxy_refnum__() int32 {
	return (*_seq.Ref)(p).Bind_IncNum()
}

func (p *proxyissue10788_TestInterface) DoSomeWork(param_s *issue10788.TestStruct) {
	var _param_s C.int32_t = _seq.NullRefNum
	if param_s != nil {
		_param_s = C.int32_t(_seq.ToRefNum(param_s))
	}
	C.cproxyissue10788_TestInterface_DoSomeWork(C.int32_t(p.Bind_proxy_refnum__()), _param_s)
}

func (p *proxyissue10788_TestInterface) MultipleUnnamedParams(param_p0 int, param_p1 string, param_p2 int64) {
	_param_p0 := C.nint(param_p0)
	_param_p1 := encodeString(param_p1)
	_param_p2 := C.int64_t(param_p2)
	C.cproxyissue10788_TestInterface_MultipleUnnamedParams(C.int32_t(p.Bind_proxy_refnum__()), _param_p0, _param_p1, _param_p2)
}
