crafting-interpreters/clox/src/value.h

52 lines
1.2 KiB
C
Raw Normal View History

2021-07-08 11:24:24 +02:00
#ifndef clox_value_h
#define clox_value_h
#include "common.h"
2021-09-06 11:24:56 +02:00
typedef struct Obj Obj;
typedef struct ObjString ObjString;
2021-08-25 10:08:14 +02:00
typedef enum {
VAL_BOOL,
VAL_NIL,
VAL_NUMBER,
2021-09-06 11:24:56 +02:00
VAL_OBJ,
2021-08-25 10:08:14 +02:00
} ValueType;
typedef struct {
ValueType type;
union {
bool boolean;
double number;
2021-09-06 11:24:56 +02:00
Obj *obj;
2021-08-25 10:08:14 +02:00
} as;
} Value;
#define IS_BOOL(value) ((value).type == VAL_BOOL)
#define IS_NIL(value) ((value).type == VAL_NIL)
#define IS_NUMBER(value) ((value).type == VAL_NUMBER)
2021-09-06 11:24:56 +02:00
#define IS_OBJ(value) ((value).type == VAL_OBJ)
2021-08-25 10:08:14 +02:00
2021-09-06 11:24:56 +02:00
#define AS_OBJ(value) ((value).as.obj)
2021-08-25 10:08:14 +02:00
#define AS_BOOL(value) ((value).as.boolean)
#define AS_NUMBER(value) ((value).as.number)
#define BOOL_VAL(value) ((Value){VAL_BOOL, {.boolean = value}})
#define NIL_VAL ((Value){VAL_NIL, {.number = 0}})
#define NUMBER_VAL(value) ((Value){VAL_NUMBER, {.number = value}})
2021-09-06 11:24:56 +02:00
#define OBJ_VAL(value) ((Value){VAL_OBJ, {.obj = (Obj *)object}})
2021-07-08 11:24:24 +02:00
typedef struct {
int capacity;
int count;
2021-08-25 10:08:14 +02:00
Value *values;
2021-07-08 11:24:24 +02:00
} ValueArray;
2021-09-06 11:03:31 +02:00
bool valuesEqual(Value a, Value b);
2021-08-25 10:08:14 +02:00
void initValueArray(ValueArray *array);
void writeValueArray(ValueArray *array, Value value);
void freeValueArray(ValueArray *array);
2021-07-08 11:24:24 +02:00
void printValue(Value value);
#endif