pack-bitmap.c: use ewah_or_iterator for type bitmap iterators

Now that we have initialized arrays for each bitmap layer's type bitmaps
in the previous commit, adjust existing callers to use them in
preparation for multi-layered bitmaps.

Signed-off-by: Taylor Blau <me@ttaylorr.com>
Acked-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Taylor Blau
2025-03-20 13:57:05 -04:00
committed by Junio C Hamano
parent e07af41139
commit 5999b44fcb

View File

@@ -1629,25 +1629,29 @@ static void show_extended_objects(struct bitmap_index *bitmap_git,
} }
} }
static void init_type_iterator(struct ewah_iterator *it, static void init_type_iterator(struct ewah_or_iterator *it,
struct bitmap_index *bitmap_git, struct bitmap_index *bitmap_git,
enum object_type type) enum object_type type)
{ {
switch (type) { switch (type) {
case OBJ_COMMIT: case OBJ_COMMIT:
ewah_iterator_init(it, bitmap_git->commits); ewah_or_iterator_init(it, bitmap_git->commits_all,
bitmap_git->base_nr + 1);
break; break;
case OBJ_TREE: case OBJ_TREE:
ewah_iterator_init(it, bitmap_git->trees); ewah_or_iterator_init(it, bitmap_git->trees_all,
bitmap_git->base_nr + 1);
break; break;
case OBJ_BLOB: case OBJ_BLOB:
ewah_iterator_init(it, bitmap_git->blobs); ewah_or_iterator_init(it, bitmap_git->blobs_all,
bitmap_git->base_nr + 1);
break; break;
case OBJ_TAG: case OBJ_TAG:
ewah_iterator_init(it, bitmap_git->tags); ewah_or_iterator_init(it, bitmap_git->tags_all,
bitmap_git->base_nr + 1);
break; break;
default: default:
@@ -1664,7 +1668,7 @@ static void show_objects_for_type(
size_t i = 0; size_t i = 0;
uint32_t offset; uint32_t offset;
struct ewah_iterator it; struct ewah_or_iterator it;
eword_t filter; eword_t filter;
struct bitmap *objects = bitmap_git->result; struct bitmap *objects = bitmap_git->result;
@@ -1672,7 +1676,7 @@ static void show_objects_for_type(
init_type_iterator(&it, bitmap_git, object_type); init_type_iterator(&it, bitmap_git, object_type);
for (i = 0; i < objects->word_alloc && for (i = 0; i < objects->word_alloc &&
ewah_iterator_next(&filter, &it); i++) { ewah_or_iterator_next(&filter, &it); i++) {
eword_t word = objects->words[i] & filter; eword_t word = objects->words[i] & filter;
size_t pos = (i * BITS_IN_EWORD); size_t pos = (i * BITS_IN_EWORD);
@@ -1714,6 +1718,8 @@ static void show_objects_for_type(
show_reach(&oid, object_type, 0, hash, pack, ofs); show_reach(&oid, object_type, 0, hash, pack, ofs);
} }
} }
ewah_or_iterator_release(&it);
} }
static int in_bitmapped_pack(struct bitmap_index *bitmap_git, static int in_bitmapped_pack(struct bitmap_index *bitmap_git,
@@ -1765,7 +1771,7 @@ static void filter_bitmap_exclude_type(struct bitmap_index *bitmap_git,
{ {
struct eindex *eindex = &bitmap_git->ext_index; struct eindex *eindex = &bitmap_git->ext_index;
struct bitmap *tips; struct bitmap *tips;
struct ewah_iterator it; struct ewah_or_iterator it;
eword_t mask; eword_t mask;
uint32_t i; uint32_t i;
@@ -1782,7 +1788,7 @@ static void filter_bitmap_exclude_type(struct bitmap_index *bitmap_git,
* packfile. * packfile.
*/ */
for (i = 0, init_type_iterator(&it, bitmap_git, type); for (i = 0, init_type_iterator(&it, bitmap_git, type);
i < to_filter->word_alloc && ewah_iterator_next(&mask, &it); i < to_filter->word_alloc && ewah_or_iterator_next(&mask, &it);
i++) { i++) {
if (i < tips->word_alloc) if (i < tips->word_alloc)
mask &= ~tips->words[i]; mask &= ~tips->words[i];
@@ -1802,6 +1808,7 @@ static void filter_bitmap_exclude_type(struct bitmap_index *bitmap_git,
bitmap_unset(to_filter, pos); bitmap_unset(to_filter, pos);
} }
ewah_or_iterator_release(&it);
bitmap_free(tips); bitmap_free(tips);
} }
@@ -1862,14 +1869,14 @@ static void filter_bitmap_blob_limit(struct bitmap_index *bitmap_git,
{ {
struct eindex *eindex = &bitmap_git->ext_index; struct eindex *eindex = &bitmap_git->ext_index;
struct bitmap *tips; struct bitmap *tips;
struct ewah_iterator it; struct ewah_or_iterator it;
eword_t mask; eword_t mask;
uint32_t i; uint32_t i;
tips = find_tip_objects(bitmap_git, tip_objects, OBJ_BLOB); tips = find_tip_objects(bitmap_git, tip_objects, OBJ_BLOB);
for (i = 0, init_type_iterator(&it, bitmap_git, OBJ_BLOB); for (i = 0, init_type_iterator(&it, bitmap_git, OBJ_BLOB);
i < to_filter->word_alloc && ewah_iterator_next(&mask, &it); i < to_filter->word_alloc && ewah_or_iterator_next(&mask, &it);
i++) { i++) {
eword_t word = to_filter->words[i] & mask; eword_t word = to_filter->words[i] & mask;
unsigned offset; unsigned offset;
@@ -1897,6 +1904,7 @@ static void filter_bitmap_blob_limit(struct bitmap_index *bitmap_git,
bitmap_unset(to_filter, pos); bitmap_unset(to_filter, pos);
} }
ewah_or_iterator_release(&it);
bitmap_free(tips); bitmap_free(tips);
} }
@@ -2528,12 +2536,12 @@ static uint32_t count_object_type(struct bitmap_index *bitmap_git,
struct eindex *eindex = &bitmap_git->ext_index; struct eindex *eindex = &bitmap_git->ext_index;
uint32_t i = 0, count = 0; uint32_t i = 0, count = 0;
struct ewah_iterator it; struct ewah_or_iterator it;
eword_t filter; eword_t filter;
init_type_iterator(&it, bitmap_git, type); init_type_iterator(&it, bitmap_git, type);
while (i < objects->word_alloc && ewah_iterator_next(&filter, &it)) { while (i < objects->word_alloc && ewah_or_iterator_next(&filter, &it)) {
eword_t word = objects->words[i++] & filter; eword_t word = objects->words[i++] & filter;
count += ewah_bit_popcount64(word); count += ewah_bit_popcount64(word);
} }
@@ -2545,6 +2553,8 @@ static uint32_t count_object_type(struct bitmap_index *bitmap_git,
count++; count++;
} }
ewah_or_iterator_release(&it);
return count; return count;
} }
@@ -3077,13 +3087,13 @@ static off_t get_disk_usage_for_type(struct bitmap_index *bitmap_git,
{ {
struct bitmap *result = bitmap_git->result; struct bitmap *result = bitmap_git->result;
off_t total = 0; off_t total = 0;
struct ewah_iterator it; struct ewah_or_iterator it;
eword_t filter; eword_t filter;
size_t i; size_t i;
init_type_iterator(&it, bitmap_git, object_type); init_type_iterator(&it, bitmap_git, object_type);
for (i = 0; i < result->word_alloc && for (i = 0; i < result->word_alloc &&
ewah_iterator_next(&filter, &it); i++) { ewah_or_iterator_next(&filter, &it); i++) {
eword_t word = result->words[i] & filter; eword_t word = result->words[i] & filter;
size_t base = (i * BITS_IN_EWORD); size_t base = (i * BITS_IN_EWORD);
unsigned offset; unsigned offset;
@@ -3124,6 +3134,8 @@ static off_t get_disk_usage_for_type(struct bitmap_index *bitmap_git,
} }
} }
ewah_or_iterator_release(&it);
return total; return total;
} }