add RBT_SET_LEFT, RBT_SET_RIGHT, and RBT_SET_PARENT
authordlg <dlg@openbsd.org>
Thu, 8 Jun 2017 03:12:53 +0000 (03:12 +0000)
committerdlg <dlg@openbsd.org>
Thu, 8 Jun 2017 03:12:53 +0000 (03:12 +0000)
commitf13ac28347e28f5b6678e59b4e39da7d8daf3ad9
tree39b8012b23a685807d35d243fcda9fe6db658cef
parentbf196442864a64e91b876c13b5e53a2de7368c96
add RBT_SET_LEFT, RBT_SET_RIGHT, and RBT_SET_PARENT

this are provided so an RBT and it's topology can be copied without
having to reinsert the copied nodes into a new tree.

there are two reasons RBT_LEFT/RIGHT/PARENT macros cant be used like
RB_LEFT/RIGHT/PARENT for this. firstly, RBT_LEFT and co are functions that
return a pointer value, they dont provide access to the pointer
itself for use as an lvalue that you can assign to. secondly, RBT
entries dont store pointers to other nodes, they point to the
RBT_ENTRY structures inside other nodes. this means that RBT_SET_LEFT
and co have to get an offset from the node to the RBT_ENTRY and
store that.
share/man/man9/RBT_INIT.9
sys/kern/subr_tree.c
sys/sys/tree.h