diffcore-rename.c: use new hash map implementation

Signed-off-by: Karsten Blees <blees@dcon.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Karsten Blees 2013-11-14 20:20:26 +01:00 committed by Junio C Hamano
parent 7c85f8acb2
commit f79d9c5814
1 changed files with 13 additions and 35 deletions

View File

@ -4,7 +4,7 @@
#include "cache.h" #include "cache.h"
#include "diff.h" #include "diff.h"
#include "diffcore.h" #include "diffcore.h"
#include "hash.h" #include "hashmap.h"
#include "progress.h" #include "progress.h"


/* Table of rename/copy destinations */ /* Table of rename/copy destinations */
@ -243,9 +243,9 @@ static int score_compare(const void *a_, const void *b_)
} }


struct file_similarity { struct file_similarity {
struct hashmap_entry entry;
int index; int index;
struct diff_filespec *filespec; struct diff_filespec *filespec;
struct file_similarity *next;
}; };


static unsigned int hash_filespec(struct diff_filespec *filespec) static unsigned int hash_filespec(struct diff_filespec *filespec)
@ -260,21 +260,22 @@ static unsigned int hash_filespec(struct diff_filespec *filespec)
return hash; return hash;
} }


static int find_identical_files(struct hash_table *srcs, static int find_identical_files(struct hashmap *srcs,
int dst_index, int dst_index,
struct diff_options *options) struct diff_options *options)
{ {
int renames = 0; int renames = 0;


struct diff_filespec *target = rename_dst[dst_index].two; struct diff_filespec *target = rename_dst[dst_index].two;
struct file_similarity *p, *best; struct file_similarity *p, *best, dst;
int i = 100, best_score = -1; int i = 100, best_score = -1;


/* /*
* Find the best source match for specified destination. * Find the best source match for specified destination.
*/ */
best = NULL; best = NULL;
for (p = lookup_hash(hash_filespec(target), srcs); p; p = p->next) { hashmap_entry_init(&dst, hash_filespec(target));
for (p = hashmap_get(srcs, &dst, NULL); p; p = hashmap_get_next(srcs, p)) {
int score; int score;
struct diff_filespec *source = p->filespec; struct diff_filespec *source = p->filespec;


@ -309,34 +310,15 @@ static int find_identical_files(struct hash_table *srcs,
return renames; return renames;
} }


static int free_similarity_list(void *p, void *unused) static void insert_file_table(struct hashmap *table, int index, struct diff_filespec *filespec)
{ {
while (p) {
struct file_similarity *entry = p;
p = entry->next;
free(entry);
}
return 0;
}

static void insert_file_table(struct hash_table *table, int index, struct diff_filespec *filespec)
{
void **pos;
unsigned int hash;
struct file_similarity *entry = xmalloc(sizeof(*entry)); struct file_similarity *entry = xmalloc(sizeof(*entry));


entry->index = index; entry->index = index;
entry->filespec = filespec; entry->filespec = filespec;
entry->next = NULL;


hash = hash_filespec(filespec); hashmap_entry_init(entry, hash_filespec(filespec));
pos = insert_hash(hash, entry, table); hashmap_add(table, entry);

/* We already had an entry there? */
if (pos) {
entry->next = *pos;
*pos = entry;
}
} }


/* /*
@ -349,11 +331,10 @@ static void insert_file_table(struct hash_table *table, int index, struct diff_f
static int find_exact_renames(struct diff_options *options) static int find_exact_renames(struct diff_options *options)
{ {
int i, renames = 0; int i, renames = 0;
struct hash_table file_table; struct hashmap file_table;


/* Add all sources to the hash table */ /* Add all sources to the hash table */
init_hash(&file_table); hashmap_init(&file_table, NULL, rename_src_nr);
preallocate_hash(&file_table, rename_src_nr);
for (i = 0; i < rename_src_nr; i++) for (i = 0; i < rename_src_nr; i++)
insert_file_table(&file_table, i, rename_src[i].p->one); insert_file_table(&file_table, i, rename_src[i].p->one);


@ -361,11 +342,8 @@ static int find_exact_renames(struct diff_options *options)
for (i = 0; i < rename_dst_nr; i++) for (i = 0; i < rename_dst_nr; i++)
renames += find_identical_files(&file_table, i, options); renames += find_identical_files(&file_table, i, options);


/* Free source file_similarity chains */ /* Free the hash data structure and entries */
for_each_hash(&file_table, free_similarity_list, options); hashmap_free(&file_table, 1);

/* .. and free the hash data structure */
free_hash(&file_table);


return renames; return renames;
} }