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