Commit c319edf54bd39e68b5dbb2d15f43aaa0aec61755
1 parent
23c33c57
remove the bsearch from interface selection. The amount of interfaces is very li…
…mited and there is no benefit compared to a direct iteration
Showing
2 changed files
with
11 additions
and
43 deletions
| @@ -88,7 +88,7 @@ | @@ -88,7 +88,7 @@ | ||
| 88 | * \see TR_CREATE_CLASS | 88 | * \see TR_CREATE_CLASS |
| 89 | */ | 89 | */ |
| 90 | #define TR_INIT_IFACE_IMPL(...) \ | 90 | #define TR_INIT_IFACE_IMPL(...) \ |
| 91 | - {TR_IFACE_NUMARGS(__VA_ARGS__), 0, {__VA_ARGS__}} | 91 | + {TR_IFACE_NUMARGS(__VA_ARGS__), {__VA_ARGS__}} |
| 92 | 92 | ||
| 93 | /** | 93 | /** |
| 94 | * The interface implementations for a class. | 94 | * The interface implementations for a class. |
| @@ -99,16 +99,6 @@ | @@ -99,16 +99,6 @@ | ||
| 99 | struct TR_iface_impl { | 99 | struct TR_iface_impl { |
| 100 | /** the number of interface implementations */ | 100 | /** the number of interface implementations */ |
| 101 | const size_t nimpl; | 101 | const size_t nimpl; |
| 102 | - /** | ||
| 103 | - * This indicates if impls was sorted. The first time it | ||
| 104 | - * will be accessed via TR_interfaceGet, This array will | ||
| 105 | - * be sorted with quicksort to make subsequent interface | ||
| 106 | - * searches faster. After it was sorted this flag will be set | ||
| 107 | - * to true, | ||
| 108 | - * | ||
| 109 | - * \see TR_interfaceGet | ||
| 110 | - */ | ||
| 111 | - char simpl; | ||
| 112 | /** Array to hold the used interface implementations. */ | 102 | /** Array to hold the used interface implementations. */ |
| 113 | const void * impl[TR_MAX_IFACE]; | 103 | const void * impl[TR_MAX_IFACE]; |
| 114 | }; | 104 | }; |
| @@ -28,45 +28,23 @@ | @@ -28,45 +28,23 @@ | ||
| 28 | #include "tr/commons.h" | 28 | #include "tr/commons.h" |
| 29 | 29 | ||
| 30 | /** | 30 | /** |
| 31 | - * Compare interfaces. | ||
| 32 | - * Used with bsearch on the interfaces. | ||
| 33 | - */ | ||
| 34 | -static | ||
| 35 | -inline | ||
| 36 | -int | ||
| 37 | -comp(const void * _a, const void * _b) | ||
| 38 | -{ | ||
| 39 | - const struct interface * a = **(const struct interface ***)_a; | ||
| 40 | - const struct interface * b = **(const struct interface ***)_b; | ||
| 41 | - return ((a)<(b))? -1 : ((a)>(b))? 1 : 0; | ||
| 42 | -} | ||
| 43 | - | ||
| 44 | -/** | ||
| 45 | * Get a specific interface implementation from the interface | 31 | * Get a specific interface implementation from the interface |
| 46 | * implementation from a class. | 32 | * implementation from a class. |
| 47 | */ | 33 | */ |
| 48 | TR_iface_ptr | 34 | TR_iface_ptr |
| 49 | -TR_interfaceGet(TR_iface_impl_ptr iface_impl, const TR_iface_ptr _iface) | 35 | +TR_interfaceGet(TR_iface_impl_ptr iface_impl, const TR_iface_ptr iface) |
| 50 | { | 36 | { |
| 51 | - const TR_iface_ptr * iface = &_iface; | ||
| 52 | - TR_iface_ptr * found; | ||
| 53 | - | ||
| 54 | - if (! iface_impl->simpl) { | ||
| 55 | - qsort( | ||
| 56 | - (void**)(iface_impl->impl), | ||
| 57 | - iface_impl->nimpl, | ||
| 58 | - sizeof(TR_iface_ptr), comp); | ||
| 59 | - iface_impl->simpl=TRUE; | ||
| 60 | - } | 37 | + TR_iface_ptr found = (TR_iface_ptr)NULL; |
| 38 | + size_t i; | ||
| 61 | 39 | ||
| 62 | - found = bsearch( | ||
| 63 | - &iface, | ||
| 64 | - iface_impl->impl, | ||
| 65 | - iface_impl->nimpl, | ||
| 66 | - sizeof(TR_iface_ptr), | ||
| 67 | - comp); | 40 | + for (i = 0; i < iface_impl->nimpl; i++) { |
| 41 | + if (*(TR_iface_ptr *)(iface_impl->impl[i]) == iface) { | ||
| 42 | + found = iface_impl->impl[i]; | ||
| 43 | + break; | ||
| 44 | + } | ||
| 45 | + } | ||
| 68 | 46 | ||
| 69 | - return found? *found : (TR_iface_ptr)NULL; | 47 | + return found; |
| 70 | } | 48 | } |
| 71 | 49 | ||
| 72 | // vim: set ts=4 sw=4: | 50 | // vim: set ts=4 sw=4: |
Please
register
or
login
to post a comment