1fad4b12bSEdward Tomasz Napierala.\" $OpenBSD: tree.3,v 1.7 2002/06/12 01:09:20 provos Exp $ 2fad4b12bSEdward Tomasz Napierala.\" 3fad4b12bSEdward Tomasz Napierala.\" Copyright 2002 Niels Provos <provos@citi.umich.edu> 4fad4b12bSEdward Tomasz Napierala.\" All rights reserved. 5fad4b12bSEdward Tomasz Napierala.\" 6fad4b12bSEdward Tomasz Napierala.\" Redistribution and use in source and binary forms, with or without 7fad4b12bSEdward Tomasz Napierala.\" modification, are permitted provided that the following conditions 8fad4b12bSEdward Tomasz Napierala.\" are met: 9fad4b12bSEdward Tomasz Napierala.\" 1. Redistributions of source code must retain the above copyright 10fad4b12bSEdward Tomasz Napierala.\" notice, this list of conditions and the following disclaimer. 11fad4b12bSEdward Tomasz Napierala.\" 2. Redistributions in binary form must reproduce the above copyright 12fad4b12bSEdward Tomasz Napierala.\" notice, this list of conditions and the following disclaimer in the 13fad4b12bSEdward Tomasz Napierala.\" documentation and/or other materials provided with the distribution. 14fad4b12bSEdward Tomasz Napierala.\" 3. All advertising materials mentioning features or use of this software 15fad4b12bSEdward Tomasz Napierala.\" must display the following acknowledgement: 16fad4b12bSEdward Tomasz Napierala.\" This product includes software developed by Niels Provos. 17fad4b12bSEdward Tomasz Napierala.\" 4. The name of the author may not be used to endorse or promote products 18fad4b12bSEdward Tomasz Napierala.\" derived from this software without specific prior written permission. 19fad4b12bSEdward Tomasz Napierala.\" 20fad4b12bSEdward Tomasz Napierala.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 21fad4b12bSEdward Tomasz Napierala.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 22fad4b12bSEdward Tomasz Napierala.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 23fad4b12bSEdward Tomasz Napierala.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 24fad4b12bSEdward Tomasz Napierala.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 25fad4b12bSEdward Tomasz Napierala.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26fad4b12bSEdward Tomasz Napierala.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27fad4b12bSEdward Tomasz Napierala.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28fad4b12bSEdward Tomasz Napierala.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 29fad4b12bSEdward Tomasz Napierala.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30fad4b12bSEdward Tomasz Napierala.\" 31fad4b12bSEdward Tomasz Napierala.\" $FreeBSD$ 32fad4b12bSEdward Tomasz Napierala.\" 33*1a13f2e6SEdward Tomasz Napierala.Dd October 2, 2019 34fad4b12bSEdward Tomasz Napierala.Dt ARB 3 35fad4b12bSEdward Tomasz Napierala.Os 36fad4b12bSEdward Tomasz Napierala.Sh NAME 37fad4b12bSEdward Tomasz Napierala.Nm ARB_PROTOTYPE , 38fad4b12bSEdward Tomasz Napierala.Nm ARB_PROTOTYPE_STATIC , 39fad4b12bSEdward Tomasz Napierala.Nm ARB_PROTOTYPE_INSERT , 40fad4b12bSEdward Tomasz Napierala.Nm ARB_PROTOTYPE_INSERT_COLOR , 41fad4b12bSEdward Tomasz Napierala.Nm ARB_PROTOTYPE_REMOVE , 42fad4b12bSEdward Tomasz Napierala.Nm ARB_PROTOTYPE_REMOVE_COLOR , 43fad4b12bSEdward Tomasz Napierala.Nm ARB_PROTOTYPE_FIND , 44fad4b12bSEdward Tomasz Napierala.Nm ARB_PROTOTYPE_NFIND , 45fad4b12bSEdward Tomasz Napierala.Nm ARB_PROTOTYPE_NEXT , 46fad4b12bSEdward Tomasz Napierala.Nm ARB_PROTOTYPE_PREV , 47fad4b12bSEdward Tomasz Napierala.Nm ARB_PROTOTYPE_MINMAX , 48a5adff0eSEdward Tomasz Napierala.Nm ARB_PROTOTYPE_REINSERT , 49fad4b12bSEdward Tomasz Napierala.Nm ARB_GENERATE , 50fad4b12bSEdward Tomasz Napierala.Nm ARB_GENERATE_STATIC , 51fad4b12bSEdward Tomasz Napierala.Nm ARB_GENERATE_INSERT , 52fad4b12bSEdward Tomasz Napierala.Nm ARB_GENERATE_INSERT_COLOR , 53fad4b12bSEdward Tomasz Napierala.Nm ARB_GENERATE_REMOVE , 54fad4b12bSEdward Tomasz Napierala.Nm ARB_GENERATE_REMOVE_COLOR , 55fad4b12bSEdward Tomasz Napierala.Nm ARB_GENERATE_FIND , 56fad4b12bSEdward Tomasz Napierala.Nm ARB_GENERATE_NFIND , 57fad4b12bSEdward Tomasz Napierala.Nm ARB_GENERATE_NEXT , 58fad4b12bSEdward Tomasz Napierala.Nm ARB_GENERATE_PREV , 59fad4b12bSEdward Tomasz Napierala.Nm ARB_GENERATE_MINMAX , 60a5adff0eSEdward Tomasz Napierala.Nm ARB_GENERATE_REINSERT , 61fad4b12bSEdward Tomasz Napierala.Nm ARB8_ENTRY , 62fad4b12bSEdward Tomasz Napierala.Nm ARB16_ENTRY , 63fad4b12bSEdward Tomasz Napierala.Nm ARB32_ENTRY , 64fad4b12bSEdward Tomasz Napierala.Nm ARB8_HEAD , 65fad4b12bSEdward Tomasz Napierala.Nm ARB16_HEAD , 66fad4b12bSEdward Tomasz Napierala.Nm ARB32_HEAD , 67fad4b12bSEdward Tomasz Napierala.Nm ARB_ALLOCSIZE , 68fad4b12bSEdward Tomasz Napierala.Nm ARB_INITIALIZER , 69fad4b12bSEdward Tomasz Napierala.Nm ARB_ROOT , 70fad4b12bSEdward Tomasz Napierala.Nm ARB_EMPTY , 71fad4b12bSEdward Tomasz Napierala.Nm ARB_FULL , 72fad4b12bSEdward Tomasz Napierala.Nm ARB_CURNODES , 73fad4b12bSEdward Tomasz Napierala.Nm ARB_MAXNODES , 74fad4b12bSEdward Tomasz Napierala.Nm ARB_NEXT , 75fad4b12bSEdward Tomasz Napierala.Nm ARB_PREV , 76fad4b12bSEdward Tomasz Napierala.Nm ARB_MIN , 77fad4b12bSEdward Tomasz Napierala.Nm ARB_MAX , 78fad4b12bSEdward Tomasz Napierala.Nm ARB_FIND , 79fad4b12bSEdward Tomasz Napierala.Nm ARB_NFIND , 80fad4b12bSEdward Tomasz Napierala.Nm ARB_LEFT , 81fad4b12bSEdward Tomasz Napierala.Nm ARB_LEFTIDX , 82fad4b12bSEdward Tomasz Napierala.Nm ARB_RIGHT , 83fad4b12bSEdward Tomasz Napierala.Nm ARB_RIGHTIDX , 84fad4b12bSEdward Tomasz Napierala.Nm ARB_PARENT , 85fad4b12bSEdward Tomasz Napierala.Nm ARB_PARENTIDX , 86fad4b12bSEdward Tomasz Napierala.Nm ARB_GETFREE , 87fad4b12bSEdward Tomasz Napierala.Nm ARB_FREEIDX , 88fad4b12bSEdward Tomasz Napierala.Nm ARB_FOREACH , 89fad4b12bSEdward Tomasz Napierala.Nm ARB_FOREACH_FROM , 90fad4b12bSEdward Tomasz Napierala.Nm ARB_FOREACH_SAFE , 91fad4b12bSEdward Tomasz Napierala.Nm ARB_FOREACH_REVERSE , 92fad4b12bSEdward Tomasz Napierala.Nm ARB_FOREACH_REVERSE_FROM , 93fad4b12bSEdward Tomasz Napierala.Nm ARB_FOREACH_REVERSE_SAFE , 94fad4b12bSEdward Tomasz Napierala.Nm ARB_INIT , 95fad4b12bSEdward Tomasz Napierala.Nm ARB_INSERT , 96a5adff0eSEdward Tomasz Napierala.Nm ARB_REMOVE , 97*1a13f2e6SEdward Tomasz Napierala.Nm ARB_REINSERT , 98*1a13f2e6SEdward Tomasz Napierala.Nm ARB_RESET_TREE 99fad4b12bSEdward Tomasz Napierala.Nd "array-based red-black trees" 100fad4b12bSEdward Tomasz Napierala.Sh SYNOPSIS 101fad4b12bSEdward Tomasz Napierala.In sys/arb.h 102fad4b12bSEdward Tomasz Napierala.Fn ARB_PROTOTYPE NAME TYPE FIELD CMP 103fad4b12bSEdward Tomasz Napierala.Fn ARB_PROTOTYPE_STATIC NAME TYPE FIELD CMP 104fad4b12bSEdward Tomasz Napierala.Fn ARB_PROTOTYPE_INSERT NAME TYPE ATTR 105fad4b12bSEdward Tomasz Napierala.Fn ARB_PROTOTYPE_INSERT_COLOR NAME TYPE ATTR 106fad4b12bSEdward Tomasz Napierala.Fn ARB_PROTOTYPE_REMOVE NAME TYPE ATTR 107fad4b12bSEdward Tomasz Napierala.Fn ARB_PROTOTYPE_REMOVE_COLOR NAME TYPE ATTR 108fad4b12bSEdward Tomasz Napierala.Fn ARB_PROTOTYPE_FIND NAME TYPE ATTR 109fad4b12bSEdward Tomasz Napierala.Fn ARB_PROTOTYPE_NFIND NAME TYPE ATTR 110fad4b12bSEdward Tomasz Napierala.Fn ARB_PROTOTYPE_NEXT NAME TYPE ATTR 111fad4b12bSEdward Tomasz Napierala.Fn ARB_PROTOTYPE_PREV NAME TYPE ATTR 112fad4b12bSEdward Tomasz Napierala.Fn ARB_PROTOTYPE_MINMAX NAME TYPE ATTR 113a5adff0eSEdward Tomasz Napierala.Fn ARB_PROTOTYPE_REINSERT NAME TYPE ATTR 114fad4b12bSEdward Tomasz Napierala.Fn ARB_GENERATE NAME TYPE FIELD CMP 115fad4b12bSEdward Tomasz Napierala.Fn ARB_GENERATE_STATIC NAME TYPE FIELD CMP 116fad4b12bSEdward Tomasz Napierala.Fn ARB_GENERATE_INSERT NAME TYPE FIELD CMP ATTR 117fad4b12bSEdward Tomasz Napierala.Fn ARB_GENERATE_INSERT_COLOR NAME TYPE FIELD ATTR 118fad4b12bSEdward Tomasz Napierala.Fn ARB_GENERATE_REMOVE NAME TYPE FIELD ATTR 119fad4b12bSEdward Tomasz Napierala.Fn ARB_GENERATE_REMOVE_COLOR NAME TYPE FIELD ATTR 120fad4b12bSEdward Tomasz Napierala.Fn ARB_GENERATE_FIND NAME TYPE FIELD CMP ATTR 121fad4b12bSEdward Tomasz Napierala.Fn ARB_GENERATE_NFIND NAME TYPE FIELD CMP ATTR 122fad4b12bSEdward Tomasz Napierala.Fn ARB_GENERATE_NEXT NAME TYPE FIELD ATTR 123fad4b12bSEdward Tomasz Napierala.Fn ARB_GENERATE_PREV NAME TYPE FIELD ATTR 124fad4b12bSEdward Tomasz Napierala.Fn ARB_GENERATE_MINMAX NAME TYPE FIELD ATTR 125a5adff0eSEdward Tomasz Napierala.Fn ARB_GENERATE_REINSERT NAME TYPE FIELD CMP ATTR 126fad4b12bSEdward Tomasz Napierala.Fn ARB<8|16|32>_ENTRY 127fad4b12bSEdward Tomasz Napierala.Fn ARB<8|16|32>_HEAD HEADNAME TYPE 128fad4b12bSEdward Tomasz Napierala.Ft "size_t" 129fad4b12bSEdward Tomasz Napierala.Fn ARB_ALLOCSIZE "ARB_HEAD *head" "int<8|16|32>_t maxnodes" "struct TYPE *elm" 130fad4b12bSEdward Tomasz Napierala.Fn ARB_INITIALIZER "ARB_HEAD *head" "int<8|16|32>_t maxnodes" 131fad4b12bSEdward Tomasz Napierala.Ft "struct TYPE *" 132fad4b12bSEdward Tomasz Napierala.Fn ARB_ROOT "ARB_HEAD *head" 133fad4b12bSEdward Tomasz Napierala.Ft "bool" 134fad4b12bSEdward Tomasz Napierala.Fn ARB_EMPTY "ARB_HEAD *head" 135fad4b12bSEdward Tomasz Napierala.Ft "bool" 136fad4b12bSEdward Tomasz Napierala.Fn ARB_FULL "ARB_HEAD *head" 137fad4b12bSEdward Tomasz Napierala.Ft "int<8|16|32>_t" 138fad4b12bSEdward Tomasz Napierala.Fn ARB_CURNODES "ARB_HEAD *head" 139fad4b12bSEdward Tomasz Napierala.Ft "int<8|16|32>_t" 140fad4b12bSEdward Tomasz Napierala.Fn ARB_MAXNODES "ARB_HEAD *head" 141fad4b12bSEdward Tomasz Napierala.Ft "struct TYPE *" 142fad4b12bSEdward Tomasz Napierala.Fn ARB_NEXT NAME "ARB_HEAD *head" "struct TYPE *elm" 143fad4b12bSEdward Tomasz Napierala.Ft "struct TYPE *" 144fad4b12bSEdward Tomasz Napierala.Fn ARB_PREV NAME "ARB_HEAD *head" "struct TYPE *elm" 145fad4b12bSEdward Tomasz Napierala.Ft "struct TYPE *" 146fad4b12bSEdward Tomasz Napierala.Fn ARB_MIN NAME "ARB_HEAD *head" 147fad4b12bSEdward Tomasz Napierala.Ft "struct TYPE *" 148fad4b12bSEdward Tomasz Napierala.Fn ARB_MAX NAME "ARB_HEAD *head" 149fad4b12bSEdward Tomasz Napierala.Ft "struct TYPE *" 150fad4b12bSEdward Tomasz Napierala.Fn ARB_FIND NAME "ARB_HEAD *head" "struct TYPE *elm" 151fad4b12bSEdward Tomasz Napierala.Ft "struct TYPE *" 152fad4b12bSEdward Tomasz Napierala.Fn ARB_NFIND NAME "ARB_HEAD *head" "struct TYPE *elm" 153fad4b12bSEdward Tomasz Napierala.Ft "struct TYPE *" 154fad4b12bSEdward Tomasz Napierala.Fn ARB_LEFT "struct TYPE *elm" "ARB_ENTRY NAME" 155fad4b12bSEdward Tomasz Napierala.Ft "int<8|16|32>_t" 156fad4b12bSEdward Tomasz Napierala.Fn ARB_LEFTIDX "struct TYPE *elm" "ARB_ENTRY NAME" 157fad4b12bSEdward Tomasz Napierala.Ft "struct TYPE *" 158fad4b12bSEdward Tomasz Napierala.Fn ARB_RIGHT "struct TYPE *elm" "ARB_ENTRY NAME" 159fad4b12bSEdward Tomasz Napierala.Ft "int<8|16|32>_t" 160fad4b12bSEdward Tomasz Napierala.Fn ARB_RIGHTIDX "struct TYPE *elm" "ARB_ENTRY NAME" 161fad4b12bSEdward Tomasz Napierala.Ft "struct TYPE *" 162fad4b12bSEdward Tomasz Napierala.Fn ARB_PARENT "struct TYPE *elm" "ARB_ENTRY NAME" 163fad4b12bSEdward Tomasz Napierala.Ft "int<8|16|32>_t" 164fad4b12bSEdward Tomasz Napierala.Fn ARB_PARENTIDX "struct TYPE *elm" "ARB_ENTRY NAME" 165fad4b12bSEdward Tomasz Napierala.Ft "struct TYPE *" 166fad4b12bSEdward Tomasz Napierala.Fn ARB_GETFREE "ARB_HEAD *head" "FIELD" 167fad4b12bSEdward Tomasz Napierala.Ft "int<8|16|32>_t" 168fad4b12bSEdward Tomasz Napierala.Fn ARB_FREEIDX "ARB_HEAD *head" 169fad4b12bSEdward Tomasz Napierala.Fn ARB_FOREACH VARNAME NAME "ARB_HEAD *head" 170fad4b12bSEdward Tomasz Napierala.Fn ARB_FOREACH_FROM "VARNAME" "NAME" "POS_VARNAME" 171fad4b12bSEdward Tomasz Napierala.Fn ARB_FOREACH_SAFE "VARNAME" "NAME" "ARB_HEAD *head" "TEMP_VARNAME" 172fad4b12bSEdward Tomasz Napierala.Fn ARB_FOREACH_REVERSE VARNAME NAME "ARB_HEAD *head" 173fad4b12bSEdward Tomasz Napierala.Fn ARB_FOREACH_REVERSE_FROM "VARNAME" "NAME" "POS_VARNAME" 174fad4b12bSEdward Tomasz Napierala.Fn ARB_FOREACH_REVERSE_SAFE "VARNAME" "NAME" "ARB_HEAD *head" "TEMP_VARNAME" 175fad4b12bSEdward Tomasz Napierala.Ft void 176fad4b12bSEdward Tomasz Napierala.Fn ARB_INIT "struct TYPE *elm" "FIELD" "ARB_HEAD *head" "int<8|16|32>_t maxnodes" 177fad4b12bSEdward Tomasz Napierala.Ft "struct TYPE *" 178fad4b12bSEdward Tomasz Napierala.Fn ARB_INSERT NAME "ARB_HEAD *head" "struct TYPE *elm" 179fad4b12bSEdward Tomasz Napierala.Ft "struct TYPE *" 180fad4b12bSEdward Tomasz Napierala.Fn ARB_REMOVE NAME "ARB_HEAD *head" "struct TYPE *elm" 181a5adff0eSEdward Tomasz Napierala.Ft "struct TYPE *" 182a5adff0eSEdward Tomasz Napierala.Fn ARB_REINSERT NAME "ARB_HEAD *head" "struct TYPE *elm" 183*1a13f2e6SEdward Tomasz Napierala.Ft void 184*1a13f2e6SEdward Tomasz Napierala.Fn ARB_RESET_TREE "ARB_HEAD *head" NAME "int<8|16|32>_t maxnodes" 185fad4b12bSEdward Tomasz Napierala.Sh DESCRIPTION 186fad4b12bSEdward Tomasz NapieralaThese macros define data structures for and array-based red-black trees. 187fad4b12bSEdward Tomasz NapieralaThey use a single, continuous chunk of memory, and are useful 188fad4b12bSEdward Tomasz Napieralae.g., when the tree needs to be transferred between userspace and kernel. 189fad4b12bSEdward Tomasz Napierala.Pp 190fad4b12bSEdward Tomasz NapieralaIn the macro definitions, 191fad4b12bSEdward Tomasz Napierala.Fa TYPE 192fad4b12bSEdward Tomasz Napieralais the name tag of a user defined structure that must contain a field of type 193fad4b12bSEdward Tomasz Napierala.Vt ARB_ENTRY , 194fad4b12bSEdward Tomasz Napieralanamed 195fad4b12bSEdward Tomasz Napierala.Fa ENTRYNAME . 196fad4b12bSEdward Tomasz NapieralaThe argument 197fad4b12bSEdward Tomasz Napierala.Fa HEADNAME 198fad4b12bSEdward Tomasz Napieralais the name tag of a user defined structure that must be declared 199fad4b12bSEdward Tomasz Napieralausing the 200fad4b12bSEdward Tomasz Napierala.Fn ARB_HEAD 201fad4b12bSEdward Tomasz Napieralamacro. 202fad4b12bSEdward Tomasz NapieralaThe argument 203fad4b12bSEdward Tomasz Napierala.Fa NAME 204fad4b12bSEdward Tomasz Napieralahas to be a unique name prefix for every tree that is defined. 205fad4b12bSEdward Tomasz Napierala.Pp 206fad4b12bSEdward Tomasz NapieralaThe function prototypes are declared with 207fad4b12bSEdward Tomasz Napierala.Fn ARB_PROTOTYPE , 208fad4b12bSEdward Tomasz Napieralaor 209fad4b12bSEdward Tomasz Napierala.Fn ARB_PROTOTYPE_STATIC . 210fad4b12bSEdward Tomasz NapieralaThe function bodies are generated with 211fad4b12bSEdward Tomasz Napierala.Fn ARB_GENERATE , 212fad4b12bSEdward Tomasz Napieralaor 213fad4b12bSEdward Tomasz Napierala.Fn ARB_GENERATE_STATIC . 214fad4b12bSEdward Tomasz NapieralaSee the examples below for further explanation of how these macros are used. 215fad4b12bSEdward Tomasz Napierala.Pp 216fad4b12bSEdward Tomasz NapieralaA red-black tree is a binary search tree with the node color as an 217fad4b12bSEdward Tomasz Napieralaextra attribute. 218fad4b12bSEdward Tomasz NapieralaIt fulfills a set of conditions: 219fad4b12bSEdward Tomasz Napierala.Bl -enum -offset indent 220fad4b12bSEdward Tomasz Napierala.It 221fad4b12bSEdward Tomasz NapieralaEvery search path from the root to a leaf consists of the same number of 222fad4b12bSEdward Tomasz Napieralablack nodes. 223fad4b12bSEdward Tomasz Napierala.It 224fad4b12bSEdward Tomasz NapieralaEach red node (except for the root) has a black parent. 225fad4b12bSEdward Tomasz Napierala.It 226fad4b12bSEdward Tomasz NapieralaEach leaf node is black. 227fad4b12bSEdward Tomasz Napierala.El 228fad4b12bSEdward Tomasz Napierala.Pp 229fad4b12bSEdward Tomasz NapieralaEvery operation on a red-black tree is bounded as 230fad4b12bSEdward Tomasz Napierala.Fn O "lg n" . 231fad4b12bSEdward Tomasz NapieralaThe maximum height of a red-black tree is 232fad4b12bSEdward Tomasz Napierala.Fn 2lg "n + 1" . 233fad4b12bSEdward Tomasz Napierala.Pp 234fad4b12bSEdward Tomasz Napierala.Fn ARB_* 235fad4b12bSEdward Tomasz Napieralatrees require entries to be allocated as an array, and uses array 236fad4b12bSEdward Tomasz Napieralaindices to link entries together. 237fad4b12bSEdward Tomasz NapieralaThe maximum number of 238fad4b12bSEdward Tomasz Napierala.Fn ARB_* 239fad4b12bSEdward Tomasz Napieralatree entries is therefore constrained by the minimum of array size and choice of 240fad4b12bSEdward Tomasz Napieralasigned integer data type used to store array indices. 241fad4b12bSEdward Tomasz NapieralaUse 242fad4b12bSEdward Tomasz Napierala.Fn ARB_ALLOCSIZE 243fad4b12bSEdward Tomasz Napieralato compute the size of memory chunk to allocate. 244fad4b12bSEdward Tomasz Napierala.Pp 245fad4b12bSEdward Tomasz NapieralaA red-black tree is headed by a structure defined by the 246fad4b12bSEdward Tomasz Napierala.Fn ARB_HEAD 247fad4b12bSEdward Tomasz Napieralamacro. 248fad4b12bSEdward Tomasz NapieralaA 249fad4b12bSEdward Tomasz Napieralastructure is declared with either of the following: 250fad4b12bSEdward Tomasz Napierala.Bd -ragged -offset indent 251fad4b12bSEdward Tomasz Napierala.Fn ARB<8|16|32>_HEAD HEADNAME TYPE 252fad4b12bSEdward Tomasz Napierala.Va head ; 253fad4b12bSEdward Tomasz Napierala.Ed 254fad4b12bSEdward Tomasz Napierala.Pp 255fad4b12bSEdward Tomasz Napieralawhere 256fad4b12bSEdward Tomasz Napierala.Fa HEADNAME 257fad4b12bSEdward Tomasz Napieralais the name of the structure to be defined, and struct 258fad4b12bSEdward Tomasz Napierala.Fa TYPE 259fad4b12bSEdward Tomasz Napieralais the type of the elements to be inserted into the tree. 260fad4b12bSEdward Tomasz Napierala.Pp 261fad4b12bSEdward Tomasz NapieralaThe 262fad4b12bSEdward Tomasz Napierala.Fn ARB_HEAD 263fad4b12bSEdward Tomasz Napieralavariant includes a suffix denoting the signed integer data type size 264fad4b12bSEdward Tomasz Napierala.Pq in bits 265fad4b12bSEdward Tomasz Napieralaused to store array indices. 266fad4b12bSEdward Tomasz NapieralaFor example, 267fad4b12bSEdward Tomasz Napierala.Fn ARB_HEAD8 268fad4b12bSEdward Tomasz Napieralacreates a red-black tree head strucutre with 8-bit signed array indices capable 269fad4b12bSEdward Tomasz Napieralaof indexing up to 128 entries. 270fad4b12bSEdward Tomasz Napierala.Pp 271fad4b12bSEdward Tomasz NapieralaThe 272fad4b12bSEdward Tomasz Napierala.Fn ARB_ENTRY 273fad4b12bSEdward Tomasz Napieralamacro declares a structure that allows elements to be connected in the tree. 274fad4b12bSEdward Tomasz NapieralaSimilarly to the 275fad4b12bSEdward Tomasz Napierala.Fn ARB<8|16|32>_HEAD 276fad4b12bSEdward Tomasz Napieralamacro, the 277fad4b12bSEdward Tomasz Napierala.Fn ARB_ENTRY 278fad4b12bSEdward Tomasz Napieralavariant includes a suffix denoting the signed integer data type size 279fad4b12bSEdward Tomasz Napierala.Pq in bits 280fad4b12bSEdward Tomasz Napieralaused to store array indices. 281fad4b12bSEdward Tomasz NapieralaEntries should use the same number of bits as the tree head structure they will 282fad4b12bSEdward Tomasz Napieralabe linked into. 283fad4b12bSEdward Tomasz Napierala.Pp 284fad4b12bSEdward Tomasz NapieralaIn order to use the functions that manipulate the tree structure, 285fad4b12bSEdward Tomasz Napieralatheir prototypes need to be declared with the 286fad4b12bSEdward Tomasz Napierala.Fn ARB_PROTOTYPE 287fad4b12bSEdward Tomasz Napieralaor 288fad4b12bSEdward Tomasz Napierala.Fn ARB_PROTOTYPE_STATIC 289fad4b12bSEdward Tomasz Napieralamacro, 290fad4b12bSEdward Tomasz Napieralawhere 291fad4b12bSEdward Tomasz Napierala.Fa NAME 292fad4b12bSEdward Tomasz Napieralais a unique identifier for this particular tree. 293fad4b12bSEdward Tomasz NapieralaThe 294fad4b12bSEdward Tomasz Napierala.Fa TYPE 295fad4b12bSEdward Tomasz Napieralaargument is the type of the structure that is being managed 296fad4b12bSEdward Tomasz Napieralaby the tree. 297fad4b12bSEdward Tomasz NapieralaThe 298fad4b12bSEdward Tomasz Napierala.Fa FIELD 299fad4b12bSEdward Tomasz Napieralaargument is the name of the element defined by 300fad4b12bSEdward Tomasz Napierala.Fn ARB_ENTRY . 301fad4b12bSEdward Tomasz NapieralaIndividual prototypes can be declared with 302fad4b12bSEdward Tomasz Napierala.Fn ARB_PROTOTYPE_INSERT , 303fad4b12bSEdward Tomasz Napierala.Fn ARB_PROTOTYPE_INSERT_COLOR , 304fad4b12bSEdward Tomasz Napierala.Fn ARB_PROTOTYPE_REMOVE , 305fad4b12bSEdward Tomasz Napierala.Fn ARB_PROTOTYPE_REMOVE_COLOR , 306fad4b12bSEdward Tomasz Napierala.Fn ARB_PROTOTYPE_FIND , 307fad4b12bSEdward Tomasz Napierala.Fn ARB_PROTOTYPE_NFIND , 308fad4b12bSEdward Tomasz Napierala.Fn ARB_PROTOTYPE_NEXT , 309fad4b12bSEdward Tomasz Napierala.Fn ARB_PROTOTYPE_PREV , 310a5adff0eSEdward Tomasz Napierala.Fn ARB_PROTOTYPE_MINMAX , 311fad4b12bSEdward Tomasz Napieralaand 312a5adff0eSEdward Tomasz Napierala.Fn ARB_PROTOTYPE_REINSERT 313fad4b12bSEdward Tomasz Napieralain case not all functions are required. 314fad4b12bSEdward Tomasz NapieralaThe individual prototype macros expect 315fad4b12bSEdward Tomasz Napierala.Fa NAME , 316fad4b12bSEdward Tomasz Napierala.Fa TYPE , 317fad4b12bSEdward Tomasz Napieralaand 318fad4b12bSEdward Tomasz Napierala.Fa ATTR 319fad4b12bSEdward Tomasz Napieralaarguments. 320fad4b12bSEdward Tomasz NapieralaThe 321fad4b12bSEdward Tomasz Napierala.Fa ATTR 322fad4b12bSEdward Tomasz Napieralaargument must be empty for global functions or 323fad4b12bSEdward Tomasz Napierala.Fa static 324fad4b12bSEdward Tomasz Napieralafor static functions. 325fad4b12bSEdward Tomasz Napierala.Pp 326fad4b12bSEdward Tomasz NapieralaThe function bodies are generated with the 327fad4b12bSEdward Tomasz Napierala.Fn ARB_GENERATE 328fad4b12bSEdward Tomasz Napieralaor 329fad4b12bSEdward Tomasz Napierala.Fn ARB_GENERATE_STATIC 330fad4b12bSEdward Tomasz Napieralamacro. 331fad4b12bSEdward Tomasz NapieralaThese macros take the same arguments as the 332fad4b12bSEdward Tomasz Napierala.Fn ARB_PROTOTYPE 333fad4b12bSEdward Tomasz Napieralaand 334fad4b12bSEdward Tomasz Napierala.Fn ARB_PROTOTYPE_STATIC 335fad4b12bSEdward Tomasz Napieralamacros, but should be used only once. 336fad4b12bSEdward Tomasz NapieralaAs an alternative individual function bodies are generated with the 337fad4b12bSEdward Tomasz Napierala.Fn ARB_GENERATE_INSERT , 338fad4b12bSEdward Tomasz Napierala.Fn ARB_GENERATE_INSERT_COLOR , 339fad4b12bSEdward Tomasz Napierala.Fn ARB_GENERATE_REMOVE , 340fad4b12bSEdward Tomasz Napierala.Fn ARB_GENERATE_REMOVE_COLOR , 341fad4b12bSEdward Tomasz Napierala.Fn ARB_GENERATE_FIND , 342fad4b12bSEdward Tomasz Napierala.Fn ARB_GENERATE_NFIND , 343fad4b12bSEdward Tomasz Napierala.Fn ARB_GENERATE_NEXT , 344fad4b12bSEdward Tomasz Napierala.Fn ARB_GENERATE_PREV , 345a5adff0eSEdward Tomasz Napierala.Fn ARB_GENERATE_MINMAX , 346fad4b12bSEdward Tomasz Napieralaand 347a5adff0eSEdward Tomasz Napierala.Fn ARB_GENERATE_REINSERT 348fad4b12bSEdward Tomasz Napieralamacros. 349fad4b12bSEdward Tomasz Napierala.Pp 350fad4b12bSEdward Tomasz NapieralaFinally, 351fad4b12bSEdward Tomasz Napieralathe 352fad4b12bSEdward Tomasz Napierala.Fa CMP 353fad4b12bSEdward Tomasz Napieralaargument is the name of a function used to compare tree nodes 354fad4b12bSEdward Tomasz Napieralawith each other. 355fad4b12bSEdward Tomasz NapieralaThe function takes two arguments of type 356fad4b12bSEdward Tomasz Napierala.Vt "struct TYPE *" . 357fad4b12bSEdward Tomasz NapieralaIf the first argument is smaller than the second, the function returns a 358fad4b12bSEdward Tomasz Napieralavalue smaller than zero. 359fad4b12bSEdward Tomasz NapieralaIf they are equal, the function returns zero. 360fad4b12bSEdward Tomasz NapieralaOtherwise, it should return a value greater than zero. 361fad4b12bSEdward Tomasz NapieralaThe compare 362fad4b12bSEdward Tomasz Napieralafunction defines the order of the tree elements. 363fad4b12bSEdward Tomasz Napierala.Pp 364fad4b12bSEdward Tomasz NapieralaThe 365fad4b12bSEdward Tomasz Napierala.Fn ARB_INIT 366fad4b12bSEdward Tomasz Napieralamacro initializes the tree referenced by 367fad4b12bSEdward Tomasz Napierala.Fa head , 368fad4b12bSEdward Tomasz Napieralawith the array length of 369fad4b12bSEdward Tomasz Napierala.Fa maxnodes . 370fad4b12bSEdward Tomasz Napierala.Pp 371fad4b12bSEdward Tomasz NapieralaThe red-black tree can also be initialized statically by using the 372fad4b12bSEdward Tomasz Napierala.Fn ARB_INITIALIZER 373fad4b12bSEdward Tomasz Napieralamacro: 374fad4b12bSEdward Tomasz Napierala.Bd -ragged -offset indent 375fad4b12bSEdward Tomasz Napierala.Fn ARB<8|16|32>_HEAD HEADNAME TYPE 376fad4b12bSEdward Tomasz Napierala.Va head 377fad4b12bSEdward Tomasz Napierala= 378fad4b12bSEdward Tomasz Napierala.Fn ARB_INITIALIZER &head maxnodes ; 379fad4b12bSEdward Tomasz Napierala.Ed 380fad4b12bSEdward Tomasz Napierala.Pp 381fad4b12bSEdward Tomasz NapieralaThe 382fad4b12bSEdward Tomasz Napierala.Fn ARB_INSERT 383fad4b12bSEdward Tomasz Napieralamacro inserts the new element 384fad4b12bSEdward Tomasz Napierala.Fa elm 385fad4b12bSEdward Tomasz Napieralainto the tree. 386fad4b12bSEdward Tomasz Napierala.Pp 387fad4b12bSEdward Tomasz NapieralaThe 388fad4b12bSEdward Tomasz Napierala.Fn ARB_REMOVE 389fad4b12bSEdward Tomasz Napieralamacro removes the element 390fad4b12bSEdward Tomasz Napierala.Fa elm 391fad4b12bSEdward Tomasz Napieralafrom the tree pointed by 392fad4b12bSEdward Tomasz Napierala.Fa head . 393fad4b12bSEdward Tomasz Napierala.Pp 394fad4b12bSEdward Tomasz NapieralaThe 395fad4b12bSEdward Tomasz Napierala.Fn ARB_FIND 396fad4b12bSEdward Tomasz Napieralaand 397fad4b12bSEdward Tomasz Napierala.Fn ARB_NFIND 398fad4b12bSEdward Tomasz Napieralamacros can be used to find a particular element in the tree. 399fad4b12bSEdward Tomasz Napierala.Bd -literal -offset indent 400fad4b12bSEdward Tomasz Napieralastruct TYPE find, *res; 401fad4b12bSEdward Tomasz Napieralafind.key = 30; 402fad4b12bSEdward Tomasz Napieralares = RB_FIND(NAME, head, &find); 403fad4b12bSEdward Tomasz Napierala.Ed 404fad4b12bSEdward Tomasz Napierala.Pp 405fad4b12bSEdward Tomasz NapieralaThe 406fad4b12bSEdward Tomasz Napierala.Fn ARB_ROOT , 407fad4b12bSEdward Tomasz Napierala.Fn ARB_MIN , 408fad4b12bSEdward Tomasz Napierala.Fn ARB_MAX , 409fad4b12bSEdward Tomasz Napierala.Fn ARB_NEXT , 410fad4b12bSEdward Tomasz Napieralaand 411fad4b12bSEdward Tomasz Napierala.Fn ARB_PREV 412fad4b12bSEdward Tomasz Napieralamacros can be used to traverse the tree: 413fad4b12bSEdward Tomasz Napierala.Pp 414fad4b12bSEdward Tomasz Napierala.Dl "for (np = RB_MIN(NAME, &head); np != NULL; np = RB_NEXT(NAME, &head, np))" 415fad4b12bSEdward Tomasz Napierala.Pp 416fad4b12bSEdward Tomasz NapieralaOr, for simplicity, one can use the 417fad4b12bSEdward Tomasz Napierala.Fn ARB_FOREACH 418fad4b12bSEdward Tomasz Napieralaor 419fad4b12bSEdward Tomasz Napierala.Fn ARB_FOREACH_REVERSE 420fad4b12bSEdward Tomasz Napieralamacro: 421fad4b12bSEdward Tomasz Napierala.Bd -ragged -offset indent 422fad4b12bSEdward Tomasz Napierala.Fn RB_FOREACH np NAME head 423fad4b12bSEdward Tomasz Napierala.Ed 424fad4b12bSEdward Tomasz Napierala.Pp 425fad4b12bSEdward Tomasz NapieralaThe macros 426fad4b12bSEdward Tomasz Napierala.Fn ARB_FOREACH_SAFE 427fad4b12bSEdward Tomasz Napieralaand 428fad4b12bSEdward Tomasz Napierala.Fn ARB_FOREACH_REVERSE_SAFE 429fad4b12bSEdward Tomasz Napieralatraverse the tree referenced by head 430fad4b12bSEdward Tomasz Napieralain a forward or reverse direction respectively, 431fad4b12bSEdward Tomasz Napieralaassigning each element in turn to np. 432fad4b12bSEdward Tomasz NapieralaHowever, unlike their unsafe counterparts, 433fad4b12bSEdward Tomasz Napieralathey permit both the removal of np 434fad4b12bSEdward Tomasz Napieralaas well as freeing it from within the loop safely 435fad4b12bSEdward Tomasz Napieralawithout interfering with the traversal. 436fad4b12bSEdward Tomasz Napierala.Pp 437fad4b12bSEdward Tomasz NapieralaBoth 438fad4b12bSEdward Tomasz Napierala.Fn ARB_FOREACH_FROM 439fad4b12bSEdward Tomasz Napieralaand 440fad4b12bSEdward Tomasz Napierala.Fn ARB_FOREACH_REVERSE_FROM 441fad4b12bSEdward Tomasz Napieralamay be used to continue an interrupted traversal 442fad4b12bSEdward Tomasz Napieralain a forward or reverse direction respectively. 443fad4b12bSEdward Tomasz NapieralaThe head pointer is not required. 444fad4b12bSEdward Tomasz NapieralaThe pointer to the node from where to resume the traversal 445fad4b12bSEdward Tomasz Napieralashould be passed as their last argument, 446fad4b12bSEdward Tomasz Napieralaand will be overwritten to provide safe traversal. 447fad4b12bSEdward Tomasz Napierala.Pp 448fad4b12bSEdward Tomasz NapieralaThe 449fad4b12bSEdward Tomasz Napierala.Fn ARB_EMPTY 450fad4b12bSEdward Tomasz Napieralamacro should be used to check whether a red-black tree is empty. 451fad4b12bSEdward Tomasz Napierala.Pp 452fad4b12bSEdward Tomasz NapieralaGiven that ARB trees have an intrinsic upper bound on the number of entries, 453fad4b12bSEdward Tomasz Napieralasome ARB-specific additional macros are defined. 454fad4b12bSEdward Tomasz NapieralaThe 455fad4b12bSEdward Tomasz Napierala.Fn ARB_FULL 456fad4b12bSEdward Tomasz Napieralamacro returns a boolean indicating whether the current number of tree entries 457fad4b12bSEdward Tomasz Napieralaequals the tree's maximum. 458fad4b12bSEdward Tomasz NapieralaThe 459fad4b12bSEdward Tomasz Napierala.Fn ARB_CURNODES 460fad4b12bSEdward Tomasz Napieralaand 461fad4b12bSEdward Tomasz Napierala.Fn ARB_MAXNODES 462fad4b12bSEdward Tomasz Napieralamacros return the current and maximum number of entries respectively. 463fad4b12bSEdward Tomasz NapieralaThe 464fad4b12bSEdward Tomasz Napierala.Fn ARB_GETFREE 465fad4b12bSEdward Tomasz Napieralamacro returns a pointer to the next free entry in the array of entries, ready to 466fad4b12bSEdward Tomasz Napieralabe linked into the tree. 467fad4b12bSEdward Tomasz NapieralaThe 468fad4b12bSEdward Tomasz Napierala.Fn ARB_INSERT 469fad4b12bSEdward Tomasz Napieralareturns 470fad4b12bSEdward Tomasz Napierala.Dv NULL 471fad4b12bSEdward Tomasz Napieralaif the element was inserted in the tree successfully, otherwise they 472fad4b12bSEdward Tomasz Napieralareturn a pointer to the element with the colliding key. 473fad4b12bSEdward Tomasz Napierala.Pp 474fad4b12bSEdward Tomasz NapieralaAccordingly, 475fad4b12bSEdward Tomasz Napierala.Fn ARB_REMOVE 476fad4b12bSEdward Tomasz Napieralareturns the pointer to the removed element otherwise they return 477fad4b12bSEdward Tomasz Napierala.Dv NULL 478fad4b12bSEdward Tomasz Napieralato indicate an error. 479a5adff0eSEdward Tomasz Napierala.Pp 480a5adff0eSEdward Tomasz NapieralaThe 481*1a13f2e6SEdward Tomasz Napierala.Fn ARB_REINSERT 482a5adff0eSEdward Tomasz Napieralamacro updates the position of the element 483a5adff0eSEdward Tomasz Napierala.Fa elm 484a5adff0eSEdward Tomasz Napieralain the tree. 485a5adff0eSEdward Tomasz NapieralaThis must be called if a member of a 486a5adff0eSEdward Tomasz Napierala.Nm tree 487a5adff0eSEdward Tomasz Napieralais modified in a way that affects comparison, such as by modifying 488a5adff0eSEdward Tomasz Napieralaa node's key. 489a5adff0eSEdward Tomasz NapieralaThis is a lower overhead alternative to removing the element 490a5adff0eSEdward Tomasz Napieralaand reinserting it again. 491*1a13f2e6SEdward Tomasz Napierala.Pp 492*1a13f2e6SEdward Tomasz NapieralaThe 493*1a13f2e6SEdward Tomasz Napierala.Fn ARB_RESET_TREE 494*1a13f2e6SEdward Tomasz Napieralamacro discards the tree topology. 495*1a13f2e6SEdward Tomasz NapieralaIt does not modify embedded object values or the free list. 496fad4b12bSEdward Tomasz Napierala.Sh SEE ALSO 497fad4b12bSEdward Tomasz Napierala.Xr queue 3 , 498fad4b12bSEdward Tomasz Napierala.Xr tree 3 499fad4b12bSEdward Tomasz Napierala.Sh HISTORY 500fad4b12bSEdward Tomasz NapieralaThe 501fad4b12bSEdward Tomasz Napierala.Nm ARB 502fad4b12bSEdward Tomasz Napieralamacros first appeared in 503fad4b12bSEdward Tomasz Napierala.Fx 13.0 . 504fad4b12bSEdward Tomasz Napierala.Sh AUTHORS 505fad4b12bSEdward Tomasz NapieralaThe 506fad4b12bSEdward Tomasz Napierala.Nm ARB 507fad4b12bSEdward Tomasz Napieralamacros were implemented by 508fad4b12bSEdward Tomasz Napierala.An Lawrence Stewart Aq Mt lstewart@FreeBSD.org , 509fad4b12bSEdward Tomasz Napieralabased on 510fad4b12bSEdward Tomasz Napierala.Xr tree 3 511fad4b12bSEdward Tomasz Napieralamacros written by 512fad4b12bSEdward Tomasz Napierala.An Niels Provos . 513