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

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

*/
import "C"

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

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

// skipped field S.F with unsupported type: interface{}

// skipped method S.Argument with unsupported parameter or return types

// skipped method S.Result with unsupported parameter or return types

//export new_ignore_S
func new_ignore_S() C.int32_t {
	return C.int32_t(_seq.ToRefNum(new(ignore.S)))
}

// skipped method I.Argument with unsupported parameter or return types

// skipped method I.Result with unsupported parameter or return types

type proxyignore_I _seq.Ref

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

// skipped method I.Argument with unsupported parameter or result types
// skipped method I.Result with unsupported parameter or result types
// skipped variable C128 with unsupported type complex128

// skipped variable C64 with unsupported type complex64

// skipped variable Uint with unsupported type uint

// skipped variable Uint32 with unsupported type uint32

// skipped variable Uint64 with unsupported type uint64

// skipped variable V with unsupported type interface{}

// skipped variable Var with unsupported type interface{}

// skipped function Argument with unsupported parameter or result types
// skipped function Result with unsupported parameter or result types
