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

#ifndef __Structs_H__
#define __Structs_H__

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


@class StructsS;
@class StructsS2;
@class StructsStructs;
@protocol StructsI;
@class StructsI;

@protocol StructsI <NSObject>
- (void)m;
@end

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

- (instancetype)initWithRef:(id)ref;
- (instancetype)init;
@property (nonatomic) double x;
@property (nonatomic) double y;
- (StructsS*)identity:(NSError**)error;
- (double)sum;
@end

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

- (instancetype)initWithRef:(id)ref;
- (instancetype)init;
- (void)m;
- (NSString*)string;
@end

/**
 * Structs is a struct with the same name as its package.
 */
@interface StructsStructs : NSObject <goSeqRefInterface, StructsI> {
}
@property(strong, readonly) id _ref;

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

FOUNDATION_EXPORT StructsS* StructsIdentity(StructsS* s);

FOUNDATION_EXPORT StructsS* StructsIdentityWithError(StructsS* s, NSError** error);

@class StructsI;

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

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

#endif
