Commit c319edf54bd39e68b5dbb2d15f43aaa0aec61755

Authored by Georg Hopp
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
@@ -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