/** * optional.h - some macros for optional types * * 2023 Yaroslav de la Peña Smirnov * */ #ifndef OPTIONAL_H #define OPTIONAL_H #include #define OPTIONAL(T, name) struct { bool has; T data; } name #define OPTNONE { .has = false } #define OPTSOME(d) { .has = true, .data = d } #define optional_set_none(opt) opt.has = false #define optional_set_some(opt, d) \ (opt.has = true, opt.data = d) #define optional_has(opt) (opt.has) #define optional_hasnt(opt) (!opt.has) #define optional_unwrap(src, dst) \ (optional_has(src) ? (dst = src.data, true) : (false)) #endif