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

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

func var_setABool(out, in *seq.Buffer) {
	v := in.ReadBool()
	vars.ABool = v
}
func var_getABool(out, in *seq.Buffer) {
	out.WriteBool(vars.ABool)
}
func var_setAFloat(out, in *seq.Buffer) {
	v := in.ReadFloat64()
	vars.AFloat = v
}
func var_getAFloat(out, in *seq.Buffer) {
	out.WriteFloat64(vars.AFloat)
}
func var_setAFloat32(out, in *seq.Buffer) {
	v := in.ReadFloat32()
	vars.AFloat32 = v
}
func var_getAFloat32(out, in *seq.Buffer) {
	out.WriteFloat32(vars.AFloat32)
}
func var_setAFloat64(out, in *seq.Buffer) {
	v := in.ReadFloat64()
	vars.AFloat64 = v
}
func var_getAFloat64(out, in *seq.Buffer) {
	out.WriteFloat64(vars.AFloat64)
}
func var_setAString(out, in *seq.Buffer) {
	v := in.ReadString()
	vars.AString = v
}
func var_getAString(out, in *seq.Buffer) {
	out.WriteString(vars.AString)
}
func var_setAStructPtr(out, in *seq.Buffer) {
	// Must be a Go object
	v_ref := in.ReadRef()
	v := v_ref.Get().(*vars.S)
	vars.AStructPtr = v
}
func var_getAStructPtr(out, in *seq.Buffer) {
	out.WriteGoRef(vars.AStructPtr)
}
func var_setAnInt(out, in *seq.Buffer) {
	v := in.ReadInt()
	vars.AnInt = v
}
func var_getAnInt(out, in *seq.Buffer) {
	out.WriteInt(vars.AnInt)
}
func var_setAnInt16(out, in *seq.Buffer) {
	v := in.ReadInt16()
	vars.AnInt16 = v
}
func var_getAnInt16(out, in *seq.Buffer) {
	out.WriteInt16(vars.AnInt16)
}
func var_setAnInt32(out, in *seq.Buffer) {
	v := in.ReadInt32()
	vars.AnInt32 = v
}
func var_getAnInt32(out, in *seq.Buffer) {
	out.WriteInt32(vars.AnInt32)
}
func var_setAnInt64(out, in *seq.Buffer) {
	v := in.ReadInt64()
	vars.AnInt64 = v
}
func var_getAnInt64(out, in *seq.Buffer) {
	out.WriteInt64(vars.AnInt64)
}
func var_setAnInt8(out, in *seq.Buffer) {
	v := in.ReadInt8()
	vars.AnInt8 = v
}
func var_getAnInt8(out, in *seq.Buffer) {
	out.WriteInt8(vars.AnInt8)
}
func var_setAnInterface(out, in *seq.Buffer) {
	var v vars.I
	v_ref := in.ReadRef()
	if v_ref.Num < 0 { // go object
		v = v_ref.Get().(vars.I)
	} else { // foreign object
		v = (*proxyI)(v_ref)
	}
	vars.AnInterface = v
}
func var_getAnInterface(out, in *seq.Buffer) {
	out.WriteGoRef(vars.AnInterface)
}

const (
	proxyI_Descriptor = "go.vars.I"
)

type proxyI seq.Ref

const (
	proxyS_Descriptor = "go.vars.S"
)

type proxyS seq.Ref

func init() {
}

func init() {
	seq.Register("vars.ABool", 1, var_setABool)
	seq.Register("vars.ABool", 2, var_getABool)
	seq.Register("vars.AFloat", 1, var_setAFloat)
	seq.Register("vars.AFloat", 2, var_getAFloat)
	seq.Register("vars.AFloat32", 1, var_setAFloat32)
	seq.Register("vars.AFloat32", 2, var_getAFloat32)
	seq.Register("vars.AFloat64", 1, var_setAFloat64)
	seq.Register("vars.AFloat64", 2, var_getAFloat64)
	seq.Register("vars.AString", 1, var_setAString)
	seq.Register("vars.AString", 2, var_getAString)
	seq.Register("vars.AStructPtr", 1, var_setAStructPtr)
	seq.Register("vars.AStructPtr", 2, var_getAStructPtr)
	seq.Register("vars.AnInt", 1, var_setAnInt)
	seq.Register("vars.AnInt", 2, var_getAnInt)
	seq.Register("vars.AnInt16", 1, var_setAnInt16)
	seq.Register("vars.AnInt16", 2, var_getAnInt16)
	seq.Register("vars.AnInt32", 1, var_setAnInt32)
	seq.Register("vars.AnInt32", 2, var_getAnInt32)
	seq.Register("vars.AnInt64", 1, var_setAnInt64)
	seq.Register("vars.AnInt64", 2, var_getAnInt64)
	seq.Register("vars.AnInt8", 1, var_setAnInt8)
	seq.Register("vars.AnInt8", 2, var_getAnInt8)
	seq.Register("vars.AnInterface", 1, var_setAnInterface)
	seq.Register("vars.AnInterface", 2, var_getAnInterface)
}
