// Objective-C API for talking to issue10788 Go package.
//   gobind -lang=objc issue10788
//
// File is generated by gobind. Do not edit.

#include <Foundation/Foundation.h>
#include "seq.h"
#include "_cgo_export.h"
#include "GoIssue10788.h"

static NSString* errDomain = @"go.issue10788";


@implementation GoIssue10788TestStruct {
}

- (id)initWithRef:(id)ref {
	self = [super init];
	if (self) { __ref = ref; }
	return self;
}

- (NSString*)value {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	nstring r0 = proxyissue10788_TestStruct_Value_Get(refnum);
	NSString *_r0 = go_seq_to_objc_string(r0);
	return _r0;
}

- (void)setValue:(NSString*)v {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	nstring _v = go_seq_from_objc_string(v);
	proxyissue10788_TestStruct_Value_Set(refnum, _v);
}

@end

@implementation GoIssue10788TestInterface {
}

- (id)initWithRef:(id)ref {
	self = [super init];
	if (self) { __ref = ref; }
	return self;
}

- (void)doSomeWork:(GoIssue10788TestStruct*)s {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	int32_t _s;
	if ([(id<NSObject>)(s) isKindOfClass:[GoIssue10788TestStruct class]]) {
		id<goSeqRefInterface> s_proxy = (id<goSeqRefInterface>)(s);
		_s = go_seq_go_to_refnum(s_proxy._ref);
	} else {
		_s = go_seq_to_refnum(s);
	}
	proxyissue10788_TestInterface_DoSomeWork(refnum, _s);
}

- (void)multipleUnnamedParams:(int)p0 p1:(NSString*)p1 p2:(int64_t)p2 {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	nint _p0 = (nint)p0;
	nstring _p1 = go_seq_from_objc_string(p1);
	int64_t _p2 = (int64_t)p2;
	proxyissue10788_TestInterface_MultipleUnnamedParams(refnum, _p0, _p1, _p2);
}

@end



void cproxyissue10788_TestInterface_DoSomeWork(int32_t refnum, int32_t s) {
	@autoreleasepool {
		GoIssue10788TestInterface* o = go_seq_objc_from_refnum(refnum);
		GoIssue10788TestStruct* _s = nil;
		GoSeqRef* _s_ref = go_seq_from_refnum(s);
		if (_s_ref != NULL) {
			_s = _s_ref.obj;
			if (_s == nil) {
				_s = [[GoIssue10788TestStruct alloc] initWithRef:_s_ref];
			}
		}
		[o doSomeWork:_s];
	}
}

void cproxyissue10788_TestInterface_MultipleUnnamedParams(int32_t refnum, nint p0, nstring p1, int64_t p2) {
	@autoreleasepool {
		GoIssue10788TestInterface* o = go_seq_objc_from_refnum(refnum);
		int _p0 = (int)p0;
		NSString *_p1 = go_seq_to_objc_string(p1);
		int64_t _p2 = (int64_t)p2;
		[o multipleUnnamedParams:_p0 p1:_p1 p2:_p2];
	}
}

__attribute__((constructor)) static void init() {
	init_seq();
}
