wi_mutable_dictionary_t * wi_mutable_dictionary_with_data_and_keys(void *data0, void *key0, ...) { wi_dictionary_t *dictionary; void *data, *key; va_list ap; dictionary = wi_dictionary_init(wi_mutable_dictionary_alloc()); _wi_dictionary_set_data_for_key(dictionary, data0, key0); va_start(ap, key0); while((data = va_arg(ap, void *))) { key = va_arg(ap, void *); _wi_dictionary_set_data_for_key(dictionary, data, key); } va_end(ap); return wi_autorelease(dictionary); }
void wi_mutable_dictionary_add_entries_from_dictionary(wi_mutable_dictionary_t *dictionary, wi_dictionary_t *otherdictionary) { _wi_dictionary_bucket_t *bucket; wi_uinteger_t i; WI_RUNTIME_ASSERT_MUTABLE(dictionary); for(i = 0; i < otherdictionary->buckets_count; i++) { for(bucket = otherdictionary->buckets[i]; bucket; bucket = bucket->next) _wi_dictionary_set_data_for_key(dictionary, bucket->data, bucket->key); } }
static wi_runtime_instance_t * _wi_dictionary_copy(wi_runtime_instance_t *instance) { wi_dictionary_t *dictionary = instance, *dictionary_copy; _wi_dictionary_bucket_t *bucket; wi_uinteger_t i; dictionary_copy = wi_dictionary_init_with_capacity_and_callbacks(wi_dictionary_alloc(), dictionary->key_count, dictionary->key_callbacks, dictionary->value_callbacks); for(i = 0; i < dictionary->buckets_count; i++) { for(bucket = dictionary->buckets[i]; bucket; bucket = bucket->next) _wi_dictionary_set_data_for_key(dictionary_copy, bucket->data, bucket->key); } return dictionary_copy; }
wi_dictionary_t * wi_dictionary_init_with_data_and_keys(wi_dictionary_t *dictionary, ...) { void *data, *key; va_list ap; dictionary = wi_dictionary_init_with_capacity(dictionary, 0); va_start(ap, dictionary); while((data = va_arg(ap, void *))) { key = va_arg(ap, void *); _wi_dictionary_set_data_for_key(dictionary, data, key); } va_end(ap); return dictionary; }
void wi_mutable_dictionary_set_data_for_key(wi_mutable_dictionary_t *dictionary, void *data, void *key) { WI_RUNTIME_ASSERT_MUTABLE(dictionary); if(dictionary->value_callbacks.retain == wi_retain) { WI_ASSERT(data != NULL, "attempt to insert NULL data in %@", dictionary); } if(dictionary->key_callbacks.retain == wi_copy) { WI_ASSERT(key != NULL, "attempt to insert NULL key in %@", dictionary); } _wi_dictionary_set_data_for_key(dictionary, data, key); }
void wi_mutable_dictionary_set_data_for_key(wi_mutable_dictionary_t *dictionary, void *data, void *key) { WI_RUNTIME_ASSERT_MUTABLE(dictionary); _wi_dictionary_set_data_for_key(dictionary, data, key); }