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 _Generic((X), \
28 int8_t: TYPE_INT8, \
29 uint8_t: TYPE_UINT8, \
30 int16_t: TYPE_INT16, \
31 uint16_t: TYPE_UINT16, \
32 int32_t: TYPE_INT32, \
33 uint32_t: TYPE_UINT32, \
34 int64_t: TYPE_INT64, \
35 uint64_t: TYPE_UINT64, \
36 float: TYPE_FLOAT32, \
37 double: TYPE_FLOAT64, \
38 bool: TYPE_BOOL, \
39 default: _Generic((void *) (X), \
40 void *: TYPE_POINTER, \
41 const void *: TYPE_POINTER, \
42 volatile void *: TYPE_POINTER, \
43 const volatile void *: TYPE_POINTER, \
44 default: TYPE_UNKNOWN))
45
46static inline size_t type_enum_width(enum type_enum type) {
47 switch (type) {
48 case TYPE_INT8:
49 case TYPE_UINT8: return 1;
50 case TYPE_INT16:
51 case TYPE_UINT16: return 2;
52 case TYPE_INT32:
53 case TYPE_UINT32:
54 case TYPE_FLOAT32: return 4;
55 case TYPE_INT64:
56 case TYPE_UINT64:
57 case TYPE_FLOAT64: return 8;
58 case TYPE_BOOL: return 1;
59 case TYPE_POINTER: return sizeof(void *);
60 default: return 0;
61 }
62}
63
64static inline const char *type_enum_str(enum type_enum type) {
65 switch (type) {
66 case TYPE_NONE: return "none";
67 case TYPE_INT8: return "int8";
68 case TYPE_UINT8: return "uint8";
69 case TYPE_INT16: return "int16";
70 case TYPE_UINT16: return "uint16";
71 case TYPE_INT32: return "int32";
72 case TYPE_UINT32: return "uint32";
73 case TYPE_INT64: return "int64";
74 case TYPE_UINT64: return "uint64";
75 case TYPE_FLOAT32: return "float32";
76 case TYPE_FLOAT64: return "float64";
77 case TYPE_BOOL: return "bool";
78 case TYPE_POINTER: return "ptr";
79 default: return "unknown";
80 }
81}
82