diff options
| author | Vicent Marti <tanoku@gmail.com> | 2011-07-07 01:46:20 +0200 |
|---|---|---|
| committer | Vicent Marti <tanoku@gmail.com> | 2011-07-07 02:54:07 +0200 |
| commit | de18f276683a5cf3d85d001f6521e52c8c802e60 (patch) | |
| tree | 01db449c1fa2d11568aca66bf4a5ef9d1a5c60f3 /src/tree.c | |
| parent | c63aa494595a6d6e6d97cfa1bbc1741a0b2e0cc6 (diff) | |
| download | libgit2-de18f276683a5cf3d85d001f6521e52c8c802e60.tar.gz | |
vector: Timsort all of the things
Drop the GLibc implementation of Merge Sort and replace it with Timsort.
The algorithm has been tuned to work on arrays of pointers (void **),
so there's no longer a need to abstract the byte-width of each element
in the array.
All the comparison callbacks now take pointers-to-elements, not
pointers-to-pointers, so there's now one less level of dereferencing.
E.g.
int index_cmp(const void *a, const void *b)
{
- const git_index_entry *entry_a = *(const git_index_entry **)(a);
+ const git_index_entry *entry_a = (const git_index_entry *)(a);
The result is up to a 40% speed-up when sorting vectors. Memory usage
remains lineal.
A new `bsearch` implementation has been added, whose callback also
supplies pointer-to-elements, to uniform the Vector API again.
Diffstat (limited to 'src/tree.c')
| -rw-r--r-- | src/tree.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/src/tree.c b/src/tree.c index 51b19f535..fff5068f8 100644 --- a/src/tree.c +++ b/src/tree.c @@ -40,7 +40,7 @@ static int valid_attributes(const int attributes) { int entry_search_cmp(const void *key, const void *array_member) { const char *filename = (const char *)key; - const git_tree_entry *entry = *(const git_tree_entry **)(array_member); + const git_tree_entry *entry = (const git_tree_entry *)(array_member); return strcmp(filename, entry->filename); } @@ -53,8 +53,8 @@ static int valid_attributes(const int attributes) { int entry_sort_cmp(const void *a, const void *b) { - const git_tree_entry *entry_a = *(const git_tree_entry **)(a); - const git_tree_entry *entry_b = *(const git_tree_entry **)(b); + const git_tree_entry *entry_a = (const git_tree_entry *)(a); + const git_tree_entry *entry_b = (const git_tree_entry *)(b); return git_futils_cmp_path(entry_a->filename, strlen(entry_a->filename), entry_a->attr & 040000, |
