Nilorea Library
C utilities for networking, threading, graphics
Loading...
Searching...
No Matches
n_enum.h
Go to the documentation of this file.
1
9#ifndef __N_ENUM_HEADER__
10#define __N_ENUM_HEADER__
11
12#include <string.h> // for strcmp
13#include <stdbool.h>
14
15#ifdef __cplusplus
16extern "C" {
17#endif
18
24/* MACROS FOR N_ENUMS MACRO ENTRIES (START) */
25
27#define N_ENUM_ENTRY(class, method) class##__##method
28
30#define __N_ENUM_MACRO_ENTRY_CASE(element_name) case element_name:
32#define __N_ENUM_MACRO_ENTRY_COMPARE(element_name) if (!strcmp(#element_name, str_value))
34#define __N_ENUM_MACRO_ENTRY_COMPARE_EX(element_name) if (!strcmp(#element_name + index, str_value))
36#define __N_ENUM_MACRO_ENTRY_UNKNOWN_VALUE(enum_name) __##enum_name##_UNKNOWN_VALUE__
37
39#define __N_ENUM_MACRO_ENTRY_TO_ENUM_ELEMENT(element_name, element_value) \
40 element_name = element_value,
42#define __N_ENUM_MACRO_ENTRY_TO_ISVALID_CASE(element_name, element_value) \
43 __N_ENUM_MACRO_ENTRY_CASE(element_name) \
44 return true;
46#define __N_ENUM_MACRO_ENTRY_TO_TOSTRING_CASE(element_name, element_value) \
47 __N_ENUM_MACRO_ENTRY_CASE(element_name) \
48 return #element_name;
50#define __N_ENUM_MACRO_ENTRY_TO_FROMSTRING_COMPARE(element_name, element_value) \
51 __N_ENUM_MACRO_ENTRY_COMPARE(element_name) \
52 return element_name;
54#define __N_ENUM_MACRO_ENTRY_TO_FROMSTRING_COMPARE_EX(element_name, element_value) \
55 __N_ENUM_MACRO_ENTRY_COMPARE_EX(element_name) \
56 return element_name;
58#define __N_ENUM_MACRO_ENTRY_TO_ISSTRINGVALID_COMPARE(element_name, element_value) \
59 __N_ENUM_MACRO_ENTRY_COMPARE(element_name) \
60 return true;
61/* MACROS FOR N_ENUMS MACRO ENTRIES (END) */
62
63/* MACRO FOR ENUM DECLARATION (START) */
65#define __N_ENUM_DECLARE_ENUM(MACRO_DEFINITION, enum_name) \
66 typedef enum enum_name { \
67 MACRO_DEFINITION(__N_ENUM_MACRO_ENTRY_TO_ENUM_ELEMENT) \
68 __N_ENUM_MACRO_ENTRY_UNKNOWN_VALUE(enum_name) \
69 } enum_name;
70/* MACRO FOR ENUM DECLARATION (END) */
71
72/* MACRO FOR N_ENUMS FUNCTIONS * PREFIX : __N_ENUM_FUNCTION_ */
74#define __N_ENUM_DECLARE_FUNCTION(__N_ENUM_FUNCTION, enum_name) __N_ENUM_FUNCTION(enum_name); // MACRO for function declaration (just add ; after function)
76#define __N_ENUM_FUNCTION_ISVALID(enum_name) \
77 bool N_ENUM_ENTRY(enum_name, isValid)(enum_name value)
79#define __N_ENUM_FUNCTION_TOSTRING(enum_name) \
80 const char* N_ENUM_ENTRY(enum_name, toString)(enum_name value)
82#define __N_ENUM_FUNCTION_ISSTRINGVALID(enum_name) \
83 bool N_ENUM_ENTRY(enum_name, isStringValid)(const char* str_value)
85#define __N_ENUM_FUNCTION_FROMSTRING(enum_name) \
86 enum_name N_ENUM_ENTRY(enum_name, fromString)(const char* str_value)
88#define __N_ENUM_FUNCTION_FROMSTRING_EX(enum_name) \
89 enum_name N_ENUM_ENTRY(enum_name, fromStringEx)(const char* str_value, int index)
90/* MACRO FOR N_ENUMS FUNCTIONS (END) */
91
92/* MACRO FOR N_ENUMS FUNCTIONS DEFINITIONS * PREFIX : __N_ENUM_DEFINE_FUNCTION_ */
94#define __N_ENUM_DEFINE_FUNCTION_ISVALID(MACRO_DEFINITION, enum_name) \
95 __N_ENUM_FUNCTION_ISVALID(enum_name) { \
96 switch (value) { \
97 MACRO_DEFINITION(__N_ENUM_MACRO_ENTRY_TO_ISVALID_CASE) \
98 default: \
99 return false; \
100 } \
101 }
103#define __N_ENUM_DEFINE_FUNCTION_TOSTRING(MACRO_DEFINITION, enum_name) \
104 __N_ENUM_FUNCTION_TOSTRING(enum_name) { \
105 switch (value) { \
106 MACRO_DEFINITION(__N_ENUM_MACRO_ENTRY_TO_TOSTRING_CASE) \
107 default: \
108 return 0; \
109 } \
110 }
112#define __N_ENUM_DEFINE_FUNCTION_ISSTRINGVALID(MACRO_DEFINITION, enum_name) \
113 __N_ENUM_FUNCTION_ISSTRINGVALID(enum_name) { \
114 MACRO_DEFINITION(__N_ENUM_MACRO_ENTRY_TO_ISSTRINGVALID_COMPARE) \
115 return false; \
116 }
118#define __N_ENUM_DEFINE_FUNCTION_FROMSTRING(MACRO_DEFINITION, enum_name) \
119 __N_ENUM_FUNCTION_FROMSTRING(enum_name) { \
120 MACRO_DEFINITION(__N_ENUM_MACRO_ENTRY_TO_FROMSTRING_COMPARE) \
121 return __N_ENUM_MACRO_ENTRY_UNKNOWN_VALUE(enum_name); \
122 }
124#define __N_ENUM_DEFINE_FUNCTION_FROMSTRING_EX(MACRO_DEFINITION, enum_name) \
125 __N_ENUM_FUNCTION_FROMSTRING_EX(enum_name) { \
126 MACRO_DEFINITION(__N_ENUM_MACRO_ENTRY_TO_FROMSTRING_COMPARE_EX) \
127 return __N_ENUM_MACRO_ENTRY_UNKNOWN_VALUE(enum_name); \
128 }
129/* MACRO FOR N_ENUMS FUNCTIONS DEFINITIONS (END) */
130
131/* N_ENUM DECLARATION */
133#define N_ENUM_DECLARE(MACRO_DEFINITION, enum_name) \
134 __N_ENUM_DECLARE_ENUM(MACRO_DEFINITION, enum_name) \
135 __N_ENUM_DECLARE_FUNCTION(__N_ENUM_FUNCTION_ISVALID, enum_name) \
136 __N_ENUM_DECLARE_FUNCTION(__N_ENUM_FUNCTION_ISSTRINGVALID, enum_name) \
137 __N_ENUM_DECLARE_FUNCTION(__N_ENUM_FUNCTION_TOSTRING, enum_name) \
138 __N_ENUM_DECLARE_FUNCTION(__N_ENUM_FUNCTION_FROMSTRING, enum_name) \
139 __N_ENUM_DECLARE_FUNCTION(__N_ENUM_FUNCTION_FROMSTRING_EX, enum_name)
140/* N_ENUM DECLARATION (END) */
141
142/* N_ENUM DEFINITION */
144#define N_ENUM_DEFINE(MACRO_DEFINITION, enum_name) \
145 __N_ENUM_DEFINE_FUNCTION_ISVALID(MACRO_DEFINITION, enum_name) \
146 __N_ENUM_DEFINE_FUNCTION_ISSTRINGVALID(MACRO_DEFINITION, enum_name) \
147 __N_ENUM_DEFINE_FUNCTION_TOSTRING(MACRO_DEFINITION, enum_name) \
148 __N_ENUM_DEFINE_FUNCTION_FROMSTRING(MACRO_DEFINITION, enum_name) \
149 __N_ENUM_DEFINE_FUNCTION_FROMSTRING_EX(MACRO_DEFINITION, enum_name)
150/* N_ENUM DEFINITION (END) */
151
156#ifdef __cplusplus
157}
158#endif
159
160#endif // header guard