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

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

*/
import "C"

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

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

//export proxyunderscore_pkg_Underscore_struct_Underscore_field_Set
func proxyunderscore_pkg_Underscore_struct_Underscore_field_Set(refnum C.int32_t, v C.nstring) {
	ref := _seq.FromRefNum(int32(refnum))
	_v := decodeString(v)
	ref.Get().(*underscore_pkg.Underscore_struct).Underscore_field = _v
}

//export proxyunderscore_pkg_Underscore_struct_Underscore_field_Get
func proxyunderscore_pkg_Underscore_struct_Underscore_field_Get(refnum C.int32_t) C.nstring {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(*underscore_pkg.Underscore_struct).Underscore_field
	_v := encodeString(v)
	return _v
}

//export new_underscore_pkg_Underscore_struct
func new_underscore_pkg_Underscore_struct() C.int32_t {
	return C.int32_t(_seq.ToRefNum(new(underscore_pkg.Underscore_struct)))
}

//export var_setunderscore_pkg_Underscore_var
func var_setunderscore_pkg_Underscore_var(v C.nint) {
	_v := int(v)
	underscore_pkg.Underscore_var = _v
}

//export var_getunderscore_pkg_Underscore_var
func var_getunderscore_pkg_Underscore_var() C.nint {
	v := underscore_pkg.Underscore_var
	_v := C.nint(v)
	return _v
}

//export proxyunderscore_pkg__Underscore_func
func proxyunderscore_pkg__Underscore_func() {
	underscore_pkg.Underscore_func()
}
