Hi Jeff,
On Fri, Apr 6, 2018 at 1:04 PM, Jeff King <[email protected]> wrote:
> On Mon, Apr 02, 2018 at 03:48:50PM -0700, Stefan Beller wrote:
>
>> The diff options are passed to the compare function as
>> 'hashmap_cmp_fn_data', which are given when the hashmaps
>> are initialized.
>>
>> A later patch will make use of the keydata to signal
>> different settings for comparision.
>
> I had to scratch my head here for a moment. Don't we use those options
> as part of the comparison?
Yes we do, but not as passed in here.
Stepping back a bit: There are 2 void pointers passed to the cmp function:
typedef int (*hashmap_cmp_fn)(const void *hashmap_cmp_fn_data,
const void *entry, const void *entry_or_key,
const void *keydata);
The hashmap_cmp_fn_data is the same pointer as we pass as
the equals_function data in
extern void hashmap_init(struct hashmap *map,
hashmap_cmp_fn equals_function,
const void *equals_function_data,
size_t initial_size);
whereas the keydata is passed in either directly when calling cmp directly
or in hashmap_get_from_hash:
static inline void *hashmap_get_from_hash(const struct hashmap *map,
unsigned int hash,
const void *keydata)
{
struct hashmap_entry key;
hashmap_entry_init(&key, hash);
return hashmap_get(map, &key, keydata);
}
It turns out we are passing the struct diff_options *o into the cmp
function twice, once via the inits equals_function_data, as well as
keydata directly. Omit the direct pass in.
This is mostly a cleanup as of now, as it turns out I do not need to
reuse the keydata field anyway.
> I took the "which" to mean "the compare function", but I think you mean
> "we pass these diff options already when the hashmap is initialized".
Oh, yes.
> Maybe something like this would be more clear:
>
> When we initialize the hashmap, we give it a pointer to the
> diff_options, which it then passes along to each call of the
> hashmap_cmp_fn function. There's no need to pass it a second time as
> the "keydata" parameter, and our comparison functions never look at
> keydata.
>
Thanks for clearing this up, will take as-is.
> This was a mistake left over from an earlier round of 2e2d5ac184
> (diff.c: color moved lines differently, 2017-06-30), before hashmap
> learned to pass the data pointer for us.
That sounds about right.
>
> (I'm just guessing on the second paragraph based on a quick look at
> git-blame and my recollection from the time).
>
> -Peff
Thanks,
Stefan