pack-revindex: factor out `midx_key_to_pack_pos()` helper

The `midx_to_pack_pos()` function implements a binary search over
objects in the MIDX between lexical and pseudo-pack order. It does this
by taking in an index into the lexical order (i.e. the same argument
you'd use for `nth_midxed_object_id()` and similar) and spits out a
position in the pseudo-pack order.

This works for all callers, since they currently all are translating
from lexical order to pseudo-pack order. But future callers may want to
translate a known (offset, pack_id) tuple into an index into the
psuedo-pack order, without knowing where that (offset, pack_id) tuple
appears in lexical order.

Prepare for implementing a function that translates between a (offset,
pack_id) tuple into an index into the psuedo-pack order by extracting a
helper function which does just that, and then reimplementing
midx_to_pack_pos() in terms of it.

Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Taylor Blau 2023-12-14 17:24:28 -05:00 committed by Junio C Hamano
parent b1e3333068
commit e1bfe30c4d
1 changed files with 24 additions and 15 deletions

View File

@ -520,19 +520,12 @@ static int midx_pack_order_cmp(const void *va, const void *vb)
return 0; return 0;
} }


int midx_to_pack_pos(struct multi_pack_index *m, uint32_t at, uint32_t *pos) static int midx_key_to_pack_pos(struct multi_pack_index *m,
struct midx_pack_key *key,
uint32_t *pos)
{ {
struct midx_pack_key key;
uint32_t *found; uint32_t *found;


if (!m->revindex_data)
BUG("midx_to_pack_pos: reverse index not yet loaded");
if (m->num_objects <= at)
BUG("midx_to_pack_pos: out-of-bounds object at %"PRIu32, at);

key.pack = nth_midxed_pack_int_id(m, at);
key.offset = nth_midxed_offset(m, at);
key.midx = m;
/* /*
* The preferred pack sorts first, so determine its identifier by * The preferred pack sorts first, so determine its identifier by
* looking at the first object in pseudo-pack order. * looking at the first object in pseudo-pack order.
@ -542,16 +535,32 @@ int midx_to_pack_pos(struct multi_pack_index *m, uint32_t at, uint32_t *pos)
* implicitly is preferred (and includes all its objects, since ties are * implicitly is preferred (and includes all its objects, since ties are
* broken first by pack identifier). * broken first by pack identifier).
*/ */
if (midx_preferred_pack(key.midx, &key.preferred_pack) < 0) if (midx_preferred_pack(key->midx, &key->preferred_pack) < 0)
return error(_("could not determine preferred pack")); return error(_("could not determine preferred pack"));



found = bsearch(key, m->revindex_data, m->num_objects,
found = bsearch(&key, m->revindex_data, m->num_objects, sizeof(*m->revindex_data),
sizeof(*m->revindex_data), midx_pack_order_cmp); midx_pack_order_cmp);


if (!found) if (!found)
return error("bad offset for revindex"); return -1;


*pos = found - m->revindex_data; *pos = found - m->revindex_data;
return 0; return 0;
} }

int midx_to_pack_pos(struct multi_pack_index *m, uint32_t at, uint32_t *pos)
{
struct midx_pack_key key;

if (!m->revindex_data)
BUG("midx_to_pack_pos: reverse index not yet loaded");
if (m->num_objects <= at)
BUG("midx_to_pack_pos: out-of-bounds object at %"PRIu32, at);

key.pack = nth_midxed_pack_int_id(m, at);
key.offset = nth_midxed_offset(m, at);
key.midx = m;

return midx_key_to_pack_pos(m, &key, pos);
}