12 #define NONE_LIST ((List_t){.data = NULL})
13 #define NONE_BOOL ((OptionalBool_t)2)
14 #define NONE_INT ((OptionalInt_t){.small = 0})
15 #define NONE_TABLE ((OptionalTable_t){.entries.data = NULL})
16 #define NONE_CLOSURE ((OptionalClosure_t){.fn = NULL})
17 #define NONE_TEXT ((OptionalText_t){.tag = TEXT_NONE})
18 #define NONE_PATH (Path_t) NULL
20 PUREFUNC bool is_none(const void *obj, const TypeInfo_t *non_optional_type);
21 PUREFUNC uint64_t Optional$hash(const void *obj, const TypeInfo_t *type);
22 PUREFUNC int32_t Optional$compare(const void *x, const void *y, const TypeInfo_t *type);
23 PUREFUNC bool Optional$equal(const void *x, const void *y, const TypeInfo_t *type);
24 Text_t Optional$as_text(const void *obj, bool colorize, const TypeInfo_t *type);
25 void Optional$serialize(const void *obj, FILE *out, Table_t *pointers, const TypeInfo_t *type);
26 void Optional$deserialize(FILE *in, void *outval, List_t *pointers, const TypeInfo_t *type);
28 #define Optional$metamethods \
30 .hash = Optional$hash, \
31 .compare = Optional$compare, \
32 .equal = Optional$equal, \
33 .as_text = Optional$as_text, \
34 .serialize = Optional$serialize, \
35 .deserialize = Optional$deserialize, \
38 #define Optional$info(_size, _align, t) \
39 &((TypeInfo_t){.size = _size, \
41 .tag = OptionalInfo, \
42 .OptionalInfo.type = t, \
43 .metamethods = Optional$metamethods})