mirror of
https://git.proxmox.com/git/libgit2
synced 2025-08-05 18:21:03 +00:00
vector: Teach git_vector_uniq() to free while deduplicating
This commit is contained in:
parent
c9ffa84bde
commit
191adce875
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user