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

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

func proxy_Bool(out, in *seq.Buffer) {
	param_p0 := in.ReadBool()
	res := basictypes.Bool(param_p0)
	out.WriteBool(res)
}

func proxy_ByteArrays(out, in *seq.Buffer) {
	param_x := in.ReadByteArray()
	res := basictypes.ByteArrays(param_x)
	out.WriteByteArray(res)
}

func proxy_Error(out, in *seq.Buffer) {
	err := basictypes.Error()
	if err == nil {
		out.WriteString("")
	} else {
		out.WriteString(err.Error())
	}
}

func proxy_ErrorPair(out, in *seq.Buffer) {
	res, err := basictypes.ErrorPair()
	out.WriteInt(res)
	if err == nil {
		out.WriteString("")
	} else {
		out.WriteString(err.Error())
	}
}

func proxy_Ints(out, in *seq.Buffer) {
	param_x := in.ReadInt8()
	param_y := in.ReadInt16()
	param_z := in.ReadInt32()
	param_t := in.ReadInt64()
	param_u := in.ReadInt()
	basictypes.Ints(param_x, param_y, param_z, param_t, param_u)
}

func init() {
	seq.Register("basictypes", 1, proxy_Bool)
	seq.Register("basictypes", 2, proxy_ByteArrays)
	seq.Register("basictypes", 3, proxy_Error)
	seq.Register("basictypes", 4, proxy_ErrorPair)
	seq.Register("basictypes", 5, proxy_Ints)
}
