// 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 "ref.h"
#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
