// 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* _Nonnull)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* _Nonnull)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* _Nullable)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* _Nullable)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();
}
