1/* @title: Type Enum */
2#pragma once
3
4#include <stdbool.h>
5#include <stddef.h>
6#include <stdint.h>
7
8enum type_enum {
9 TYPE_NONE,
10 TYPE_INT8,
11 TYPE_UINT8,
12 TYPE_INT16,
13 TYPE_UINT16,
14 TYPE_INT32,
15 TYPE_UINT32,
16 TYPE_INT64,
17 TYPE_UINT64,
18 TYPE_FLOAT32,
19 TYPE_FLOAT64,
20 TYPE_BOOL,
21 TYPE_POINTER,
22 TYPE_UNKNOWN,
23 TYPE_MAX,
24};
25
26#define TYPE_TO_ENUM(X) \
27 cc_generic((X), int8_t : TYPE_INT8, uint8_t : TYPE_UINT8, \
28 int16_t : TYPE_INT16, uint16_t : TYPE_UINT16, \
29 int32_t : TYPE_INT32, uint32_t : TYPE_UINT32, \
30 int64_t : TYPE_INT64, uint64_t : TYPE_UINT64, \
31 float : TYPE_FLOAT32, double : TYPE_FLOAT64, bool : TYPE_BOOL, \
32 default : cc_generic((void *) (X), void * : TYPE_POINTER, \
33 const void * : TYPE_POINTER, \
34 volatile void * : TYPE_POINTER, \
35 const volatile void * : TYPE_POINTER, \
36 default : TYPE_UNKNOWN))
37
38static inline size_t type_enum_width(enum type_enum type) {
39 switch (type) {
40 case TYPE_INT8:
41 case TYPE_UINT8: return 1;
42 case TYPE_INT16:
43 case TYPE_UINT16: return 2;
44 case TYPE_INT32:
45 case TYPE_UINT32:
46 case TYPE_FLOAT32: return 4;
47 case TYPE_INT64:
48 case TYPE_UINT64:
49 case TYPE_FLOAT64: return 8;
50 case TYPE_BOOL: return 1;
51 case TYPE_POINTER: return sizeof(void *);
52 default: return 0;
53 }
54}
55
56static inline const char *type_enum_str(enum type_enum type) {
57 switch (type) {
58 case TYPE_NONE: return "none";
59 case TYPE_INT8: return "int8";
60 case TYPE_UINT8: return "uint8";
61 case TYPE_INT16: return "int16";
62 case TYPE_UINT16: return "uint16";
63 case TYPE_INT32: return "int32";
64 case TYPE_UINT32: return "uint32";
65 case TYPE_INT64: return "int64";
66 case TYPE_UINT64: return "uint64";
67 case TYPE_FLOAT32: return "float32";
68 case TYPE_FLOAT64: return "float64";
69 case TYPE_BOOL: return "bool";
70 case TYPE_POINTER: return "ptr";
71 default: return "unknown";
72 }
73}
74