Commit 3f2bf4d659b33db9363d44f14d46154674d4049c

Carlos Martín Nieto 2012-01-19T19:06:15

hashtable: add remove2 to retrieve the value that was removed

diff --git a/src/hashtable.c b/src/hashtable.c
index f836f16..89c44ba 100644
--- a/src/hashtable.c
+++ b/src/hashtable.c
@@ -213,7 +213,7 @@ void *git_hashtable_lookup(git_hashtable *self, const void *key)
 	return NULL;
 }
 
-int git_hashtable_remove(git_hashtable *self, const void *key)
+int git_hashtable_remove2(git_hashtable *self, const void *key, void **old_value)
 {
 	int hash_id;
 	git_hashtable_node *node;
@@ -223,6 +223,7 @@ int git_hashtable_remove(git_hashtable *self, const void *key)
 	for (hash_id = 0; hash_id < GIT_HASHTABLE_HASHES; ++hash_id) {
 		node = node_with_hash(self, key, hash_id);
 		if (node->key && self->key_equal(key, node->key) == 0) {
+			*old_value = node->value;
 			node->key = NULL;
 			node->value = NULL;
 			self->key_count--;
diff --git a/src/hashtable.h b/src/hashtable.h
index 485b17a..cd458eb 100644
--- a/src/hashtable.h
+++ b/src/hashtable.h
@@ -42,7 +42,15 @@ git_hashtable *git_hashtable_alloc(size_t min_size,
 		git_hash_ptr hash,
 		git_hash_keyeq_ptr key_eq);
 void *git_hashtable_lookup(git_hashtable *h, const void *key);
-int git_hashtable_remove(git_hashtable *table, const void *key);
+int git_hashtable_remove2(git_hashtable *table, const void *key, void **old_value);
+
+GIT_INLINE(int) git_hashtable_remove(git_hashtable *table, const void *key)
+{
+	void *_unused;
+	return git_hashtable_remove2(table, key, &_unused);
+}
+
+
 void git_hashtable_free(git_hashtable *h);
 void git_hashtable_clear(git_hashtable *h);
 int git_hashtable_merge(git_hashtable *self, git_hashtable *other);