Commit 191adce8 by nulltoken

vector: Teach git_vector_uniq() to free while deduplicating

parent c9ffa84b
......@@ -82,7 +82,10 @@ GIT_INLINE(void *) git__realloc(void *ptr, size_t size)
return new_ptr;
}
#define git__free(ptr) free(ptr)
GIT_INLINE(void) git__free(void *ptr)
{
free(ptr);
}
#define STRCMP_CASESELECT(IGNORE_CASE, STR1, STR2) \
((IGNORE_CASE) ? strcasecmp((STR1), (STR2)) : strcmp((STR1), (STR2)))
......
......@@ -220,7 +220,7 @@ void git_vector_pop(git_vector *v)
v->length--;
}
void git_vector_uniq(git_vector *v)
void git_vector_uniq(git_vector *v, void (*git_free_cb)(void *))
{
git_vector_cmp cmp;
size_t i, j;
......@@ -232,9 +232,12 @@ void git_vector_uniq(git_vector *v)
cmp = v->_cmp ? v->_cmp : strict_comparison;
for (i = 0, j = 1 ; j < v->length; ++j)
if (!cmp(v->contents[i], v->contents[j]))
if (!cmp(v->contents[i], v->contents[j])) {
if (git_free_cb)
git_free_cb(v->contents[i]);
v->contents[i] = v->contents[j];
else
} else
v->contents[++i] = v->contents[j];
v->length -= j - i - 1;
......
......@@ -71,7 +71,7 @@ int git_vector_insert_sorted(git_vector *v, void *element,
int (*on_dup)(void **old, void *new));
int git_vector_remove(git_vector *v, size_t idx);
void git_vector_pop(git_vector *v);
void git_vector_uniq(git_vector *v);
void git_vector_uniq(git_vector *v, void (*git_free_cb)(void *));
void git_vector_remove_matching(
git_vector *v, int (*match)(const git_vector *v, size_t idx));
......
......@@ -54,7 +54,7 @@ void test_core_vector__2(void)
cl_git_pass(git_vector_insert(&x, ptrs[1]));
cl_assert(x.length == 5);
git_vector_uniq(&x);
git_vector_uniq(&x, NULL);
cl_assert(x.length == 2);
git_vector_free(&x);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment