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

#ifndef __Vars_H__
#define __Vars_H__

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


@class VarsS;
@protocol VarsI;
@class VarsI;

@protocol VarsI <NSObject>
@end

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

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

@interface Vars : NSObject
+ (BOOL) aBool;
+ (void) setABool:(BOOL)v;

+ (double) aFloat;
+ (void) setAFloat:(double)v;

+ (float) aFloat32;
+ (void) setAFloat32:(float)v;

+ (double) aFloat64;
+ (void) setAFloat64:(double)v;

+ (NSString*) aString;
+ (void) setAString:(NSString*)v;

+ (VarsS*) aStructPtr;
+ (void) setAStructPtr:(VarsS*)v;

+ (long) anInt;
+ (void) setAnInt:(long)v;

+ (int16_t) anInt16;
+ (void) setAnInt16:(int16_t)v;

+ (int32_t) anInt32;
+ (void) setAnInt32:(int32_t)v;

+ (int64_t) anInt64;
+ (void) setAnInt64:(int64_t)v;

+ (int8_t) anInt8;
+ (void) setAnInt8:(int8_t)v;

+ (id<VarsI>) anInterface;
+ (void) setAnInterface:(id<VarsI>)v;

@end

@class VarsI;

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

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

#endif
