Okay, if you find the latter protocol better anyway, I will switch to this protocol, and hamts will be stack-allocated (just two words) and passed by value.
Thanks, Marc Am So., 18. Okt. 2020 um 19:58 Uhr schrieb Bruno Haible <br...@clisp.org>: > > Marc Nieper-Wißkirchen wrote: > > The existing protocol is as follows: > > > > Hamt_entry *e = hamt_entry (...); > > Hamt_entry *p = e; > > Hamt *new_hamt = hamt_insert (old_hamt, &p); > > if (old_hamt == new_hamt) > > { > > /* The element hasn't been insert as an equivalent element has already > > been in the hamt. p now holds a reference to the entry that already existed > > in the hamt. > > element_free (e); > > ... > > hamt_free (old_hamt); /* We don't have to free new_hamt because no new > > hamt was created. */ > > } > > else > > { > > /* The element has been inserted. p hasn't changed. */ > > ... > > hamt_free (old_hamt); /* This frees all hamts */ > > hamt_free (new_hamt); /* and all elements inserted, including e. */ > > } > > > > A protocol where no pointer values need to be compared could use p to > > carry the information: > > > > Hamt_entry *e = hamt_entry (); > > Hamt_entry *p = e; > > Hamt new_hamt = hamt_insert (old_hamt, &p); > > if (p == e) > > { > > /* The element has been inserted. */ > > ... /* See above. */ > > } > > else if (p == NULL) > > { > > /* The element e already existed in the hamt. */ > > ... /* See above. */ > > } > > else /* p != e && p != NULL */ > > { > > /* An element equivalent to e already existed in the hamt. p now holds > > this element. */ > > ... /* See above. */ > > } > > I find the latter protocol more robust: it does not depend on details of > the implementation of hamt_insert. > > Can you decide on your original question (allow stack-allocated HAMTs)? > I don't feel I can help you decide this. > > Bruno >