// 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 InterfacesInterfaces;
@class InterfacesInterfaces;
@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 InterfacesInterfaces <NSObject>
- (void)someMethod;
@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 InterfacesInterfaces;

@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

/**
 * Interfaces is an interface with the same name as its package.
 */
@interface InterfacesInterfaces : NSObject <goSeqRefInterface, InterfacesInterfaces> {
}
@property(strong, readonly) id _ref;

- (instancetype)initWithRef:(id)ref;
- (void)someMethod;
@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
