Skip to content

Commit 0bd4337

Browse files
committed
vector, pqueue: add git_vector_reverse and git_pqueue_reverse
This is a convenience function to reverse the contents of a vector and a pqueue in-place. The pqueue function is useful in the case where we're treating it as a LIFO queue.
1 parent 6708618 commit 0bd4337

File tree

4 files changed

+51
-0
lines changed

4 files changed

+51
-0
lines changed

src/pqueue.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ extern int git_pqueue_init(
3535
#define git_pqueue_clear git_vector_clear
3636
#define git_pqueue_size git_vector_length
3737
#define git_pqueue_get git_vector_get
38+
#define git_pqueue_reverse git_vector_reverse
3839

3940
/**
4041
* Insert a new item into the queue

src/vector.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,3 +401,19 @@ int git_vector_verify_sorted(const git_vector *v)
401401

402402
return 0;
403403
}
404+
405+
void git_vector_reverse(git_vector *v)
406+
{
407+
size_t a, b;
408+
409+
a = 0;
410+
b = v->length - 1;
411+
412+
while (a < b) {
413+
void *tmp = v->contents[a];
414+
v->contents[a] = v->contents[b];
415+
v->contents[b] = tmp;
416+
a++;
417+
b--;
418+
}
419+
}

src/vector.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,4 +118,9 @@ GIT_INLINE(void) git_vector_set_cmp(git_vector *v, git_vector_cmp cmp)
118118
/* Just use this in tests, not for realz. returns -1 if not sorted */
119119
int git_vector_verify_sorted(const git_vector *v);
120120

121+
/**
122+
* Reverse the vector in-place.
123+
*/
124+
void git_vector_reverse(git_vector *v);
125+
121126
#endif

tests/core/vector.c

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,3 +376,32 @@ void test_core_vector__grow_and_shrink(void)
376376

377377
git_vector_free(&x);
378378
}
379+
380+
void test_core_vector__reverse(void)
381+
{
382+
git_vector v = GIT_VECTOR_INIT;
383+
size_t i;
384+
385+
void *in1[] = {(void *) 0x0, (void *) 0x1, (void *) 0x2, (void *) 0x3};
386+
void *out1[] = {(void *) 0x3, (void *) 0x2, (void *) 0x1, (void *) 0x0};
387+
388+
void *in2[] = {(void *) 0x0, (void *) 0x1, (void *) 0x2, (void *) 0x3, (void *) 0x4};
389+
void *out2[] = {(void *) 0x4, (void *) 0x3, (void *) 0x2, (void *) 0x1, (void *) 0x0};
390+
391+
for (i = 0; i < 4; i++)
392+
cl_git_pass(git_vector_insert(&v, in1[i]));
393+
394+
git_vector_reverse(&v);
395+
396+
for (i = 0; i < 4; i++)
397+
cl_assert_equal_p(out1[i], git_vector_get(&v, i));
398+
399+
git_vector_clear(&v);
400+
for (i = 0; i < 5; i++)
401+
cl_git_pass(git_vector_insert(&v, in2[i]));
402+
403+
git_vector_reverse(&v);
404+
405+
for (i = 0; i < 5; i++)
406+
cl_assert_equal_p(out2[i], git_vector_get(&v, i));
407+
}

0 commit comments

Comments
 (0)