git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCHv2 1/2] hashmap.h: compare function has access to a data field

From
Junio C Hamano <gitster@pobox.com>
Date
Jun 30, 2017, 17:34 UTC
Message-ID
<xmqqlgo9s7li.fsf@gitster.mtv.corp.google.com>
In-Reply-To
<20170629235336.28460-2-sbeller@google.com>
Stefan Beller <sbeller@google.com> writes:
> When using the hashmap a common need is to have access to arbitrary data
> in the compare function. A couple of times we abuse the keydata field
> to pass in the data needed. This happens for example in patch-ids.c.

It is not "arbitrary data"; it is very important to streess that we are not just passing random crud, but adding a mechanism to tailor/curry the function in a way that is fixed throughout the lifetime of a hashmap.

Show 10 quoted lines
> diff --git a/hashmap.h b/hashmap.h
> index de6022a3a9..1c26bbad5b 100644
> --- a/hashmap.h
> +++ b/hashmap.h
> @@ -33,11 +33,12 @@ struct hashmap_entry {
>  };
>  
>  typedef int (*hashmap_cmp_fn)(const void *entry, const void *entry_or_key,
> -		const void *keydata);
> +		const void *keydata, const void *cbdata);

As I view the new "data" thing the C's (read: poor-man's) way to cutomize the function, I would have tweaked the function signature by giving the customization data at the front, i.e.

	fn(fndata, entry, entry_or_key, keydata);

That would hopefully make it more obvious that the new thing is pairs with fn, not with other arguments (and entry-or-key and keydata pairs, instead of three old arguments standing as equals).

As I think the way we wish to be able to express it in a better language would have been something like:

	(partial_apply(fn, fndata))(entry, entry_or_key, keydata)
that order would match what is going on better.
Previous: Stefan BellerNext: Stefan Beller
Message 13 of 26 in “Introduce data field in hashmap and migrate docs to header”
  1. 0/2 Introduce data field in hashmap and migrate docs to headerStefan Beller, Jun 29, 2017
  2. 1/2 hashmap.h: compare function has access to a data fieldStefan Beller, Jun 29, 2017
  3. Junio C HamanoJun 29, 2017
  4. Junio C HamanoJun 29, 2017
  5. Stefan BellerJun 29, 2017
  6. Junio C HamanoJun 30, 2017
  7. 2/2 hashmap: migrate documentation from Documentation/technical into headerStefan Beller, Jun 29, 2017
  8. Jeff HostetlerJun 29, 2017
  9. Jonathan NiederJun 29, 2017
  10. Stefan BellerJun 29, 2017
  11. 0/2 Introduce data field in hashmap and migrate docs to headerStefan Beller, Jun 29, 2017
  12. 1/2 hashmap.h: compare function has access to a data fieldStefan Beller, Jun 29, 2017
  13. Junio C HamanoJun 30, 2017
  14. Stefan BellerJun 30, 2017
  15. Junio C HamanoJun 30, 2017
  16. Stefan BellerJun 30, 2017
  17. Junio C HamanoJun 30, 2017
  18. Stefan BellerJun 30, 2017
  19. Junio C HamanoJun 30, 2017
  20. 2/2 hashmap: migrate documentation from Documentation/technical into headerStefan Beller, Jun 29, 2017
  21. 0/3 Introduce data field in hashmap and migrate docs to headerStefan Beller, Jun 30, 2017
  22. 1/3 hashmap.h: compare function has access to a data fieldStefan Beller, Jun 30, 2017
  23. 2/3 patch-ids.c: use hashmap correctlyStefan Beller, Jun 30, 2017
  24. Junio C HamanoJun 30, 2017
  25. Jeff KingJul 5, 2017
  26. 3/3 hashmap: migrate documentation from Documentation/technical into headerStefan Beller, Jun 30, 2017

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.