Browse Source
This is a generally useful abstraction, so let's let others make use of it. The refactoring is more or less a straight copy; however, functions and struct members have had their names changed to match string_list, which is the most similar data structure. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
Jeff King
14 years ago
committed by
Junio C Hamano
4 changed files with 78 additions and 55 deletions
@ -0,0 +1,43 @@
@@ -0,0 +1,43 @@
|
||||
#include "cache.h" |
||||
#include "sha1-array.h" |
||||
#include "sha1-lookup.h" |
||||
|
||||
void sha1_array_append(struct sha1_array *array, const unsigned char *sha1) |
||||
{ |
||||
ALLOC_GROW(array->sha1, array->nr + 1, array->alloc); |
||||
hashcpy(array->sha1[array->nr++], sha1); |
||||
array->sorted = 0; |
||||
} |
||||
|
||||
static int void_hashcmp(const void *a, const void *b) |
||||
{ |
||||
return hashcmp(a, b); |
||||
} |
||||
|
||||
void sha1_array_sort(struct sha1_array *array) |
||||
{ |
||||
qsort(array->sha1, array->nr, sizeof(*array->sha1), void_hashcmp); |
||||
array->sorted = 1; |
||||
} |
||||
|
||||
static const unsigned char *sha1_access(size_t index, void *table) |
||||
{ |
||||
unsigned char (*array)[20] = table; |
||||
return array[index]; |
||||
} |
||||
|
||||
int sha1_array_lookup(struct sha1_array *array, const unsigned char *sha1) |
||||
{ |
||||
if (!array->sorted) |
||||
sha1_array_sort(array); |
||||
return sha1_pos(sha1, array->sha1, array->nr, sha1_access); |
||||
} |
||||
|
||||
void sha1_array_clear(struct sha1_array *array) |
||||
{ |
||||
free(array->sha1); |
||||
array->sha1 = NULL; |
||||
array->nr = 0; |
||||
array->alloc = 0; |
||||
array->sorted = 0; |
||||
} |
@ -0,0 +1,18 @@
@@ -0,0 +1,18 @@
|
||||
#ifndef SHA1_ARRAY_H |
||||
#define SHA1_ARRAY_H |
||||
|
||||
struct sha1_array { |
||||
unsigned char (*sha1)[20]; |
||||
int nr; |
||||
int alloc; |
||||
int sorted; |
||||
}; |
||||
|
||||
#define SHA1_ARRAY_INIT { NULL, 0, 0, 0 } |
||||
|
||||
void sha1_array_append(struct sha1_array *array, const unsigned char *sha1); |
||||
void sha1_array_sort(struct sha1_array *array); |
||||
int sha1_array_lookup(struct sha1_array *array, const unsigned char *sha1); |
||||
void sha1_array_clear(struct sha1_array *array); |
||||
|
||||
#endif /* SHA1_ARRAY_H */ |
Loading…
Reference in new issue