rbtree: implement rb_first(), rb_last() operations
commitc341ad7300afa3f71db5cd9813bbeebf32f9195b
authorH. Peter Anvin (Intel) <hpa@zytor.com>
Wed, 8 Jul 2020 15:56:03 +0000 (8 08:56 -0700)
committerH. Peter Anvin (Intel) <hpa@zytor.com>
Wed, 8 Jul 2020 16:01:34 +0000 (8 09:01 -0700)
tree2782b25d1c02108abba12904369a34d1f75357d6
parentf293842b8a5e85506d0e67e20cbe5b62b60e6e61
rbtree: implement rb_first(), rb_last() operations

Add operations to get the first and last entry in the tree,
respectively. Searching for 0 or ~UINT64_C(0) is not sufficient in the
presence of duplicated keys, and is more inefficient anyway.

rb_first() followed by rb_next() until NULL, or equivalently rb_last()
followed by rb_prev() until NULL, can be used to walk the tree in key
order (ascending or descending), including all duplicate key
entries.

Since this is a *threaded* tree now, this walk can safely free entires
as it goes along, as long as the whole tree is destroyed; once any one
entry has been freed, the tree is no longer valid for anything other
than proceeding with the same tree walk.

Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
include/rbtree.h
nasmlib/rbtree.c