diff --git a/src/array.c b/src/array.c index 240ce26..0900467 100644 --- a/src/array.c +++ b/src/array.c @@ -612,11 +612,26 @@ enum cc_stat array_trim_capacity(Array *ar) * @return the number of occurrences of the element */ size_t array_contains(Array *ar, void *element) +{ + return array_contains_value(ar, element, cc_common_cmp_ptr); +} + +/** + * Returns the number of occurrences of the value pointed to by e + * within the specified Array. + * + * @param[in] ar Array that is being searched + * @param[in] element the element that is being searched for + * @param[in] cmp Comparator function which returns 0 if the values passed to it are equal + * + * @return the number of occurrences of the value + */ +size_t array_contains_value(Array *ar, void *e, int (*cmp) (const void*, const void*)) { size_t o = 0; size_t i; for (i = 0; i < ar->size; i++) { - if (element == ar->buffer[i]) + if (cmp(e, ar->buffer[i]) == 0) o++; } return o; diff --git a/src/array.h b/src/array.h index 1026581..d676b93 100644 --- a/src/array.h +++ b/src/array.h @@ -109,6 +109,7 @@ void array_reverse (Array *ar); enum cc_stat array_trim_capacity (Array *ar); size_t array_contains (Array *ar, void *element); +size_t array_contains_value (Array *ar, void *element, int (*cmp) (const void*, const void*)); size_t array_size (Array *ar); size_t array_capacity (Array *ar); diff --git a/src/deque.c b/src/deque.c index 7427947..bd3232c 100644 --- a/src/deque.c +++ b/src/deque.c @@ -699,21 +699,36 @@ void deque_reverse(Deque *deque) } /** - * Returns the number of occurrences of the element within the specified deque. + * Returns the number of occurrences of the element within the specified Deque. * - * @param[in] deque the deque that is being searched + * @param[in] deque Deque that is being searched * @param[in] element the element that is being searched for * * @return the number of occurrences of the element */ size_t deque_contains(Deque *deque, void *element) +{ + return deque_contains_value(deque, element, cc_common_cmp_ptr); +} + +/** + * Returns the number of occurrences of the value poined to by element + * within the deque. + * + * @param[in] deque Deque that is being searched + * @param[in] element the element that is being searched for + * @param[in] cmp Comparator function which returns 0 if the values passed to it are equal + * + * @return the number of occurrences of the element + */ +size_t deque_contains_value(Deque *deque, void *element, int (*cmp) (const void*, const void*)) { size_t i; size_t o = 0; for (i = 0; i < deque->size; i++) { size_t p = (deque->first + i) & (deque->capacity - 1); - if (deque->buffer[p] == element) + if (cmp(deque->buffer[p], element) == 0) o++; } return o; diff --git a/src/deque.h b/src/deque.h index c719eed..f0bc842 100644 --- a/src/deque.h +++ b/src/deque.h @@ -108,6 +108,7 @@ void deque_reverse (Deque *deque); enum cc_stat deque_trim_capacity (Deque *deque); size_t deque_contains (Deque *deque, void *element); +size_t deque_contains_value (Deque *deque, void *element, int (*cmp)(const void*, const void*)); size_t deque_size (Deque *deque); size_t deque_capacity (Deque *deque); diff --git a/src/list.c b/src/list.c index 8f82d04..fe14419 100644 --- a/src/list.c +++ b/src/list.c @@ -949,17 +949,32 @@ enum cc_stat list_to_array(List *list, void ***out) * element within the list. * * @param[in] list List on which the search is performed - * @param[in] element element being looked for + * @param[in] element element being seached for * * @return number of found matches */ size_t list_contains(List *list, void *element) { - Node *node = list->head; - size_t e_count = 0; + return list_contains_value(list, element, cc_common_cmp_ptr); +} + +/** + * Returns the number occurrences of the value pointed to by element + * within the List. + * + * @param[in] list List on which the search is performed + * @param[in] element element being searched for + * @param[in] cmp Comparator function which returns 0 if the values passed to it are equal + * + * @return number of found matches + */ +size_t list_contains_value(List *list, void *element, int (*cmp) (const void*, const void*)) +{ + Node *node = list->head; + size_t e_count = 0; while (node) { - if (node->data == element) + if (cmp(node->data, element) == 0) e_count++; node = node->next; } diff --git a/src/list.h b/src/list.h index 758dce5..6910935 100644 --- a/src/list.h +++ b/src/list.h @@ -128,6 +128,7 @@ enum cc_stat list_copy_deep (List *list, void *(*cp) (void*), List **out) enum cc_stat list_replace_at (List *list, void *element, size_t index, void **out); size_t list_contains (List *list, void *element); +size_t list_contains_value (List *list, void *element, int (*cmp) (const void*, const void*)); enum cc_stat list_index_of (List *list, void *element, size_t *index); enum cc_stat list_to_array (List *list, void ***out); diff --git a/src/slist.c b/src/slist.c index d46536b..c9f527d 100644 --- a/src/slist.c +++ b/src/slist.c @@ -903,12 +903,26 @@ enum cc_stat slist_copy_deep(SList *list, void *(*cp) (void*), SList **out) */ size_t slist_contains(SList *list, void *element) { - SNode *node = list->head; + return slist_contains_value(list, element, cc_common_cmp_ptr); +} +/** + * Returns the number of occurrences of the value pointed to by element + * within the specified SList. + * + * @param[in] list SList on which the search is performed + * @param[in] element element being searched for + * @param[in] cmp Comparator function which returns 0 if the values passed to it are equal + * + * @return number of occurrences of the value + */ +size_t slist_contains_value(SList *list, void *element, int (*cmp) (const void*, const void*)) +{ + SNode *node = list->head; size_t e_count = 0; while (node) { - if (node->data == element) + if (cmp(node->data, element) == 0) e_count++; node = node->next; } diff --git a/src/slist.h b/src/slist.h index f32a3fc..a3da44b 100644 --- a/src/slist.h +++ b/src/slist.h @@ -119,6 +119,7 @@ enum cc_stat slist_copy_deep (SList *list, void *(*cp) (void*), SList **o enum cc_stat slist_replace_at (SList *list, void *element, size_t index, void **out); size_t slist_contains (SList *list, void *element); +size_t slist_contains_value (SList *list, void *element, int (*cmp) (const void*, const void*)); enum cc_stat slist_index_of (SList *list, void *element, size_t *index); enum cc_stat slist_to_array (SList *list, void ***out);