value.h 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /**
  2. ******************************************************************************
  3. * @file : value.h
  4. * @author : simon
  5. * @brief : 常量 support only double-precision, floating-point numbers
  6. * @attention : None
  7. * @date : 2023/8/16
  8. ******************************************************************************
  9. */
  10. #ifndef CLOX__VALUE_H_
  11. #define CLOX__VALUE_H_
  12. #include "common.h"
  13. typedef struct Obj Obj;
  14. typedef struct ObjString ObjString;
  15. typedef enum {
  16. VAL_BOOL,
  17. VAL_NIL,
  18. VAL_NUMBER,
  19. VAL_OBJ,/// heap-allocated types: strings, instances, functions
  20. } ValueType;
  21. typedef struct {
  22. ValueType type;
  23. union {
  24. bool boolean;
  25. double number;
  26. Obj *obj;
  27. } as;
  28. } Value;
  29. #define IS_BOOL(value) ((value).type == VAL_BOOL)
  30. #define IS_NIL(value) ((value).type == VAL_NIL)
  31. #define IS_NUMBER(value) ((value).type == VAL_NUMBER)
  32. #define IS_OBJ(value) ((value).type == VAL_OBJ)
  33. #define AS_OBJ(value) ((value).as.obj)
  34. #define AS_BOOL(value) ((value).as.boolean)
  35. #define AS_NUMBER(value) ((value).as.number)
  36. #define BOOL_VAL(value) ((Value){VAL_BOOL, {.boolean = value}})
  37. #define NIL_VAL ((Value){VAL_NIL, {.number = 0}})
  38. #define NUMBER_VAL(value) ((Value){VAL_NUMBER, {.number = value}})
  39. #define OBJ_VAL(object) ((Value){VAL_OBJ, {.obj = (Obj *) object}})
  40. /// \brief 常量池
  41. typedef struct {
  42. int capacity;
  43. int count;
  44. Value *values;
  45. } ValueArray;
  46. bool valuesEqual(Value a, Value b);
  47. void initValueArray(ValueArray *array);
  48. void writeValueArray(ValueArray *array, Value value);
  49. void freeValueArray(ValueArray *array);
  50. void printValue(Value value);
  51. #endif//CLOX__VALUE_H_