diff options
Diffstat (limited to 'src/common/array.c')
-rw-r--r-- | src/common/array.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/src/common/array.c b/src/common/array.c index dcb9344..36c30a1 100644 --- a/src/common/array.c +++ b/src/common/array.c @@ -632,3 +632,69 @@ void *get_flat_array_item(flat_array_t *array, size_t index, size_t size) return result; } + + +/****************************************************************************** +* * +* Paramètres : array = tableau compressé à consulter. * +* size = taille de ce nouvel élément. * +* compar = méthode de comparaison entre éléments. * +* key = élément de comparaison fourni. * +* * +* Description : Recherche un élément dans un tableau trié. * +* * +* Retour : Eventuel élément trouvé ou NULL. * +* * +* Remarques : - * +* * +******************************************************************************/ + +void *find_item_in_flat_array(flat_array_t *array, size_t size, __compar_fn_t compar, const void *key) +{ + void *result; /* Trouvaille à retourner */ + size_t count; /* Nombre d'éléments présents */ + void *item; /* Elément isolé présent */ + ext_flat_array_t *extended; /* Version de tableau étendue */ + size_t index; /* Indice de l'élément trouvé */ + + assert(FLAT_ARRAY_IS_LOCKED(array)); + + count = count_flat_array_items(array); + + switch (count) + { + case 0: + result = NULL; + break; + + case 1: + + assert(FLAT_ARRAY_HAS_NO_INDEX(array)); + + item = GET_LONELY_ITEM(array); + + if (compar(key, item) == 0) + result = item; + else + result = NULL; + + break; + + default: + + assert(!FLAT_ARRAY_HAS_NO_INDEX(array)); + + extended = EXTENDED_ARRAY(array); + + if (bsearch_index(key, extended->items, extended->count, size, compar, &index)) + result = (void *)(((char *)extended->items) + index * size); + else + result = NULL; + + break; + + } + + return result; + +} |