From c319edf54bd39e68b5dbb2d15f43aaa0aec61755 Mon Sep 17 00:00:00 2001 From: Georg Hopp Date: Thu, 18 Sep 2014 20:48:40 +0100 Subject: [PATCH] remove the bsearch from interface selection. The amount of interfaces is very limited and there is no benefit compared to a direct iteration --- include/tr/interface.h | 12 +----------- src/interface.c | 42 ++++++++++-------------------------------- 2 files changed, 11 insertions(+), 43 deletions(-) diff --git a/include/tr/interface.h b/include/tr/interface.h index 137486b..644e837 100644 --- a/include/tr/interface.h +++ b/include/tr/interface.h @@ -88,7 +88,7 @@ * \see TR_CREATE_CLASS */ #define TR_INIT_IFACE_IMPL(...) \ - {TR_IFACE_NUMARGS(__VA_ARGS__), 0, {__VA_ARGS__}} + {TR_IFACE_NUMARGS(__VA_ARGS__), {__VA_ARGS__}} /** * The interface implementations for a class. @@ -99,16 +99,6 @@ struct TR_iface_impl { /** the number of interface implementations */ const size_t nimpl; - /** - * This indicates if impls was sorted. The first time it - * will be accessed via TR_interfaceGet, This array will - * be sorted with quicksort to make subsequent interface - * searches faster. After it was sorted this flag will be set - * to true, - * - * \see TR_interfaceGet - */ - char simpl; /** Array to hold the used interface implementations. */ const void * impl[TR_MAX_IFACE]; }; diff --git a/src/interface.c b/src/interface.c index e708224..4a2377d 100644 --- a/src/interface.c +++ b/src/interface.c @@ -27,46 +27,24 @@ #include "tr/interface.h" #include "tr/commons.h" -/** - * Compare interfaces. - * Used with bsearch on the interfaces. - */ -static -inline -int -comp(const void * _a, const void * _b) -{ - const struct interface * a = **(const struct interface ***)_a; - const struct interface * b = **(const struct interface ***)_b; - return ((a)<(b))? -1 : ((a)>(b))? 1 : 0; -} - /** * Get a specific interface implementation from the interface * implementation from a class. */ TR_iface_ptr -TR_interfaceGet(TR_iface_impl_ptr iface_impl, const TR_iface_ptr _iface) +TR_interfaceGet(TR_iface_impl_ptr iface_impl, const TR_iface_ptr iface) { - const TR_iface_ptr * iface = &_iface; - TR_iface_ptr * found; - - if (! iface_impl->simpl) { - qsort( - (void**)(iface_impl->impl), - iface_impl->nimpl, - sizeof(TR_iface_ptr), comp); - iface_impl->simpl=TRUE; - } + TR_iface_ptr found = (TR_iface_ptr)NULL; + size_t i; - found = bsearch( - &iface, - iface_impl->impl, - iface_impl->nimpl, - sizeof(TR_iface_ptr), - comp); + for (i = 0; i < iface_impl->nimpl; i++) { + if (*(TR_iface_ptr *)(iface_impl->impl[i]) == iface) { + found = iface_impl->impl[i]; + break; + } + } - return found? *found : (TR_iface_ptr)NULL; + return found; } // vim: set ts=4 sw=4: