6 Module ENUMS
gullradriel edited this page 2026-10-29 20:54:40 +01:00

ENUMERATIONS: quick and clean enum macro set

Defines

Name
__N_ENUM_MACRO_ENTRY_UNKNOWN_VALUE(enum_name)
utils macros unknown value
__N_ENUM_MACRO_ENTRY_TO_TOSTRING_CASE(element_name, element_value)
macro to convert N_ENUMS entry to a string element
__N_ENUM_MACRO_ENTRY_TO_ISVALID_CASE(element_name, element_value)
macro to test N_ENUMS entry
__N_ENUM_MACRO_ENTRY_TO_ISSTRINGVALID_COMPARE(element_name, element_value)
macro to test if the string is a valid enum entry
__N_ENUM_MACRO_ENTRY_TO_FROMSTRING_COMPARE_EX(element_name, element_value)
macro to convert string to N_ENUMS value
__N_ENUM_MACRO_ENTRY_TO_FROMSTRING_COMPARE(element_name, element_value)
macro to convert string to N_ENUMS value
__N_ENUM_MACRO_ENTRY_TO_ENUM_ELEMENT(element_name, element_value)
macro to convert N_ENUMS entry to a real ENUM element
__N_ENUM_MACRO_ENTRY_COMPARE_EX(element_name)
utils macros string ex compare.
__N_ENUM_MACRO_ENTRY_COMPARE(element_name)
utils macros string compare
__N_ENUM_MACRO_ENTRY_CASE(element_name)
utils macro case value
__N_ENUM_FUNCTION_TOSTRING(enum_name)
create a to string function
__N_ENUM_FUNCTION_ISVALID(enum_name)
create a test function
__N_ENUM_FUNCTION_ISSTRINGVALID(enum_name)
create a is string valid function
__N_ENUM_FUNCTION_FROMSTRING_EX(enum_name)
create a value from string function
__N_ENUM_FUNCTION_FROMSTRING(enum_name)
create a value from string function
__N_ENUM_DEFINE_FUNCTION_TOSTRING(MACRO_DEFINITION, enum_name)
create getter functions toString
__N_ENUM_DEFINE_FUNCTION_ISVALID(MACRO_DEFINITION, enum_name)
create getter functions is_valid
__N_ENUM_DEFINE_FUNCTION_ISSTRINGVALID(MACRO_DEFINITION, enum_name)
create getter for function isStringValue
__N_ENUM_DEFINE_FUNCTION_FROMSTRING_EX(MACRO_DEFINITION, enum_name)
create getter functions fromStringEx
__N_ENUM_DEFINE_FUNCTION_FROMSTRING(MACRO_DEFINITION, enum_name)
create getter functions fromString
__N_ENUM_DECLARE_FUNCTION(__N_ENUM_FUNCTION, enum_name)
create a getter function
__N_ENUM_DECLARE_ENUM(MACRO_DEFINITION, enum_name)
macro for ENUM declaration
N_ENUM_ENTRY(class, method)
helper to build an N_ENUM
N_ENUM_DEFINE(MACRO_DEFINITION, enum_name)
Macro to define an N_ENUM.
N_ENUM_DECLARE(MACRO_DEFINITION, enum_name)
Macro to declare a N_ENUM.

Macros Documentation

define __N_ENUM_MACRO_ENTRY_UNKNOWN_VALUE

#define __N_ENUM_MACRO_ENTRY_UNKNOWN_VALUE(
    enum_name
)
__##enum_name##_UNKNOWN_VALUE__

utils macros unknown value

define __N_ENUM_MACRO_ENTRY_TO_TOSTRING_CASE

#define __N_ENUM_MACRO_ENTRY_TO_TOSTRING_CASE(
    element_name,
    element_value
)
__N_ENUM_MACRO_ENTRY_CASE(element_name)                                \
return #element_name;

macro to convert N_ENUMS entry to a string element

define __N_ENUM_MACRO_ENTRY_TO_ISVALID_CASE

#define __N_ENUM_MACRO_ENTRY_TO_ISVALID_CASE(
    element_name,
    element_value
)
__N_ENUM_MACRO_ENTRY_CASE(element_name)                               \
return true;

macro to test N_ENUMS entry

define __N_ENUM_MACRO_ENTRY_TO_ISSTRINGVALID_COMPARE

#define __N_ENUM_MACRO_ENTRY_TO_ISSTRINGVALID_COMPARE(
    element_name,
    element_value
)
__N_ENUM_MACRO_ENTRY_COMPARE(element_name)                                     \
return true;

macro to test if the string is a valid enum entry

define __N_ENUM_MACRO_ENTRY_TO_FROMSTRING_COMPARE_EX

#define __N_ENUM_MACRO_ENTRY_TO_FROMSTRING_COMPARE_EX(
    element_name,
    element_value
)
__N_ENUM_MACRO_ENTRY_COMPARE_EX(element_name)                                  \
return element_name;

macro to convert string to N_ENUMS value

define __N_ENUM_MACRO_ENTRY_TO_FROMSTRING_COMPARE

#define __N_ENUM_MACRO_ENTRY_TO_FROMSTRING_COMPARE(
    element_name,
    element_value
)
__N_ENUM_MACRO_ENTRY_COMPARE(element_name)                                  \
return element_name;

macro to convert string to N_ENUMS value

define __N_ENUM_MACRO_ENTRY_TO_ENUM_ELEMENT

#define __N_ENUM_MACRO_ENTRY_TO_ENUM_ELEMENT(
    element_name,
    element_value
)
element_name = element_value,

macro to convert N_ENUMS entry to a real ENUM element

define __N_ENUM_MACRO_ENTRY_COMPARE_EX

#define __N_ENUM_MACRO_ENTRY_COMPARE_EX(
    element_name
)
if (!strcmp(&(#element_name)[index], str_value))

utils macros string ex compare.

The subscript spelling is deliberate: #element_name + index is the same pointer, but clang reads adding an int to a string literal as a probable "append" mistake and warns (-Wstring-plus-int) at every expansion, which is once per enum entry.

define __N_ENUM_MACRO_ENTRY_COMPARE

#define __N_ENUM_MACRO_ENTRY_COMPARE(
    element_name
)
if (!strcmp(#element_name, str_value))

utils macros string compare

define __N_ENUM_MACRO_ENTRY_CASE

#define __N_ENUM_MACRO_ENTRY_CASE(
    element_name
)
case element_name:

utils macro case value

define __N_ENUM_FUNCTION_TOSTRING

#define __N_ENUM_FUNCTION_TOSTRING(
    enum_name
)
const char* N_ENUM_ENTRY(enum_name, toString)(enum_name value)

create a to string function

define __N_ENUM_FUNCTION_ISVALID

#define __N_ENUM_FUNCTION_ISVALID(
    enum_name
)
bool N_ENUM_ENTRY(enum_name, isValid)(enum_name value)

create a test function

define __N_ENUM_FUNCTION_ISSTRINGVALID

#define __N_ENUM_FUNCTION_ISSTRINGVALID(
    enum_name
)
bool N_ENUM_ENTRY(enum_name, isStringValid)(const char* str_value)

create a is string valid function

define __N_ENUM_FUNCTION_FROMSTRING_EX

#define __N_ENUM_FUNCTION_FROMSTRING_EX(
    enum_name
)
enum_name N_ENUM_ENTRY(enum_name, fromStringEx)(const char* str_value, int index)

create a value from string function

define __N_ENUM_FUNCTION_FROMSTRING

#define __N_ENUM_FUNCTION_FROMSTRING(
    enum_name
)
enum_name N_ENUM_ENTRY(enum_name, fromString)(const char* str_value)

create a value from string function

define __N_ENUM_DEFINE_FUNCTION_TOSTRING

#define __N_ENUM_DEFINE_FUNCTION_TOSTRING(
    MACRO_DEFINITION,
    enum_name
)
__N_ENUM_FUNCTION_TOSTRING(enum_name) {                            \
    switch (value) {                                               \
        MACRO_DEFINITION(__N_ENUM_MACRO_ENTRY_TO_TOSTRING_CASE)    \
        default:                                                   \
            return 0;                                              \
    }                                                              \
}

create getter functions toString

define __N_ENUM_DEFINE_FUNCTION_ISVALID

#define __N_ENUM_DEFINE_FUNCTION_ISVALID(
    MACRO_DEFINITION,
    enum_name
)
__N_ENUM_FUNCTION_ISVALID(enum_name) {                            \
    switch (value) {                                              \
        MACRO_DEFINITION(__N_ENUM_MACRO_ENTRY_TO_ISVALID_CASE)    \
        default:                                                  \
            return false;                                         \
    }                                                             \
}

create getter functions is_valid

define __N_ENUM_DEFINE_FUNCTION_ISSTRINGVALID

#define __N_ENUM_DEFINE_FUNCTION_ISSTRINGVALID(
    MACRO_DEFINITION,
    enum_name
)
__N_ENUM_FUNCTION_ISSTRINGVALID(enum_name) {                            \
    if (!str_value) return false;                                       \
    MACRO_DEFINITION(__N_ENUM_MACRO_ENTRY_TO_ISSTRINGVALID_COMPARE)     \
    return false;                                                       \
}

create getter for function isStringValue

define __N_ENUM_DEFINE_FUNCTION_FROMSTRING_EX

#define __N_ENUM_DEFINE_FUNCTION_FROMSTRING_EX(
    MACRO_DEFINITION,
    enum_name
)
__N_ENUM_FUNCTION_FROMSTRING_EX(enum_name) {                              \
    if (!str_value) return __N_ENUM_MACRO_ENTRY_UNKNOWN_VALUE(enum_name); \
    MACRO_DEFINITION(__N_ENUM_MACRO_ENTRY_TO_FROMSTRING_COMPARE_EX)       \
    return __N_ENUM_MACRO_ENTRY_UNKNOWN_VALUE(enum_name);                 \
}

create getter functions fromStringEx

define __N_ENUM_DEFINE_FUNCTION_FROMSTRING

#define __N_ENUM_DEFINE_FUNCTION_FROMSTRING(
    MACRO_DEFINITION,
    enum_name
)
__N_ENUM_FUNCTION_FROMSTRING(enum_name) {                                 \
    if (!str_value) return __N_ENUM_MACRO_ENTRY_UNKNOWN_VALUE(enum_name); \
    MACRO_DEFINITION(__N_ENUM_MACRO_ENTRY_TO_FROMSTRING_COMPARE)          \
    return __N_ENUM_MACRO_ENTRY_UNKNOWN_VALUE(enum_name);                 \
}

create getter functions fromString

define __N_ENUM_DECLARE_FUNCTION

#define __N_ENUM_DECLARE_FUNCTION(
    __N_ENUM_FUNCTION,
    enum_name
)
__N_ENUM_FUNCTION(enum_name);

create a getter function

define __N_ENUM_DECLARE_ENUM

#define __N_ENUM_DECLARE_ENUM(
    MACRO_DEFINITION,
    enum_name
)
typedef enum enum_name {                                   \
    MACRO_DEFINITION(__N_ENUM_MACRO_ENTRY_TO_ENUM_ELEMENT) \
        __N_ENUM_MACRO_ENTRY_UNKNOWN_VALUE(enum_name)      \
} enum_name;

macro for ENUM declaration

define N_ENUM_ENTRY

#define N_ENUM_ENTRY(
    class,
    method
)
class##__##method

helper to build an N_ENUM

define N_ENUM_DEFINE

#define N_ENUM_DEFINE(
    MACRO_DEFINITION,
    enum_name
)
__N_ENUM_DEFINE_FUNCTION_ISVALID(MACRO_DEFINITION, enum_name)       \
__N_ENUM_DEFINE_FUNCTION_ISSTRINGVALID(MACRO_DEFINITION, enum_name) \
__N_ENUM_DEFINE_FUNCTION_TOSTRING(MACRO_DEFINITION, enum_name)      \
__N_ENUM_DEFINE_FUNCTION_FROMSTRING(MACRO_DEFINITION, enum_name)    \
__N_ENUM_DEFINE_FUNCTION_FROMSTRING_EX(MACRO_DEFINITION, enum_name)

Macro to define an N_ENUM.

define N_ENUM_DECLARE

#define N_ENUM_DECLARE(
    MACRO_DEFINITION,
    enum_name
)
__N_ENUM_DECLARE_ENUM(MACRO_DEFINITION, enum_name)                    \
__N_ENUM_DECLARE_FUNCTION(__N_ENUM_FUNCTION_ISVALID, enum_name)       \
__N_ENUM_DECLARE_FUNCTION(__N_ENUM_FUNCTION_ISSTRINGVALID, enum_name) \
__N_ENUM_DECLARE_FUNCTION(__N_ENUM_FUNCTION_TOSTRING, enum_name)      \
__N_ENUM_DECLARE_FUNCTION(__N_ENUM_FUNCTION_FROMSTRING, enum_name)    \
__N_ENUM_DECLARE_FUNCTION(__N_ENUM_FUNCTION_FROMSTRING_EX, enum_name)

Macro to declare a N_ENUM.