[waffle] [PATCH 2/4] waffle: use enum list in waffle_enum_to_string()
Frank Henigman
fjhenigman at google.com
Wed Apr 22 11:03:48 PDT 2015
Use the new WAFFLE_ENUM_LIST macro to implement waffle_enum_to_string()
instead of specifying all the enums again.
Now it will no longer be necessary to update waffle_enum_to_string()
when adding an enum.
Use bsearch() instead of a case statement, not because it's better,
but to be symmetric with a new waffle_string_to_enum() function.
Signed-off-by: Frank Henigman <fjhenigman at google.com>
---
src/waffle/core/wcore_util.c | 94 ++++++++++++++++++++++----------------------
1 file changed, 47 insertions(+), 47 deletions(-)
diff --git a/src/waffle/core/wcore_util.c b/src/waffle/core/wcore_util.c
index b7809a3..b912a30 100644
--- a/src/waffle/core/wcore_util.c
+++ b/src/waffle/core/wcore_util.c
@@ -68,54 +68,54 @@ wcore_calloc(size_t size)
return p;
}
+struct enum_map_entry {
+ const char *name;
+ int32_t value;
+};
+
+static int
+enum_cmp_value(const void *v1, const void *v2)
+{
+ const struct enum_map_entry *e1 = (const struct enum_map_entry *) v1;
+ const struct enum_map_entry *e2 = (const struct enum_map_entry *) v2;
+ return e1->value - e2->value;
+}
+
+#define NAME_VALUE(name, value) { #name, value },
+
+static struct enum_map_entry enum_map_value[] = {
+ WAFFLE_ENUM_LIST(NAME_VALUE)
+};
+
+#undef NAME_VALUE
+
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
+
+static void
+enum_sort()
+{
+ static bool sorted = false;
+ if (sorted)
+ return;
+ qsort(enum_map_value, ARRAY_SIZE(enum_map_value), sizeof(enum_map_value[0]),
+ enum_cmp_value);
+ sorted = true;
+}
+
const char*
wcore_enum_to_string(int32_t e)
{
- switch (e) {
- #define CASE(x) case x: return #x
-
- CASE(WAFFLE_DONT_CARE);
- CASE(WAFFLE_NONE);
- CASE(WAFFLE_PLATFORM);
- CASE(WAFFLE_PLATFORM_ANDROID);
- CASE(WAFFLE_PLATFORM_CGL);
- CASE(WAFFLE_PLATFORM_GLX);
- CASE(WAFFLE_PLATFORM_WAYLAND);
- CASE(WAFFLE_PLATFORM_X11_EGL);
- CASE(WAFFLE_PLATFORM_GBM);
- CASE(WAFFLE_PLATFORM_WGL);
- CASE(WAFFLE_PLATFORM_NACL);
- CASE(WAFFLE_CONTEXT_API);
- CASE(WAFFLE_CONTEXT_OPENGL);
- CASE(WAFFLE_CONTEXT_OPENGL_ES1);
- CASE(WAFFLE_CONTEXT_OPENGL_ES2);
- CASE(WAFFLE_CONTEXT_OPENGL_ES3);
- CASE(WAFFLE_CONTEXT_MAJOR_VERSION);
- CASE(WAFFLE_CONTEXT_MINOR_VERSION);
- CASE(WAFFLE_CONTEXT_PROFILE);
- CASE(WAFFLE_CONTEXT_CORE_PROFILE);
- CASE(WAFFLE_CONTEXT_COMPATIBILITY_PROFILE);
- CASE(WAFFLE_CONTEXT_FORWARD_COMPATIBLE);
- CASE(WAFFLE_CONTEXT_DEBUG);
- CASE(WAFFLE_RED_SIZE);
- CASE(WAFFLE_GREEN_SIZE);
- CASE(WAFFLE_BLUE_SIZE);
- CASE(WAFFLE_ALPHA_SIZE);
- CASE(WAFFLE_DEPTH_SIZE);
- CASE(WAFFLE_STENCIL_SIZE);
- CASE(WAFFLE_SAMPLE_BUFFERS);
- CASE(WAFFLE_SAMPLES);
- CASE(WAFFLE_DOUBLE_BUFFERED);
- CASE(WAFFLE_ACCUM_BUFFER);
- CASE(WAFFLE_DL_OPENGL);
- CASE(WAFFLE_DL_OPENGL_ES1);
- CASE(WAFFLE_DL_OPENGL_ES2);
- CASE(WAFFLE_DL_OPENGL_ES3);
- CASE(WAFFLE_WINDOW_WIDTH);
- CASE(WAFFLE_WINDOW_HEIGHT);
-
- default: return NULL;
-
- #undef CASE
- }
+ enum_sort();
+ struct enum_map_entry key = { .value = e };
+ struct enum_map_entry *found = bsearch(&key,
+ enum_map_value,
+ ARRAY_SIZE(enum_map_value),
+ sizeof(enum_map_value[0]),
+ enum_cmp_value);
+ if (!found)
+ return NULL;
+
+ return found->name;
}
+
+#undef ARRAY_SIZE
--
2.2.0.rc0.207.ga3a616c
More information about the waffle
mailing list