string-list: replace negative index encoding with "exact_match" parameter
The "string_list_find_insert_index()" function is used to determine the correct insertion index for a new string within the string list. The function also doubles up to convey if the string is already existing in the list, this is done by returning a negative index "-1 -index". Users are expected to decode this information. This approach has several limitations: 1. It requires the callers to look into the detail of the function to understand how to decode the negative index encoding. 2. Using int for indices can cause overflow issues when dealing with large string lists. To address these limitations, change the function to return size_t for the index value and use a separate bool parameter to indicate whether the index refers to an existing entry or an insertion point. In some cases, the callers of "string_list_find_insert_index" only need the index position and don't care whether an exact match is found. However, "get_entry_index" currently requires a non-NULL "exact_match" parameter, forcing these callers to declare unnecessary variables. Let's allow callers to pass NULL for the "exact_match" parameter when they don't need this information, reducing unnecessary variable declarations in calling code. Signed-off-by: shejialuo <shejialuo@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>main
parent
03ef7762ea
commit
e8a32e766f
|
|
@ -221,7 +221,8 @@ static void find_unique_prefixes(struct prefix_item_list *list)
|
||||||
|
|
||||||
static ssize_t find_unique(const char *string, struct prefix_item_list *list)
|
static ssize_t find_unique(const char *string, struct prefix_item_list *list)
|
||||||
{
|
{
|
||||||
int index = string_list_find_insert_index(&list->sorted, string, 1);
|
bool exact_match;
|
||||||
|
int index = string_list_find_insert_index(&list->sorted, string, &exact_match);
|
||||||
struct string_list_item *item;
|
struct string_list_item *item;
|
||||||
|
|
||||||
if (list->items.nr != list->sorted.nr)
|
if (list->items.nr != list->sorted.nr)
|
||||||
|
|
@ -229,8 +230,8 @@ static ssize_t find_unique(const char *string, struct prefix_item_list *list)
|
||||||
" vs %"PRIuMAX")",
|
" vs %"PRIuMAX")",
|
||||||
(uintmax_t)list->items.nr, (uintmax_t)list->sorted.nr);
|
(uintmax_t)list->items.nr, (uintmax_t)list->sorted.nr);
|
||||||
|
|
||||||
if (index < 0)
|
if (exact_match)
|
||||||
item = list->sorted.items[-1 - index].util;
|
item = list->sorted.items[index].util;
|
||||||
else if (index > 0 &&
|
else if (index > 0 &&
|
||||||
starts_with(list->sorted.items[index - 1].string, string))
|
starts_with(list->sorted.items[index - 1].string, string))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
||||||
|
|
@ -243,10 +243,9 @@ void clear_mailmap(struct string_list *map)
|
||||||
static struct string_list_item *lookup_prefix(struct string_list *map,
|
static struct string_list_item *lookup_prefix(struct string_list *map,
|
||||||
const char *string, size_t len)
|
const char *string, size_t len)
|
||||||
{
|
{
|
||||||
int i = string_list_find_insert_index(map, string, 1);
|
bool exact_match;
|
||||||
if (i < 0) {
|
int i = string_list_find_insert_index(map, string, &exact_match);
|
||||||
/* exact match */
|
if (exact_match) {
|
||||||
i = -1 - i;
|
|
||||||
if (!string[len])
|
if (!string[len])
|
||||||
return &map->items[i];
|
return &map->items[i];
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
2
refs.c
2
refs.c
|
|
@ -1699,7 +1699,7 @@ const char *find_descendant_ref(const char *dirname,
|
||||||
* with dirname (remember, dirname includes the trailing
|
* with dirname (remember, dirname includes the trailing
|
||||||
* slash) and is not in skip, then we have a conflict.
|
* slash) and is not in skip, then we have a conflict.
|
||||||
*/
|
*/
|
||||||
for (pos = string_list_find_insert_index(extras, dirname, 0);
|
for (pos = string_list_find_insert_index(extras, dirname, NULL);
|
||||||
pos < extras->nr; pos++) {
|
pos < extras->nr; pos++) {
|
||||||
const char *extra_refname = extras->items[pos].string;
|
const char *extra_refname = extras->items[pos].string;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,12 +29,14 @@ static size_t get_entry_index(const struct string_list *list, const char *string
|
||||||
else if (compare > 0)
|
else if (compare > 0)
|
||||||
left = middle + 1;
|
left = middle + 1;
|
||||||
else {
|
else {
|
||||||
*exact_match = true;
|
if (exact_match)
|
||||||
|
*exact_match = true;
|
||||||
return middle;
|
return middle;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*exact_match = false;
|
if (exact_match)
|
||||||
|
*exact_match = false;
|
||||||
return right;
|
return right;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -90,13 +92,9 @@ bool string_list_has_string(const struct string_list *list, const char *string)
|
||||||
}
|
}
|
||||||
|
|
||||||
int string_list_find_insert_index(const struct string_list *list, const char *string,
|
int string_list_find_insert_index(const struct string_list *list, const char *string,
|
||||||
int negative_existing_index)
|
bool *exact_match)
|
||||||
{
|
{
|
||||||
bool exact_match;
|
return get_entry_index(list, string, exact_match);
|
||||||
int index = get_entry_index(list, string, &exact_match);
|
|
||||||
if (exact_match)
|
|
||||||
index = -1 - (negative_existing_index ? index : 0);
|
|
||||||
return index;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct string_list_item *string_list_lookup(struct string_list *list, const char *string)
|
struct string_list_item *string_list_lookup(struct string_list *list, const char *string)
|
||||||
|
|
|
||||||
|
|
@ -174,7 +174,7 @@ void string_list_remove_empty_items(struct string_list *list, int free_util);
|
||||||
/** Determine if the string_list has a given string or not. */
|
/** Determine if the string_list has a given string or not. */
|
||||||
bool string_list_has_string(const struct string_list *list, const char *string);
|
bool string_list_has_string(const struct string_list *list, const char *string);
|
||||||
int string_list_find_insert_index(const struct string_list *list, const char *string,
|
int string_list_find_insert_index(const struct string_list *list, const char *string,
|
||||||
int negative_existing_index);
|
bool *exact_match);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Insert a new element to the string_list. The returned pointer can
|
* Insert a new element to the string_list. The returned pointer can
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue