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

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

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

/**
 * not implementable
 */
@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(void);

@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

/**
 * implementable
(the implementor has to find a source of I1s)
 */
@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
