|
|
@ -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: |