wi_array_t * wi_dictionary_keys_sorted_by_value(wi_dictionary_t *dictionary, wi_compare_func_t *compare) { wi_mutable_array_t *array, *buckets; _wi_dictionary_bucket_t *bucket; wi_array_callbacks_t callbacks; void **data; wi_uinteger_t i; if(dictionary->key_count == 0) return wi_autorelease(wi_array_init(wi_array_alloc())); callbacks.retain = NULL; callbacks.release = NULL; callbacks.is_equal = NULL; callbacks.description = NULL; buckets = wi_array_init_with_capacity_and_callbacks(wi_mutable_array_alloc(), dictionary->key_count, callbacks); for(i = 0; i < dictionary->buckets_count; i++) { for(bucket = dictionary->buckets[i]; bucket; bucket = bucket->next) wi_mutable_array_add_data(buckets, bucket); } data = wi_malloc(sizeof(void *) * dictionary->key_count); wi_array_get_data(buckets, data); #ifdef _WI_DICTIONARY_USE_QSORT_R qsort_r(data, dictionary->key_count, sizeof(void *), compare, _wi_dictionary_compare_buckets); #else wi_lock_lock(_wi_dictionary_sort_lock); _wi_dictionary_sort_function = compare; qsort(data, dictionary->key_count, sizeof(void *), _wi_dictionary_compare_buckets); wi_lock_unlock(_wi_dictionary_sort_lock); #endif callbacks.retain = dictionary->key_callbacks.retain; callbacks.release = dictionary->key_callbacks.release; callbacks.is_equal = dictionary->key_callbacks.is_equal; callbacks.description = dictionary->key_callbacks.description; array = wi_array_init_with_capacity_and_callbacks(wi_mutable_array_alloc(), dictionary->key_count, callbacks); for(i = 0; i < dictionary->key_count; i++) wi_mutable_array_add_data(array, ((_wi_dictionary_bucket_t *) data[i])->key); wi_free(data); wi_release(buckets); wi_runtime_make_immutable(array); return wi_autorelease(array); }
static wi_runtime_instance_t * _wi_array_copy(wi_runtime_instance_t *instance) { wi_array_t *array = instance, *array_copy; wi_uinteger_t i; array_copy = wi_array_init_with_capacity_and_callbacks(wi_array_alloc(), array->data_count, array->callbacks); for(i = 0; i < array->data_count; i++) wi_array_add_data(array_copy, array->items[i]->data); return array_copy; }
wi_array_t * wi_set_all_data(wi_set_t *set) { wi_array_t *array; _wi_set_bucket_t *bucket; wi_array_callbacks_t callbacks; wi_uinteger_t i; callbacks.retain = set->callbacks.retain; callbacks.release = set->callbacks.release; callbacks.is_equal = set->callbacks.is_equal; callbacks.description = set->callbacks.description; array = wi_array_init_with_capacity_and_callbacks(wi_array_alloc(), set->data_count, callbacks); for(i = 0; i < set->buckets_count; i++) { for(bucket = set->buckets[i]; bucket; bucket = bucket->next) wi_array_add_data(array, bucket->data); } return wi_autorelease(array); }
wi_array_t * wi_dictionary_all_values(wi_dictionary_t *dictionary) { wi_array_t *array; _wi_dictionary_bucket_t *bucket; wi_array_callbacks_t callbacks; wi_uinteger_t i; callbacks.retain = dictionary->value_callbacks.retain; callbacks.release = dictionary->value_callbacks.release; callbacks.is_equal = dictionary->value_callbacks.is_equal; callbacks.description = dictionary->value_callbacks.description; array = wi_array_init_with_capacity_and_callbacks(wi_mutable_array_alloc(), dictionary->key_count, callbacks); for(i = 0; i < dictionary->buckets_count; i++) { for(bucket = dictionary->buckets[i]; bucket; bucket = bucket->next) wi_mutable_array_add_data(array, bucket->data); } wi_runtime_make_immutable(array); return wi_autorelease(array); }
wi_array_t * wi_array_init_with_capacity(wi_array_t *array, wi_uinteger_t capacity) { return wi_array_init_with_capacity_and_callbacks(array, capacity, wi_array_default_callbacks); }