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

#ifndef __Interfaces_H__
#define __Interfaces_H__

@import Foundation;
#include "Universe.objc.h"


@protocol InterfacesError;
@class InterfacesError;
@protocol InterfacesI;
@class InterfacesI;
@protocol InterfacesI1;
@protocol InterfacesI2;
@protocol InterfacesI3;
@class InterfacesI3;
@protocol InterfacesLargerI;
@class InterfacesLargerI;
@protocol InterfacesSameI;
@class InterfacesSameI;
@protocol InterfacesWithParam;
@class InterfacesWithParam;

@protocol InterfacesError <NSObject>
- (BOOL)err:(NSError**)error;
@end

@protocol InterfacesI <NSObject>
- (int32_t)rand;
@end

@interface InterfacesI1 : NSObject <goSeqRefInterface> {
}
@property(strong, readonly) id _ref;

- (instancetype)initWithRef:(id)ref;
- (void)j;
@end

@interface InterfacesI2 : NSObject <goSeqRefInterface> {
}
@property(strong, readonly) id _ref;

- (instancetype)initWithRef:(id)ref;
- (void)g;
@end

@protocol InterfacesI3 <NSObject>
- (InterfacesI1*)f;
@end

@protocol InterfacesLargerI <NSObject>
- (void)anotherFunc;
- (int32_t)rand;
@end

@protocol InterfacesSameI <NSObject>
- (int32_t)rand;
@end

@protocol InterfacesWithParam <NSObject>
- (void)hasParam:(BOOL)p0;
@end

FOUNDATION_EXPORT int32_t InterfacesAdd3(id<InterfacesI> r);

FOUNDATION_EXPORT BOOL InterfacesCallErr(id<InterfacesError> e, NSError** error);

FOUNDATION_EXPORT id<InterfacesI> InterfacesSeven();

@class InterfacesError;

@class InterfacesI;

@class InterfacesI3;

@class InterfacesLargerI;

@class InterfacesSameI;

@class InterfacesWithParam;

@interface InterfacesError : NSObject <goSeqRefInterface, InterfacesError> {
}
@property(strong, readonly) id _ref;

- (instancetype)initWithRef:(id)ref;
- (BOOL)err:(NSError**)error;
@end

@interface InterfacesI : NSObject <goSeqRefInterface, InterfacesI> {
}
@property(strong, readonly) id _ref;

- (instancetype)initWithRef:(id)ref;
- (int32_t)rand;
@end

@interface InterfacesI3 : NSObject <goSeqRefInterface, InterfacesI3> {
}
@property(strong, readonly) id _ref;

- (instancetype)initWithRef:(id)ref;
- (InterfacesI1*)f;
@end

@interface InterfacesLargerI : NSObject <goSeqRefInterface, InterfacesLargerI> {
}
@property(strong, readonly) id _ref;

- (instancetype)initWithRef:(id)ref;
- (void)anotherFunc;
- (int32_t)rand;
@end

@interface InterfacesSameI : NSObject <goSeqRefInterface, InterfacesSameI> {
}
@property(strong, readonly) id _ref;

- (instancetype)initWithRef:(id)ref;
- (int32_t)rand;
@end

@interface InterfacesWithParam : NSObject <goSeqRefInterface, InterfacesWithParam> {
}
@property(strong, readonly) id _ref;

- (instancetype)initWithRef:(id)ref;
- (void)hasParam:(BOOL)p0;
@end

#endif
