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 <fjhenig...@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 _______________________________________________ waffle mailing list waffle@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/waffle