Nilorea Library
C utilities for networking, threading, graphics
n_enum.h
Go to the documentation of this file.
1
8#ifndef __N_ENUM_HEADER__
9#define __N_ENUM_HEADER__
10
11#include <string.h> // for strcmp
12#include <stdbool.h>
13
14#ifdef __cplusplus
15extern "C" {
16#endif
17
23/* MACROS FOR N_ENUMS MACRO ENTRIES (START) */
24
26#define N_ENUM_ENTRY(class, method) class##_##method
27
29#define __N_ENUM_MACRO_ENTRY_CASE(element_name) case element_name:
31#define __N_ENUM_MACRO_ENTRY_COMPARE(element_name) if(!strcmp(#element_name, str_value))
33#define __N_ENUM_MACRO_ENTRY_COMPARE_EX(element_name) if(!strcmp(#element_name + index, str_value))
35#define __N_ENUM_MACRO_ENTRY_UNKNOWN_VALUE(enum_name) __##enum_name##_UNKNOWN_VALUE__
36
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) return true;
45#define __N_ENUM_MACRO_ENTRY_TO_TOSTRING_CASE(element_name, element_value)\
46 __N_ENUM_MACRO_ENTRY_CASE(element_name) return #element_name;
48#define __N_ENUM_MACRO_ENTRY_TO_FROMSTRING_COMPARE(element_name, element_value)\
49 __N_ENUM_MACRO_ENTRY_COMPARE(element_name) return element_name;
51#define __N_ENUM_MACRO_ENTRY_TO_FROMSTRING_COMPARE_EX(element_name, element_value)\
52 __N_ENUM_MACRO_ENTRY_COMPARE_EX(element_name) return element_name;
54#define __N_ENUM_MACRO_ENTRY_TO_ISSTRINGVALID_COMPARE(element_name, element_value)\
55 __N_ENUM_MACRO_ENTRY_COMPARE(element_name) return true;
56/* MACROS FOR N_ENUMS MACRO ENTRIES (END) */
57
58/* MACRO FOR ENUM DECLARATION (START) */
60#define __N_ENUM_DECLARE_ENUM(MACRO_DEFINITION, enum_name)\
61 typedef enum enum_name\
62{\
63 MACRO_DEFINITION(__N_ENUM_MACRO_ENTRY_TO_ENUM_ELEMENT)\
64 __N_ENUM_MACRO_ENTRY_UNKNOWN_VALUE(enum_name)\
65}\
66enum_name;
67/* MACRO FOR ENUM DECLARATION (END) */
68
69/* MACRO FOR N_ENUMS FUNCTIONS * PREFIX : __N_ENUM_FUNCTION_ */
71#define __N_ENUM_DECLARE_FUNCTION(__N_ENUM_FUNCTION, enum_name) __N_ENUM_FUNCTION(enum_name); // MACRO for function declaration (just add ; after function)
73#define __N_ENUM_FUNCTION_ISVALID(enum_name)\
74 bool N_ENUM_ENTRY(enum_name, isValid)(enum_name value)
76#define __N_ENUM_FUNCTION_TOSTRING(enum_name)\
77 const char* N_ENUM_ENTRY(enum_name, toString)(enum_name value)
79#define __N_ENUM_FUNCTION_ISSTRINGVALID(enum_name)\
80 bool N_ENUM_ENTRY(enum_name, isStringValid)(const char* str_value)
82#define __N_ENUM_FUNCTION_FROMSTRING(enum_name)\
83 enum_name N_ENUM_ENTRY(enum_name, fromString)(const char* str_value)
85#define __N_ENUM_FUNCTION_FROMSTRING_EX(enum_name)\
86 enum_name N_ENUM_ENTRY(enum_name, fromStringEx)(const char* str_value, int index)
87/* MACRO FOR N_ENUMS FUNCTIONS (END) */
88
89/* MACRO FOR N_ENUMS FUNCTIONS DEFINITIONS * PREFIX : __N_ENUM_DEFINE_FUNCTION_ */
91#define __N_ENUM_DEFINE_FUNCTION_ISVALID(MACRO_DEFINITION, enum_name)\
92 __N_ENUM_FUNCTION_ISVALID(enum_name)\
93{\
94 switch(value)\
95 {\
96 MACRO_DEFINITION(__N_ENUM_MACRO_ENTRY_TO_ISVALID_CASE)\
97 default: return false;\
98 }\
99}
101#define __N_ENUM_DEFINE_FUNCTION_TOSTRING(MACRO_DEFINITION, enum_name)\
102 __N_ENUM_FUNCTION_TOSTRING(enum_name)\
103{\
104 switch(value)\
105 {\
106 MACRO_DEFINITION(__N_ENUM_MACRO_ENTRY_TO_TOSTRING_CASE)\
107 default: return 0;\
108 }\
109}
111#define __N_ENUM_DEFINE_FUNCTION_ISSTRINGVALID(MACRO_DEFINITION, enum_name)\
112 __N_ENUM_FUNCTION_ISSTRINGVALID(enum_name)\
113{\
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{\
121 MACRO_DEFINITION(__N_ENUM_MACRO_ENTRY_TO_FROMSTRING_COMPARE)\
122 return __N_ENUM_MACRO_ENTRY_UNKNOWN_VALUE(enum_name);\
123}
125#define __N_ENUM_DEFINE_FUNCTION_FROMSTRING_EX(MACRO_DEFINITION, enum_name)\
126 __N_ENUM_FUNCTION_FROMSTRING_EX(enum_name)\
127{\
128 MACRO_DEFINITION(__N_ENUM_MACRO_ENTRY_TO_FROMSTRING_COMPARE_EX)\
129 return __N_ENUM_MACRO_ENTRY_UNKNOWN_VALUE(enum_name);\
130}
131/* MACRO FOR N_ENUMS FUNCTIONS DEFINITIONS (END) */
132
133/* N_ENUM DECLARATION */
135#define N_ENUM_DECLARE(MACRO_DEFINITION, enum_name)\
136 __N_ENUM_DECLARE_ENUM(MACRO_DEFINITION, enum_name)\
137 __N_ENUM_DECLARE_FUNCTION(__N_ENUM_FUNCTION_ISVALID, enum_name)\
138 __N_ENUM_DECLARE_FUNCTION(__N_ENUM_FUNCTION_ISSTRINGVALID, enum_name)\
139 __N_ENUM_DECLARE_FUNCTION(__N_ENUM_FUNCTION_TOSTRING, enum_name)\
140 __N_ENUM_DECLARE_FUNCTION(__N_ENUM_FUNCTION_FROMSTRING, enum_name)\
141 __N_ENUM_DECLARE_FUNCTION(__N_ENUM_FUNCTION_FROMSTRING_EX, enum_name)
142/* N_ENUM DECLARATION (END) */
143
144/* N_ENUM DEFINITION */
146#define N_ENUM_DEFINE(MACRO_DEFINITION, enum_name)\
147 __N_ENUM_DEFINE_FUNCTION_ISVALID(MACRO_DEFINITION, enum_name)\
148 __N_ENUM_DEFINE_FUNCTION_ISSTRINGVALID(MACRO_DEFINITION, enum_name)\
149 __N_ENUM_DEFINE_FUNCTION_TOSTRING(MACRO_DEFINITION, enum_name)\
150 __N_ENUM_DEFINE_FUNCTION_FROMSTRING(MACRO_DEFINITION, enum_name)\
151 __N_ENUM_DEFINE_FUNCTION_FROMSTRING_EX(MACRO_DEFINITION, enum_name)
152/* N_ENUM DEFINITION (END) */
153
158#ifdef __cplusplus
159}
160#endif
161
162#endif // header guard