Am So., 11. Okt. 2020 um 14:14 Uhr schrieb Bruno Haible <br...@clisp.org>:
[...] > > > > /* Return an independent copy of ITER that is initially in the same > > > > state. */ > > > > extern Hamt_iterator *hamt_iterator_copy (Hamt_iterator *iter); > > > > > > Then a copy function is not needed, because the user's program can do > > > > > > Hamt_iterator iter_clone = iter; > > > > The hamt itself has to be copied (to increase the reference counter). > > Whether copying an iterator can be done by assignment or requires a function > call, is of second importance. > > The more important point I wanted to make: Does allocating an iterator > require a (heap) memory allocation? > > If you iterate with do_while, no memory allocation is needed, because all > information is stored on the stack, between the various function calls. > > If you iterate with hamt_iterator_create, and the Hamt_iterator type > has bounded size (I guess it will not require more than 15 pointers and > 13 indices), it can be stored on the caller's stack. That's a very good point you make. The hamt iterator has, of course, (low) bounded size, so it can (and should) be allocated on the stack.