Nilorea Library
C utilities for networking, threading, graphics
Loading...
Searching...
No Matches
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
38#define __N_ENUM_MACRO_ENTRY_TO_ENUM_ELEMENT(element_name, element_value) \
39 element_name = element_value,
41#define __N_ENUM_MACRO_ENTRY_TO_ISVALID_CASE(element_name, element_value) \
42 __N_ENUM_MACRO_ENTRY_CASE(element_name) \
43 return true;
45#define __N_ENUM_MACRO_ENTRY_TO_TOSTRING_CASE(element_name, element_value) \
46 __N_ENUM_MACRO_ENTRY_CASE(element_name) \
47 return #element_name;
49#define __N_ENUM_MACRO_ENTRY_TO_FROMSTRING_COMPARE(element_name, element_value) \
50 __N_ENUM_MACRO_ENTRY_COMPARE(element_name) \
51 return element_name;
53#define __N_ENUM_MACRO_ENTRY_TO_FROMSTRING_COMPARE_EX(element_name, element_value) \
54 __N_ENUM_MACRO_ENTRY_COMPARE_EX(element_name) \
55 return element_name;
57#define __N_ENUM_MACRO_ENTRY_TO_ISSTRINGVALID_COMPARE(element_name, element_value) \
58 __N_ENUM_MACRO_ENTRY_COMPARE(element_name) \
59 return true;
60/* MACROS FOR N_ENUMS MACRO ENTRIES (END) */
61
62/* MACRO FOR ENUM DECLARATION (START) */
64#define __N_ENUM_DECLARE_ENUM(MACRO_DEFINITION, enum_name) \
65 typedef enum enum_name { \
66 MACRO_DEFINITION(__N_ENUM_MACRO_ENTRY_TO_ENUM_ELEMENT) \
67 __N_ENUM_MACRO_ENTRY_UNKNOWN_VALUE(enum_name) \
68 } enum_name;
69/* MACRO FOR ENUM DECLARATION (END) */
70
71/* MACRO FOR N_ENUMS FUNCTIONS * PREFIX : __N_ENUM_FUNCTION_ */
73#define __N_ENUM_DECLARE_FUNCTION(__N_ENUM_FUNCTION, enum_name) __N_ENUM_FUNCTION(enum_name); // MACRO for function declaration (just add ; after function)
75#define __N_ENUM_FUNCTION_ISVALID(enum_name) \
76 bool N_ENUM_ENTRY(enum_name, isValid)(enum_name value)
78#define __N_ENUM_FUNCTION_TOSTRING(enum_name) \
79 const char* N_ENUM_ENTRY(enum_name, toString)(enum_name value)
81#define __N_ENUM_FUNCTION_ISSTRINGVALID(enum_name) \
82 bool N_ENUM_ENTRY(enum_name, isStringValid)(const char* str_value)
84#define __N_ENUM_FUNCTION_FROMSTRING(enum_name) \
85 enum_name N_ENUM_ENTRY(enum_name, fromString)(const char* str_value)
87#define __N_ENUM_FUNCTION_FROMSTRING_EX(enum_name) \
88 enum_name N_ENUM_ENTRY(enum_name, fromStringEx)(const char* str_value, int index)
89/* MACRO FOR N_ENUMS FUNCTIONS (END) */
90
91/* MACRO FOR N_ENUMS FUNCTIONS DEFINITIONS * PREFIX : __N_ENUM_DEFINE_FUNCTION_ */
93#define __N_ENUM_DEFINE_FUNCTION_ISVALID(MACRO_DEFINITION, enum_name) \
94 __N_ENUM_FUNCTION_ISVALID(enum_name) { \
95 switch (value) { \
96 MACRO_DEFINITION(__N_ENUM_MACRO_ENTRY_TO_ISVALID_CASE) \
97 default: \
98 return false; \
99 } \
100 }
102#define __N_ENUM_DEFINE_FUNCTION_TOSTRING(MACRO_DEFINITION, enum_name) \
103 __N_ENUM_FUNCTION_TOSTRING(enum_name) { \
104 switch (value) { \
105 MACRO_DEFINITION(__N_ENUM_MACRO_ENTRY_TO_TOSTRING_CASE) \
106 default: \
107 return 0; \
108 } \
109 }
111#define __N_ENUM_DEFINE_FUNCTION_ISSTRINGVALID(MACRO_DEFINITION, enum_name) \
112 __N_ENUM_FUNCTION_ISSTRINGVALID(enum_name) { \
113 MACRO_DEFINITION(__N_ENUM_MACRO_ENTRY_TO_ISSTRINGVALID_COMPARE) \
114 return false; \
115 }
117#define __N_ENUM_DEFINE_FUNCTION_FROMSTRING(MACRO_DEFINITION, enum_name) \
118 __N_ENUM_FUNCTION_FROMSTRING(enum_name) { \
119 MACRO_DEFINITION(__N_ENUM_MACRO_ENTRY_TO_FROMSTRING_COMPARE) \
120 return __N_ENUM_MACRO_ENTRY_UNKNOWN_VALUE(enum_name); \
121 }
123#define __N_ENUM_DEFINE_FUNCTION_FROMSTRING_EX(MACRO_DEFINITION, enum_name) \
124 __N_ENUM_FUNCTION_FROMSTRING_EX(enum_name) { \
125 MACRO_DEFINITION(__N_ENUM_MACRO_ENTRY_TO_FROMSTRING_COMPARE_EX) \
126 return __N_ENUM_MACRO_ENTRY_UNKNOWN_VALUE(enum_name); \
127 }
128/* MACRO FOR N_ENUMS FUNCTIONS DEFINITIONS (END) */
129
130/* N_ENUM DECLARATION */
132#define N_ENUM_DECLARE(MACRO_DEFINITION, enum_name) \
133 __N_ENUM_DECLARE_ENUM(MACRO_DEFINITION, enum_name) \
134 __N_ENUM_DECLARE_FUNCTION(__N_ENUM_FUNCTION_ISVALID, enum_name) \
135 __N_ENUM_DECLARE_FUNCTION(__N_ENUM_FUNCTION_ISSTRINGVALID, enum_name) \
136 __N_ENUM_DECLARE_FUNCTION(__N_ENUM_FUNCTION_TOSTRING, enum_name) \
137 __N_ENUM_DECLARE_FUNCTION(__N_ENUM_FUNCTION_FROMSTRING, enum_name) \
138 __N_ENUM_DECLARE_FUNCTION(__N_ENUM_FUNCTION_FROMSTRING_EX, enum_name)
139/* N_ENUM DECLARATION (END) */
140
141/* N_ENUM DEFINITION */
143#define N_ENUM_DEFINE(MACRO_DEFINITION, enum_name) \
144 __N_ENUM_DEFINE_FUNCTION_ISVALID(MACRO_DEFINITION, enum_name) \
145 __N_ENUM_DEFINE_FUNCTION_ISSTRINGVALID(MACRO_DEFINITION, enum_name) \
146 __N_ENUM_DEFINE_FUNCTION_TOSTRING(MACRO_DEFINITION, enum_name) \
147 __N_ENUM_DEFINE_FUNCTION_FROMSTRING(MACRO_DEFINITION, enum_name) \
148 __N_ENUM_DEFINE_FUNCTION_FROMSTRING_EX(MACRO_DEFINITION, enum_name)
149/* N_ENUM DEFINITION (END) */
150
155#ifdef __cplusplus
156}
157#endif
158
159#endif // header guard