// Code generated by gobind. DO NOT EDIT.

package ObjC

// Used to silence this package not used errors
const Dummy = 0

type Foundation_NSString interface {
}

type Foundation_NSDate interface {
}

type Foundation_NSObjectC interface {
}
// Code generated by gobind. DO NOT EDIT.

package main

// #include "interfaces.h"
import "C"

import "ObjC"
import _seq "golang.org/x/mobile/bind/seq"

type proxy interface{ Bind_proxy_refnum__() int32 }

// Suppress unused package error

var _ = _seq.FromRefNum

const _ = ObjC.Dummy

func init() {
}

type proxy_class_NSString _seq.Ref

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

func init() {
}

type proxy_class_NSDate _seq.Ref

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

func init() {
}

type proxy_class_NSObjectC _seq.Ref

func (p *proxy_class_NSObjectC) Bind_proxy_refnum__() int32 { return (*_seq.Ref)(p).Bind_IncNum() }
// Code generated by gobind. DO NOT EDIT.

// Package main is an autogenerated binder stub for package objc.
//
//   autogenerated by gobind -lang=go objc
package main

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

*/
import "C"

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

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

type proxyobjc_D _seq.Ref

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

type proxyobjc_O _seq.Ref

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

type proxyobjc_S _seq.Ref

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