add bsearch for arraystags/json-c-0.13-20171207
@@ -91,8 +91,14 @@ array_list_add(struct array_list *arr, void *data) | |||||
void | void | ||||
array_list_sort(struct array_list *arr, int(*sort_fn)(const void *, const void *)) | array_list_sort(struct array_list *arr, int(*sort_fn)(const void *, const void *)) | ||||
{ | { | ||||
qsort(arr->array, arr->length, sizeof(arr->array[0]), | |||||
(int (*)(const void *, const void *))sort_fn); | |||||
qsort(arr->array, arr->length, sizeof(arr->array[0]), sort_fn); | |||||
} | |||||
void* array_list_bsearch( const void **key, struct array_list *arr, | |||||
int (*sort_fn)(const void *, const void *) ) | |||||
{ | |||||
return bsearch( key, arr->array, arr->length, sizeof(arr->array[0]), | |||||
sort_fn ); | |||||
} | } | ||||
int | int | ||||
@@ -49,6 +49,11 @@ array_list_length(struct array_list *al); | |||||
extern void | extern void | ||||
array_list_sort(struct array_list *arr, int(*compar)(const void *, const void *)); | array_list_sort(struct array_list *arr, int(*compar)(const void *, const void *)); | ||||
extern void* array_list_bsearch( const void **key, | |||||
struct array_list *arr, | |||||
int (*sort_fn)(const void *, const void *) ); | |||||
#ifdef __cplusplus | #ifdef __cplusplus | ||||
} | } | ||||
#endif | #endif | ||||
@@ -889,6 +889,23 @@ void json_object_array_sort(struct json_object *jso, int(*sort_fn)(const void *, | |||||
array_list_sort(jso->o.c_array, sort_fn); | array_list_sort(jso->o.c_array, sort_fn); | ||||
} | } | ||||
struct json_object* json_object_array_bsearch( | |||||
const struct json_object *key, | |||||
const struct json_object *jso, | |||||
int (*sort_fn)(const void *, const void *) ) | |||||
{ | |||||
struct json_object **result; | |||||
result = (struct json_object **) array_list_bsearch( | |||||
(const void **) &key, jso->o.c_array, sort_fn ); | |||||
if ( result == NULL ) { | |||||
return NULL; | |||||
} else { | |||||
return *result; | |||||
} | |||||
} | |||||
int json_object_array_length(struct json_object *jso) | int json_object_array_length(struct json_object *jso) | ||||
{ | { | ||||
return array_list_length(jso->o.c_array); | return array_list_length(jso->o.c_array); | ||||
@@ -407,6 +407,25 @@ extern int json_object_array_length(struct json_object *obj); | |||||
*/ | */ | ||||
extern void json_object_array_sort(struct json_object *jso, int(*sort_fn)(const void *, const void *)); | extern void json_object_array_sort(struct json_object *jso, int(*sort_fn)(const void *, const void *)); | ||||
/** Binary search a sorted array for a specified key object. | |||||
* | |||||
* It depends on your compare function what's sufficient as a key. | |||||
* Usually you create some dummy object with the parameter compared in | |||||
* it, to identify the right item you're actually looking for. | |||||
* | |||||
* @see json_object_array_sort() for hints on the compare function. | |||||
* | |||||
* @param key a dummy json_object with the right key | |||||
* @param jso the array object we're searching | |||||
* @param sort_fn the sort/compare function | |||||
* | |||||
* @return the wanted json_object instance | |||||
*/ | |||||
extern struct json_object* json_object_array_bsearch( | |||||
const struct json_object *key, | |||||
const struct json_object *jso, | |||||
int (*sort_fn)(const void *, const void *) ); | |||||
/** Add an element to the end of a json_object of type json_type_array | /** Add an element to the end of a json_object of type json_type_array | ||||
* | * | ||||
* The reference count will *not* be incremented. This is to make adding | * The reference count will *not* be incremented. This is to make adding | ||||