Browse Source

remove the bsearch from interface selection. The amount of interfaces is very limited and there is no benefit compared to a direct iteration

1.0.2
Georg Hopp 11 years ago
parent
commit
c319edf54b
  1. 12
      include/tr/interface.h
  2. 42
      src/interface.c

12
include/tr/interface.h

@ -88,7 +88,7 @@
* \see TR_CREATE_CLASS * \see TR_CREATE_CLASS
*/ */
#define TR_INIT_IFACE_IMPL(...) \ #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. * The interface implementations for a class.
@ -99,16 +99,6 @@
struct TR_iface_impl { struct TR_iface_impl {
/** the number of interface implementations */ /** the number of interface implementations */
const size_t nimpl; 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. */ /** Array to hold the used interface implementations. */
const void * impl[TR_MAX_IFACE]; const void * impl[TR_MAX_IFACE];
}; };

42
src/interface.c

@ -27,46 +27,24 @@
#include "tr/interface.h" #include "tr/interface.h"
#include "tr/commons.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 * Get a specific interface implementation from the interface
* implementation from a class. * implementation from a class.
*/ */
TR_iface_ptr 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: // vim: set ts=4 sw=4:
Loading…
Cancel
Save