summaryrefslogtreecommitdiffstats
path: root/src/libnetdata/template-enum.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/libnetdata/template-enum.h')
-rw-r--r--src/libnetdata/template-enum.h40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/libnetdata/template-enum.h b/src/libnetdata/template-enum.h
new file mode 100644
index 000000000..393a6a945
--- /dev/null
+++ b/src/libnetdata/template-enum.h
@@ -0,0 +1,40 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#ifndef NETDATA_TEMPLATE_ENUM_H
+#define NETDATA_TEMPLATE_ENUM_H
+
+#define ENUM_STR_MAP_DEFINE(type) \
+ static struct { \
+ type id; \
+ const char *name; \
+ } type ## _names[]
+
+#define ENUM_STR_DEFINE_FUNCTIONS_EXTERN(type) \
+ type type ## _2id(const char *str); \
+ const char *type##_2str(type id);
+
+#define ENUM_STR_DEFINE_FUNCTIONS(type, def, def_str) \
+ type type##_2id(const char *str) \
+ { \
+ if (!str || !*str) \
+ return def; \
+ \
+ for (size_t i = 0; type ## _names[i].name; i++) { \
+ if (strcmp(type ## _names[i].name, str) == 0) \
+ return type ## _names[i].id; \
+ } \
+ \
+ return def; \
+ } \
+ \
+ const char *type##_2str(type id) \
+ { \
+ for (size_t i = 0; type ## _names[i].name; i++) { \
+ if (id == type ## _names[i].id) \
+ return type ## _names[i].name; \
+ } \
+ \
+ return def_str; \
+ }
+
+#endif //NETDATA_TEMPLATE_ENUM_H