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