// 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"


@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 {
}

- (instancetype)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:(long)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);
		long _p0 = (long)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();
}
