#import "Identifier.h"
OF_ASSUME_NONNULL_BEGIN
#define VARP(name, min_, cur, max_) \
int name = cur; \
\
OF_CONSTRUCTOR() \
{ \
enqueueInit(^{ \
Variable *variable = \
[Variable variableWithName:@ #name \
min:min_ \
max:max_ \
storage:&name \
function:NULL \
persisted:true]; \
Identifier.identifiers[@ #name] = variable; \
}); \
}
#define VAR(name, min_, cur, max_) \
int name = cur; \
\
OF_CONSTRUCTOR() \
{ \
enqueueInit(^{ \
Variable *variable = \
[Variable variableWithName:@ #name \
min:min_ \
max:max_ \
storage:&name \
function:NULL \
persisted:false]; \
Identifier.identifiers[@ #name] = variable; \
}); \
}
#define VARF(name, min_, cur, max_, body) \
static void var_##name(); \
static int name = cur; \
\
OF_CONSTRUCTOR() \
{ \
enqueueInit(^{ \
Variable *variable = \
[Variable variableWithName:@ #name \
min:min_ \
max:max_ \
storage:&name \
function:var_##name \
persisted:false]; \
Identifier.identifiers[@ #name] = variable; \
}); \
} \
\
static void var_##name() { body; }
#define VARFP(name, min_, cur, max_, body) \
static void var_##name(); \
static int name = cur; \
\
OF_CONSTRUCTOR() \
{ \
enqueueInit(^{ \
Variable *variable = \
[Variable variableWithName:@ #name \
min:min_ \
max:max_ \
storage:&name \
function:var_##name \
persisted:true]; \
Identifier.identifiers[@ #name] = variable; \
}); \
} \
\
static void var_##name() { body; }
@interface Variable: Identifier
@property (readonly, nonatomic) int min, max;
@property (readonly, nonatomic) int *storage;
@property (readonly, nullable, nonatomic) void (*function)();
@property (readonly, nonatomic) bool persisted;
+ (instancetype)variableWithName:(OFString *)name
min:(int)min
max:(int)max
storage:(int *)storage
function:(void (*_Nullable)())function
persisted:(bool)persisted;
- (instancetype)initWithName:(OFString *)name OF_UNAVAILABLE;
- (instancetype)initWithName:(OFString *)name
min:(int)min
max:(int)max
storage:(int *)storage
function:(void (*_Nullable)())function
persisted:(bool)persisted;
- (void)printValue;
- (void)setValue:(int)value;
@end
OF_ASSUME_NONNULL_END