// 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 "Issue10788.objc.h"


@implementation Issue10788TestStruct {
}

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

- (instancetype)init {
	self = [super init];
	if (self) {
		__ref = go_seq_from_refnum(new_issue10788_TestStruct());
	}
	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 Issue10788TestInterface {
}

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

- (void)doSomeWork:(Issue10788TestStruct*)s {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	int32_t _s;
	if ([s conformsToProtocol:@protocol(goSeqRefInterface)]) {
		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 日本:(int64_t)日本 {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	nint _p0 = (nint)p0;
	nstring _p1 = go_seq_from_objc_string(p1);
	int64_t _日本 = (int64_t)日本;
	proxyissue10788_TestInterface_MultipleUnnamedParams(refnum, _p0, _p1, _日本);
}

@end



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

void cproxyissue10788_TestInterface_MultipleUnnamedParams(int32_t refnum, nint p0, nstring p1, int64_t 日本) {
	@autoreleasepool {
		Issue10788TestInterface* o = go_seq_objc_from_refnum(refnum);
		long _p0 = (long)p0;
		NSString *_p1 = go_seq_to_objc_string(p1);
		int64_t _日本 = (int64_t)日本;
		[o multipleUnnamedParams:_p0 p1:_p1 日本:_日本];
	}
}

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