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

#ifndef __GoVars_H__
#define __GoVars_H__

#include <Foundation/Foundation.h>
#include "GoUniverse.h"

@class GoVarsS;
@protocol GoVarsI;
@class GoVarsI;

@interface GoVarsS : NSObject {
}
@property(strong, readonly) id _ref;

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

@protocol GoVarsI
@end

@interface GoVars : 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;

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

+ (int) anInt;
+ (void) setAnInt:(int)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<GoVarsI>) anInterface;
+ (void) setAnInterface:(id<GoVarsI>)v;

@end

@class GoVarsI;

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

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

#endif
