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


Reply via email to