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

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

*/
import "C"

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

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

//export proxykeywords_KeywordCaller_Abstract
func proxykeywords_KeywordCaller_Abstract(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Abstract()
}

//export proxykeywords_KeywordCaller_Assert
func proxykeywords_KeywordCaller_Assert(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Assert()
}

//export proxykeywords_KeywordCaller_Boolean
func proxykeywords_KeywordCaller_Boolean(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Boolean()
}

//export proxykeywords_KeywordCaller_Break
func proxykeywords_KeywordCaller_Break(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Break()
}

//export proxykeywords_KeywordCaller_Byte
func proxykeywords_KeywordCaller_Byte(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Byte()
}

//export proxykeywords_KeywordCaller_Case
func proxykeywords_KeywordCaller_Case(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Case()
}

//export proxykeywords_KeywordCaller_Catch
func proxykeywords_KeywordCaller_Catch(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Catch()
}

//export proxykeywords_KeywordCaller_Char
func proxykeywords_KeywordCaller_Char(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Char()
}

//export proxykeywords_KeywordCaller_Class
func proxykeywords_KeywordCaller_Class(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Class()
}

//export proxykeywords_KeywordCaller_Const
func proxykeywords_KeywordCaller_Const(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Const()
}

//export proxykeywords_KeywordCaller_Continue
func proxykeywords_KeywordCaller_Continue(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Continue()
}

//export proxykeywords_KeywordCaller_Default
func proxykeywords_KeywordCaller_Default(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Default()
}

//export proxykeywords_KeywordCaller_Do
func proxykeywords_KeywordCaller_Do(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Do()
}

//export proxykeywords_KeywordCaller_Double
func proxykeywords_KeywordCaller_Double(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Double()
}

//export proxykeywords_KeywordCaller_Else
func proxykeywords_KeywordCaller_Else(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Else()
}

//export proxykeywords_KeywordCaller_Enum
func proxykeywords_KeywordCaller_Enum(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Enum()
}

//export proxykeywords_KeywordCaller_Extends
func proxykeywords_KeywordCaller_Extends(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Extends()
}

//export proxykeywords_KeywordCaller_False
func proxykeywords_KeywordCaller_False(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.False()
}

//export proxykeywords_KeywordCaller_Final
func proxykeywords_KeywordCaller_Final(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Final()
}

//export proxykeywords_KeywordCaller_Finally
func proxykeywords_KeywordCaller_Finally(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Finally()
}

//export proxykeywords_KeywordCaller_Float
func proxykeywords_KeywordCaller_Float(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Float()
}

//export proxykeywords_KeywordCaller_For
func proxykeywords_KeywordCaller_For(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.For()
}

//export proxykeywords_KeywordCaller_Goto
func proxykeywords_KeywordCaller_Goto(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Goto()
}

//export proxykeywords_KeywordCaller_If
func proxykeywords_KeywordCaller_If(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.If()
}

//export proxykeywords_KeywordCaller_Implements
func proxykeywords_KeywordCaller_Implements(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Implements()
}

//export proxykeywords_KeywordCaller_Import
func proxykeywords_KeywordCaller_Import(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Import()
}

//export proxykeywords_KeywordCaller_Instanceof
func proxykeywords_KeywordCaller_Instanceof(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Instanceof()
}

//export proxykeywords_KeywordCaller_Int
func proxykeywords_KeywordCaller_Int(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Int()
}

//export proxykeywords_KeywordCaller_Interface
func proxykeywords_KeywordCaller_Interface(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Interface()
}

//export proxykeywords_KeywordCaller_Long
func proxykeywords_KeywordCaller_Long(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Long()
}

//export proxykeywords_KeywordCaller_Native
func proxykeywords_KeywordCaller_Native(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Native()
}

//export proxykeywords_KeywordCaller_New
func proxykeywords_KeywordCaller_New(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.New()
}

//export proxykeywords_KeywordCaller_Null
func proxykeywords_KeywordCaller_Null(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Null()
}

//export proxykeywords_KeywordCaller_Package
func proxykeywords_KeywordCaller_Package(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Package()
}

//export proxykeywords_KeywordCaller_Private
func proxykeywords_KeywordCaller_Private(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Private()
}

//export proxykeywords_KeywordCaller_Protected
func proxykeywords_KeywordCaller_Protected(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Protected()
}

//export proxykeywords_KeywordCaller_Public
func proxykeywords_KeywordCaller_Public(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Public()
}

//export proxykeywords_KeywordCaller_Return
func proxykeywords_KeywordCaller_Return(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Return()
}

//export proxykeywords_KeywordCaller_Short
func proxykeywords_KeywordCaller_Short(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Short()
}

//export proxykeywords_KeywordCaller_Static
func proxykeywords_KeywordCaller_Static(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Static()
}

//export proxykeywords_KeywordCaller_Strictfp
func proxykeywords_KeywordCaller_Strictfp(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Strictfp()
}

//export proxykeywords_KeywordCaller_Super
func proxykeywords_KeywordCaller_Super(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Super()
}

//export proxykeywords_KeywordCaller_Switch
func proxykeywords_KeywordCaller_Switch(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Switch()
}

//export proxykeywords_KeywordCaller_Synchronized
func proxykeywords_KeywordCaller_Synchronized(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Synchronized()
}

//export proxykeywords_KeywordCaller_This
func proxykeywords_KeywordCaller_This(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.This()
}

//export proxykeywords_KeywordCaller_Throw
func proxykeywords_KeywordCaller_Throw(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Throw()
}

