Nilorea Library
C utilities for networking, threading, graphics
Loading...
Searching...
No Matches
n_enum.h
Go to the documentation of this file.
1/*
2 * Nilorea Library
3 * Copyright (C) 2005-2026 Castagnier Mickael
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
14 * implied. See the License for the specific language governing
15 * permissions and limitations under the License.
16 *
17 * SPDX-License-Identifier: Apache-2.0
18 */
19
27
28#ifndef __N_ENUM_HEADER__
29#define __N_ENUM_HEADER__
30
31#include <string.h> // for strcmp
32#include <stdbool.h>
33
34#ifdef __cplusplus
35extern "C" {
36#endif
37
42
43/* MACROS FOR N_ENUMS MACRO ENTRIES (START) */
44
46#define N_ENUM_ENTRY(class, method) class##__##method
47
49#define __N_ENUM_MACRO_ENTRY_CASE(element_name) case element_name:
51#define __N_ENUM_MACRO_ENTRY_COMPARE(element_name) if (!strcmp(#element_name, str_value))
56#define __N_ENUM_MACRO_ENTRY_COMPARE_EX(element_name) if (!strcmp(&(#element_name)[index], str_value))
58#define __N_ENUM_MACRO_ENTRY_UNKNOWN_VALUE(enum_name) __##enum_name##_UNKNOWN_VALUE__
59
61#define __N_ENUM_MACRO_ENTRY_TO_ENUM_ELEMENT(element_name, element_value) \
62 element_name = element_value,
63
64#define __N_ENUM_MACRO_ENTRY_TO_ISVALID_CASE(element_name, element_value) \
65 __N_ENUM_MACRO_ENTRY_CASE(element_name) \
66 return true;
67
68#define __N_ENUM_MACRO_ENTRY_TO_TOSTRING_CASE(element_name, element_value) \
69 __N_ENUM_MACRO_ENTRY_CASE(element_name) \
70 return #element_name;
71
72#define __N_ENUM_MACRO_ENTRY_TO_FROMSTRING_COMPARE(element_name, element_value) \
73 __N_ENUM_MACRO_ENTRY_COMPARE(element_name) \
74 return element_name;
75
76#define __N_ENUM_MACRO_ENTRY_TO_FROMSTRING_COMPARE_EX(element_name, element_value) \
77 __N_ENUM_MACRO_ENTRY_COMPARE_EX(element_name) \
78 return element_name;
79
80#define __N_ENUM_MACRO_ENTRY_TO_ISSTRINGVALID_COMPARE(element_name, element_value) \
81 __N_ENUM_MACRO_ENTRY_COMPARE(element_name) \
82 return true;
83/* MACROS FOR N_ENUMS MACRO ENTRIES (END) */
84
85/* MACRO FOR ENUM DECLARATION (START) */
87#define __N_ENUM_DECLARE_ENUM(MACRO_DEFINITION, enum_name) \
88 typedef enum enum_name { \
89 MACRO_DEFINITION(__N_ENUM_MACRO_ENTRY_TO_ENUM_ELEMENT) \
90 __N_ENUM_MACRO_ENTRY_UNKNOWN_VALUE(enum_name) \
91 } enum_name;
92/* MACRO FOR ENUM DECLARATION (END) */
93
94/* MACRO FOR N_ENUMS FUNCTIONS * PREFIX : __N_ENUM_FUNCTION_ */
96#define __N_ENUM_DECLARE_FUNCTION(__N_ENUM_FUNCTION, enum_name) __N_ENUM_FUNCTION(enum_name); // MACRO for function declaration (just add ; after function)
98#define __N_ENUM_FUNCTION_ISVALID(enum_name) \
99 bool N_ENUM_ENTRY(enum_name, isValid)(enum_name value)
100
101#define __N_ENUM_FUNCTION_TOSTRING(enum_name) \
102 const char* N_ENUM_ENTRY(enum_name, toString)(enum_name value)
103
104#define __N_ENUM_FUNCTION_ISSTRINGVALID(enum_name) \
105 bool N_ENUM_ENTRY(enum_name, isStringValid)(const char* str_value)
106
107#define __N_ENUM_FUNCTION_FROMSTRING(enum_name) \
108 enum_name N_ENUM_ENTRY(enum_name, fromString)(const char* str_value)
109
110#define __N_ENUM_FUNCTION_FROMSTRING_EX(enum_name) \
111 enum_name N_ENUM_ENTRY(enum_name, fromStringEx)(const char* str_value, int index)
112/* MACRO FOR N_ENUMS FUNCTIONS (END) */
113
114/* MACRO FOR N_ENUMS FUNCTIONS DEFINITIONS * PREFIX : __N_ENUM_DEFINE_FUNCTION_ */
116#define __N_ENUM_DEFINE_FUNCTION_ISVALID(MACRO_DEFINITION, enum_name) \
117 __N_ENUM_FUNCTION_ISVALID(enum_name) { \
118 switch (value) { \
119 MACRO_DEFINITION(__N_ENUM_MACRO_ENTRY_TO_ISVALID_CASE) \
120 default: \
121 return false; \
122 } \
123 }
124
125#define __N_ENUM_DEFINE_FUNCTION_TOSTRING(MACRO_DEFINITION, enum_name) \
126 __N_ENUM_FUNCTION_TOSTRING(enum_name) { \
127 switch (value) { \
128 MACRO_DEFINITION(__N_ENUM_MACRO_ENTRY_TO_TOSTRING_CASE) \
129 default: \
130 return 0; \
131 } \
132 }
133
134#define __N_ENUM_DEFINE_FUNCTION_ISSTRINGVALID(MACRO_DEFINITION, enum_name) \
135 __N_ENUM_FUNCTION_ISSTRINGVALID(enum_name) { \
136 if (!str_value) return false; \
137 MACRO_DEFINITION(__N_ENUM_MACRO_ENTRY_TO_ISSTRINGVALID_COMPARE) \
138 return false; \
139 }
140
141#define __N_ENUM_DEFINE_FUNCTION_FROMSTRING(MACRO_DEFINITION, enum_name) \
142 __N_ENUM_FUNCTION_FROMSTRING(enum_name) { \
143 if (!str_value) return __N_ENUM_MACRO_ENTRY_UNKNOWN_VALUE(enum_name); \
144 MACRO_DEFINITION(__N_ENUM_MACRO_ENTRY_TO_FROMSTRING_COMPARE) \
145 return __N_ENUM_MACRO_ENTRY_UNKNOWN_VALUE(enum_name); \
146 }
147
148#define __N_ENUM_DEFINE_FUNCTION_FROMSTRING_EX(MACRO_DEFINITION, enum_name) \
149 __N_ENUM_FUNCTION_FROMSTRING_EX(enum_name) { \
150 if (!str_value) return __N_ENUM_MACRO_ENTRY_UNKNOWN_VALUE(enum_name); \
151 MACRO_DEFINITION(__N_ENUM_MACRO_ENTRY_TO_FROMSTRING_COMPARE_EX) \
152 return __N_ENUM_MACRO_ENTRY_UNKNOWN_VALUE(enum_name); \
153 }
154/* MACRO FOR N_ENUMS FUNCTIONS DEFINITIONS (END) */
155
156/* N_ENUM DECLARATION */
158#define N_ENUM_DECLARE(MACRO_DEFINITION, enum_name) \
159 __N_ENUM_DECLARE_ENUM(MACRO_DEFINITION, enum_name) \
160 __N_ENUM_DECLARE_FUNCTION(__N_ENUM_FUNCTION_ISVALID, enum_name) \
161 __N_ENUM_DECLARE_FUNCTION(__N_ENUM_FUNCTION_ISSTRINGVALID, enum_name) \
162 __N_ENUM_DECLARE_FUNCTION(__N_ENUM_FUNCTION_TOSTRING, enum_name) \
163 __N_ENUM_DECLARE_FUNCTION(__N_ENUM_FUNCTION_FROMSTRING, enum_name) \
164 __N_ENUM_DECLARE_FUNCTION(__N_ENUM_FUNCTION_FROMSTRING_EX, enum_name)
165/* N_ENUM DECLARATION (END) */
166
167/* N_ENUM DEFINITION */
169#define N_ENUM_DEFINE(MACRO_DEFINITION, enum_name) \
170 __N_ENUM_DEFINE_FUNCTION_ISVALID(MACRO_DEFINITION, enum_name) \
171 __N_ENUM_DEFINE_FUNCTION_ISSTRINGVALID(MACRO_DEFINITION, enum_name) \
172 __N_ENUM_DEFINE_FUNCTION_TOSTRING(MACRO_DEFINITION, enum_name) \
173 __N_ENUM_DEFINE_FUNCTION_FROMSTRING(MACRO_DEFINITION, enum_name) \
174 __N_ENUM_DEFINE_FUNCTION_FROMSTRING_EX(MACRO_DEFINITION, enum_name)
175/* N_ENUM DEFINITION (END) */
176
180
181#ifdef __cplusplus
182}
183#endif
184
185#endif // header guard