/* * Remove item "hi" from hashtable "ht". "hi" must have been obtained with * hash_lookup(). * The caller must take care of freeing the item itself. */ void hash_remove(hashtab_T *ht, hashitem_T *hi) { --ht->ht_used; hi->hi_key = HI_KEY_REMOVED; hash_may_resize(ht, 0); }
/// Add item "hi" with "key" to hashtable "ht". "key" must not be NULL and /// "hi" must have been obtained with hash_lookup() and point to an empty item. /// "hi" is invalid after this! /// /// @param ht /// @param hi /// @param key /// @param hash /// /// @returns OK or FAIL (out of memory). int hash_add_item(hashtab_T *ht, hashitem_T *hi, char_u *key, hash_T hash) { // If resizing failed before and it fails again we can't add an item. if (ht->ht_error && (hash_may_resize(ht, 0) == FAIL)) { return FAIL; } ht->ht_used++; if (hi->hi_key == NULL) { ht->ht_filled++; } hi->hi_key = key; hi->hi_hash = hash; // When the space gets low may resize the array. return hash_may_resize(ht, 0); }
/* * Add item "hi" with "key" to hashtable "ht". "key" must not be NULL and * "hi" must have been obtained with hash_lookup() and point to an empty item. * "hi" is invalid after this! * Returns OK or FAIL (out of memory). */ int hash_add_item( hashtab_T *ht, hashitem_T *hi, char_u *key, hash_T hash) { /* If resizing failed before and it fails again we can't add an item. */ if (ht->ht_error && hash_may_resize(ht, 0) == FAIL) return FAIL; ++ht->ht_used; if (hi->hi_key == NULL) ++ht->ht_filled; hi->hi_key = key; hi->hi_hash = hash; /* When the space gets low may resize the array. */ return hash_may_resize(ht, 0); }
/// Add item "hi" for key "key" to hashtable "ht". /// /// @param hi The hash item to be used. Must have been obtained through /// hash_lookup() and point to an empty item. /// @param key Pointer to the key for the new item. The key has to be contained /// in the new item (@see hashitem_T). Must not be NULL. /// @param hash The precomputed hash value for the key. void hash_add_item(hashtab_T *ht, hashitem_T *hi, char_u *key, hash_T hash) { ht->ht_used++; if (hi->hi_key == NULL) { ht->ht_filled++; } hi->hi_key = key; hi->hi_hash = hash; // When the space gets low may resize the array. hash_may_resize(ht, 0); }
/// Unlock hashtable (allow changes in ht_array again). /// /// Table will be resized (shrunk) when necessary. /// This must balance a call to hash_lock(). void hash_unlock(hashtab_T *ht) { ht->ht_locked--; hash_may_resize(ht, 0); }
/* * Unlock a hashtable: allow ht_array changes again. * Table will be resized (shrink) when necessary. * This must balance a call to hash_lock(). */ void hash_unlock(hashtab_T *ht) { --ht->ht_locked; (void)hash_may_resize(ht, 0); }
/* * Lock a hashtable at the specified number of entries. * Caller must make sure no more than "size" entries will be added. * Must call hash_unlock() later. */ void hash_lock_size(hashtab_T *ht, int size) { (void)hash_may_resize(ht, size); ++ht->ht_locked; }