//export proxykeywords_KeywordCaller_Throws
func proxykeywords_KeywordCaller_Throws(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Throws()
}

//export proxykeywords_KeywordCaller_Transient
func proxykeywords_KeywordCaller_Transient(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Transient()
}

//export proxykeywords_KeywordCaller_True
func proxykeywords_KeywordCaller_True(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.True()
}

//export proxykeywords_KeywordCaller_Try
func proxykeywords_KeywordCaller_Try(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Try()
}

//export proxykeywords_KeywordCaller_Void
func proxykeywords_KeywordCaller_Void(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Void()
}

//export proxykeywords_KeywordCaller_Volatile
func proxykeywords_KeywordCaller_Volatile(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.Volatile()
}

//export proxykeywords_KeywordCaller_While
func proxykeywords_KeywordCaller_While(refnum C.int32_t) {
	ref := _seq.FromRefNum(int32(refnum))
	v := ref.Get().(keywords.KeywordCaller)
	v.While()
}

type proxykeywords_KeywordCaller _seq.Ref

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

func (p *proxykeywords_KeywordCaller) Abstract() {
	C.cproxykeywords_KeywordCaller_Abstract(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Assert() {
	C.cproxykeywords_KeywordCaller_Assert(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Boolean() {
	C.cproxykeywords_KeywordCaller_Boolean(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Break() {
	C.cproxykeywords_KeywordCaller_Break(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Byte() {
	C.cproxykeywords_KeywordCaller_Byte(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Case() {
	C.cproxykeywords_KeywordCaller_Case(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Catch() {
	C.cproxykeywords_KeywordCaller_Catch(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Char() {
	C.cproxykeywords_KeywordCaller_Char(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Class() {
	C.cproxykeywords_KeywordCaller_Class(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Const() {
	C.cproxykeywords_KeywordCaller_Const(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Continue() {
	C.cproxykeywords_KeywordCaller_Continue(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Default() {
	C.cproxykeywords_KeywordCaller_Default(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Do() {
	C.cproxykeywords_KeywordCaller_Do(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Double() {
	C.cproxykeywords_KeywordCaller_Double(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Else() {
	C.cproxykeywords_KeywordCaller_Else(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Enum() {
	C.cproxykeywords_KeywordCaller_Enum(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Extends() {
	C.cproxykeywords_KeywordCaller_Extends(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) False() {
	C.cproxykeywords_KeywordCaller_False(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Final() {
	C.cproxykeywords_KeywordCaller_Final(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Finally() {
	C.cproxykeywords_KeywordCaller_Finally(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Float() {
	C.cproxykeywords_KeywordCaller_Float(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) For() {
	C.cproxykeywords_KeywordCaller_For(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Goto() {
	C.cproxykeywords_KeywordCaller_Goto(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) If() {
	C.cproxykeywords_KeywordCaller_If(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Implements() {
	C.cproxykeywords_KeywordCaller_Implements(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Import() {
	C.cproxykeywords_KeywordCaller_Import(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Instanceof() {
	C.cproxykeywords_KeywordCaller_Instanceof(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Int() {
	C.cproxykeywords_KeywordCaller_Int(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Interface() {
	C.cproxykeywords_KeywordCaller_Interface(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Long() {
	C.cproxykeywords_KeywordCaller_Long(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Native() {
	C.cproxykeywords_KeywordCaller_Native(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) New() {
	C.cproxykeywords_KeywordCaller_New(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Null() {
	C.cproxykeywords_KeywordCaller_Null(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Package() {
	C.cproxykeywords_KeywordCaller_Package(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Private() {
	C.cproxykeywords_KeywordCaller_Private(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Protected() {
	C.cproxykeywords_KeywordCaller_Protected(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Public() {
	C.cproxykeywords_KeywordCaller_Public(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Return() {
	C.cproxykeywords_KeywordCaller_Return(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Short() {
	C.cproxykeywords_KeywordCaller_Short(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Static() {
	C.cproxykeywords_KeywordCaller_Static(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Strictfp() {
	C.cproxykeywords_KeywordCaller_Strictfp(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Super() {
	C.cproxykeywords_KeywordCaller_Super(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Switch() {
	C.cproxykeywords_KeywordCaller_Switch(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Synchronized() {
	C.cproxykeywords_KeywordCaller_Synchronized(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) This() {
	C.cproxykeywords_KeywordCaller_This(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Throw() {
	C.cproxykeywords_KeywordCaller_Throw(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Throws() {
	C.cproxykeywords_KeywordCaller_Throws(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Transient() {
	C.cproxykeywords_KeywordCaller_Transient(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) True() {
	C.cproxykeywords_KeywordCaller_True(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Try() {
	C.cproxykeywords_KeywordCaller_Try(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Void() {
	C.cproxykeywords_KeywordCaller_Void(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) Volatile() {
	C.cproxykeywords_KeywordCaller_Volatile(C.int32_t(p.Bind_proxy_refnum__()))
}

func (p *proxykeywords_KeywordCaller) While() {
	C.cproxykeywords_KeywordCaller_While(C.int32_t(p.Bind_proxy_refnum__()))
}

//export proxykeywords__Const
func proxykeywords__Const(param_id C.nstring) {
	_param_id := decodeString(param_id)
	keywords.Const(_param_id)
}

//export proxykeywords__Static
func proxykeywords__Static(param_strictfp C.nstring) {
	_param_strictfp := decodeString(param_strictfp)
	keywords.Static(_param_strictfp)
}
