diff options
| author | Jacob McDonnell <jacob@jacobmcdonnell.com> | 2026-04-25 19:55:43 -0400 |
|---|---|---|
| committer | Jacob McDonnell <jacob@jacobmcdonnell.com> | 2026-04-25 19:55:43 -0400 |
| commit | ac5e55f5f2af5b92794c2aded46c6bae85b5f5ed (patch) | |
| tree | 9367490586c84cba28652e443e3166d66c33b0d9 /static/freebsd/man3/arb.3 3.html | |
| parent | 253e67c8b3a72b3a4757fdbc5845297628db0a4a (diff) | |
docs: Added All FreeBSD Manuals
Diffstat (limited to 'static/freebsd/man3/arb.3 3.html')
| -rw-r--r-- | static/freebsd/man3/arb.3 3.html | 550 |
1 files changed, 550 insertions, 0 deletions
diff --git a/static/freebsd/man3/arb.3 3.html b/static/freebsd/man3/arb.3 3.html new file mode 100644 index 00000000..f8219d50 --- /dev/null +++ b/static/freebsd/man3/arb.3 3.html @@ -0,0 +1,550 @@ +<table class="head"> + <tr> + <td class="head-ltitle">ARB(3)</td> + <td class="head-vol">Library Functions Manual</td> + <td class="head-rtitle">ARB(3)</td> + </tr> +</table> +<div class="manual-text"> +<section class="Sh"> +<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> +<p class="Pp"><code class="Nm">ARB_PROTOTYPE</code>, + <code class="Nm">ARB_PROTOTYPE_STATIC</code>, + <code class="Nm">ARB_PROTOTYPE_INSERT</code>, + <code class="Nm">ARB_PROTOTYPE_INSERT_COLOR</code>, + <code class="Nm">ARB_PROTOTYPE_REMOVE</code>, + <code class="Nm">ARB_PROTOTYPE_REMOVE_COLOR</code>, + <code class="Nm">ARB_PROTOTYPE_FIND</code>, + <code class="Nm">ARB_PROTOTYPE_NFIND</code>, + <code class="Nm">ARB_PROTOTYPE_NEXT</code>, + <code class="Nm">ARB_PROTOTYPE_PREV</code>, + <code class="Nm">ARB_PROTOTYPE_MINMAX</code>, + <code class="Nm">ARB_PROTOTYPE_REINSERT</code>, + <code class="Nm">ARB_GENERATE</code>, + <code class="Nm">ARB_GENERATE_STATIC</code>, + <code class="Nm">ARB_GENERATE_INSERT</code>, + <code class="Nm">ARB_GENERATE_INSERT_COLOR</code>, + <code class="Nm">ARB_GENERATE_REMOVE</code>, + <code class="Nm">ARB_GENERATE_REMOVE_COLOR</code>, + <code class="Nm">ARB_GENERATE_FIND</code>, + <code class="Nm">ARB_GENERATE_NFIND</code>, + <code class="Nm">ARB_GENERATE_NEXT</code>, + <code class="Nm">ARB_GENERATE_PREV</code>, + <code class="Nm">ARB_GENERATE_MINMAX</code>, + <code class="Nm">ARB_GENERATE_REINSERT</code>, + <code class="Nm">ARB8_ENTRY</code>, <code class="Nm">ARB16_ENTRY</code>, + <code class="Nm">ARB32_ENTRY</code>, <code class="Nm">ARB8_HEAD</code>, + <code class="Nm">ARB16_HEAD</code>, <code class="Nm">ARB32_HEAD</code>, + <code class="Nm">ARB_ALLOCSIZE</code>, + <code class="Nm">ARB_INITIALIZER</code>, <code class="Nm">ARB_ROOT</code>, + <code class="Nm">ARB_EMPTY</code>, <code class="Nm">ARB_FULL</code>, + <code class="Nm">ARB_CURNODES</code>, <code class="Nm">ARB_MAXNODES</code>, + <code class="Nm">ARB_NEXT</code>, <code class="Nm">ARB_PREV</code>, + <code class="Nm">ARB_MIN</code>, <code class="Nm">ARB_MAX</code>, + <code class="Nm">ARB_FIND</code>, <code class="Nm">ARB_NFIND</code>, + <code class="Nm">ARB_LEFT</code>, <code class="Nm">ARB_LEFTIDX</code>, + <code class="Nm">ARB_RIGHT</code>, <code class="Nm">ARB_RIGHTIDX</code>, + <code class="Nm">ARB_PARENT</code>, <code class="Nm">ARB_PARENTIDX</code>, + <code class="Nm">ARB_GETFREE</code>, <code class="Nm">ARB_FREEIDX</code>, + <code class="Nm">ARB_FOREACH</code>, + <code class="Nm">ARB_FOREACH_FROM</code>, + <code class="Nm">ARB_FOREACH_SAFE</code>, + <code class="Nm">ARB_FOREACH_REVERSE</code>, + <code class="Nm">ARB_FOREACH_REVERSE_FROM</code>, + <code class="Nm">ARB_FOREACH_REVERSE_SAFE</code>, + <code class="Nm">ARB_INIT</code>, <code class="Nm">ARB_INSERT</code>, + <code class="Nm">ARB_REMOVE</code>, <code class="Nm">ARB_REINSERT</code>, + <code class="Nm">ARB_RESET_TREE</code> — <span class="Nd">array-based + red-black trees</span></p> +</section> +<section class="Sh"> +<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> +<p class="Pp"><code class="In">#include + <<a class="In">sys/arb.h</a>></code></p> +<p class="Pp"><code class="Fn">ARB_PROTOTYPE</code>(<var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">TYPE</var>, + <var class="Fa" style="white-space: nowrap;">FIELD</var>, + <var class="Fa" style="white-space: nowrap;">CMP</var>);</p> +<p class="Pp"><code class="Fn">ARB_PROTOTYPE_STATIC</code>(<var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">TYPE</var>, + <var class="Fa" style="white-space: nowrap;">FIELD</var>, + <var class="Fa" style="white-space: nowrap;">CMP</var>);</p> +<p class="Pp"><code class="Fn">ARB_PROTOTYPE_INSERT</code>(<var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">TYPE</var>, + <var class="Fa" style="white-space: nowrap;">ATTR</var>);</p> +<p class="Pp"><code class="Fn">ARB_PROTOTYPE_INSERT_COLOR</code>(<var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">TYPE</var>, + <var class="Fa" style="white-space: nowrap;">ATTR</var>);</p> +<p class="Pp"><code class="Fn">ARB_PROTOTYPE_REMOVE</code>(<var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">TYPE</var>, + <var class="Fa" style="white-space: nowrap;">ATTR</var>);</p> +<p class="Pp"><code class="Fn">ARB_PROTOTYPE_REMOVE_COLOR</code>(<var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">TYPE</var>, + <var class="Fa" style="white-space: nowrap;">ATTR</var>);</p> +<p class="Pp"><code class="Fn">ARB_PROTOTYPE_FIND</code>(<var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">TYPE</var>, + <var class="Fa" style="white-space: nowrap;">ATTR</var>);</p> +<p class="Pp"><code class="Fn">ARB_PROTOTYPE_NFIND</code>(<var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">TYPE</var>, + <var class="Fa" style="white-space: nowrap;">ATTR</var>);</p> +<p class="Pp"><code class="Fn">ARB_PROTOTYPE_NEXT</code>(<var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">TYPE</var>, + <var class="Fa" style="white-space: nowrap;">ATTR</var>);</p> +<p class="Pp"><code class="Fn">ARB_PROTOTYPE_PREV</code>(<var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">TYPE</var>, + <var class="Fa" style="white-space: nowrap;">ATTR</var>);</p> +<p class="Pp"><code class="Fn">ARB_PROTOTYPE_MINMAX</code>(<var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">TYPE</var>, + <var class="Fa" style="white-space: nowrap;">ATTR</var>);</p> +<p class="Pp"><code class="Fn">ARB_PROTOTYPE_REINSERT</code>(<var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">TYPE</var>, + <var class="Fa" style="white-space: nowrap;">ATTR</var>);</p> +<p class="Pp"><code class="Fn">ARB_GENERATE</code>(<var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">TYPE</var>, + <var class="Fa" style="white-space: nowrap;">FIELD</var>, + <var class="Fa" style="white-space: nowrap;">CMP</var>);</p> +<p class="Pp"><code class="Fn">ARB_GENERATE_STATIC</code>(<var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">TYPE</var>, + <var class="Fa" style="white-space: nowrap;">FIELD</var>, + <var class="Fa" style="white-space: nowrap;">CMP</var>);</p> +<p class="Pp"><code class="Fn">ARB_GENERATE_INSERT</code>(<var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">TYPE</var>, + <var class="Fa" style="white-space: nowrap;">FIELD</var>, + <var class="Fa" style="white-space: nowrap;">CMP</var>, + <var class="Fa" style="white-space: nowrap;">ATTR</var>);</p> +<p class="Pp"><code class="Fn">ARB_GENERATE_INSERT_COLOR</code>(<var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">TYPE</var>, + <var class="Fa" style="white-space: nowrap;">FIELD</var>, + <var class="Fa" style="white-space: nowrap;">ATTR</var>);</p> +<p class="Pp"><code class="Fn">ARB_GENERATE_REMOVE</code>(<var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">TYPE</var>, + <var class="Fa" style="white-space: nowrap;">FIELD</var>, + <var class="Fa" style="white-space: nowrap;">ATTR</var>);</p> +<p class="Pp"><code class="Fn">ARB_GENERATE_REMOVE_COLOR</code>(<var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">TYPE</var>, + <var class="Fa" style="white-space: nowrap;">FIELD</var>, + <var class="Fa" style="white-space: nowrap;">ATTR</var>);</p> +<p class="Pp"><code class="Fn">ARB_GENERATE_FIND</code>(<var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">TYPE</var>, + <var class="Fa" style="white-space: nowrap;">FIELD</var>, + <var class="Fa" style="white-space: nowrap;">CMP</var>, + <var class="Fa" style="white-space: nowrap;">ATTR</var>);</p> +<p class="Pp"><code class="Fn">ARB_GENERATE_NFIND</code>(<var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">TYPE</var>, + <var class="Fa" style="white-space: nowrap;">FIELD</var>, + <var class="Fa" style="white-space: nowrap;">CMP</var>, + <var class="Fa" style="white-space: nowrap;">ATTR</var>);</p> +<p class="Pp"><code class="Fn">ARB_GENERATE_NEXT</code>(<var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">TYPE</var>, + <var class="Fa" style="white-space: nowrap;">FIELD</var>, + <var class="Fa" style="white-space: nowrap;">ATTR</var>);</p> +<p class="Pp"><code class="Fn">ARB_GENERATE_PREV</code>(<var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">TYPE</var>, + <var class="Fa" style="white-space: nowrap;">FIELD</var>, + <var class="Fa" style="white-space: nowrap;">ATTR</var>);</p> +<p class="Pp"><code class="Fn">ARB_GENERATE_MINMAX</code>(<var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">TYPE</var>, + <var class="Fa" style="white-space: nowrap;">FIELD</var>, + <var class="Fa" style="white-space: nowrap;">ATTR</var>);</p> +<p class="Pp"><code class="Fn">ARB_GENERATE_REINSERT</code>(<var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">TYPE</var>, + <var class="Fa" style="white-space: nowrap;">FIELD</var>, + <var class="Fa" style="white-space: nowrap;">CMP</var>, + <var class="Fa" style="white-space: nowrap;">ATTR</var>);</p> +<p class="Pp"><code class="Fn">ARB<8|16|32>_ENTRY</code>();</p> +<p class="Pp"><code class="Fn">ARB<8|16|32>_HEAD</code>(<var class="Fa" style="white-space: nowrap;">HEADNAME</var>, + <var class="Fa" style="white-space: nowrap;">TYPE</var>);</p> +<p class="Pp"><var class="Ft">size_t</var> + <br/> + <code class="Fn">ARB_ALLOCSIZE</code>(<var class="Fa" style="white-space: nowrap;">ARB_HEAD + *head</var>, + <var class="Fa" style="white-space: nowrap;">int<8|16|32>_t + maxnodes</var>, <var class="Fa" style="white-space: nowrap;">struct TYPE + *elm</var>);</p> +<p class="Pp"><code class="Fn">ARB_INITIALIZER</code>(<var class="Fa" style="white-space: nowrap;">ARB_HEAD + *head</var>, + <var class="Fa" style="white-space: nowrap;">int<8|16|32>_t + maxnodes</var>);</p> +<p class="Pp"><var class="Ft">struct TYPE *</var> + <br/> + <code class="Fn">ARB_ROOT</code>(<var class="Fa" style="white-space: nowrap;">ARB_HEAD + *head</var>);</p> +<p class="Pp"><var class="Ft">bool</var> + <br/> + <code class="Fn">ARB_EMPTY</code>(<var class="Fa" style="white-space: nowrap;">ARB_HEAD + *head</var>);</p> +<p class="Pp"><var class="Ft">bool</var> + <br/> + <code class="Fn">ARB_FULL</code>(<var class="Fa" style="white-space: nowrap;">ARB_HEAD + *head</var>);</p> +<p class="Pp"><var class="Ft">int<8|16|32>_t</var> + <br/> + <code class="Fn">ARB_CURNODES</code>(<var class="Fa" style="white-space: nowrap;">ARB_HEAD + *head</var>);</p> +<p class="Pp"><var class="Ft">int<8|16|32>_t</var> + <br/> + <code class="Fn">ARB_MAXNODES</code>(<var class="Fa" style="white-space: nowrap;">ARB_HEAD + *head</var>);</p> +<p class="Pp"><var class="Ft">struct TYPE *</var> + <br/> + <code class="Fn">ARB_NEXT</code>(<var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">ARB_HEAD *head</var>, + <var class="Fa" style="white-space: nowrap;">struct TYPE *elm</var>);</p> +<p class="Pp"><var class="Ft">struct TYPE *</var> + <br/> + <code class="Fn">ARB_PREV</code>(<var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">ARB_HEAD *head</var>, + <var class="Fa" style="white-space: nowrap;">struct TYPE *elm</var>);</p> +<p class="Pp"><var class="Ft">struct TYPE *</var> + <br/> + <code class="Fn">ARB_MIN</code>(<var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">ARB_HEAD *head</var>);</p> +<p class="Pp"><var class="Ft">struct TYPE *</var> + <br/> + <code class="Fn">ARB_MAX</code>(<var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">ARB_HEAD *head</var>);</p> +<p class="Pp"><var class="Ft">struct TYPE *</var> + <br/> + <code class="Fn">ARB_FIND</code>(<var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">ARB_HEAD *head</var>, + <var class="Fa" style="white-space: nowrap;">struct TYPE *elm</var>);</p> +<p class="Pp"><var class="Ft">struct TYPE *</var> + <br/> + <code class="Fn">ARB_NFIND</code>(<var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">ARB_HEAD *head</var>, + <var class="Fa" style="white-space: nowrap;">struct TYPE *elm</var>);</p> +<p class="Pp"><var class="Ft">struct TYPE *</var> + <br/> + <code class="Fn">ARB_LEFT</code>(<var class="Fa" style="white-space: nowrap;">struct + TYPE *elm</var>, <var class="Fa" style="white-space: nowrap;">ARB_ENTRY + NAME</var>);</p> +<p class="Pp"><var class="Ft">int<8|16|32>_t</var> + <br/> + <code class="Fn">ARB_LEFTIDX</code>(<var class="Fa" style="white-space: nowrap;">struct + TYPE *elm</var>, <var class="Fa" style="white-space: nowrap;">ARB_ENTRY + NAME</var>);</p> +<p class="Pp"><var class="Ft">struct TYPE *</var> + <br/> + <code class="Fn">ARB_RIGHT</code>(<var class="Fa" style="white-space: nowrap;">struct + TYPE *elm</var>, <var class="Fa" style="white-space: nowrap;">ARB_ENTRY + NAME</var>);</p> +<p class="Pp"><var class="Ft">int<8|16|32>_t</var> + <br/> + <code class="Fn">ARB_RIGHTIDX</code>(<var class="Fa" style="white-space: nowrap;">struct + TYPE *elm</var>, <var class="Fa" style="white-space: nowrap;">ARB_ENTRY + NAME</var>);</p> +<p class="Pp"><var class="Ft">struct TYPE *</var> + <br/> + <code class="Fn">ARB_PARENT</code>(<var class="Fa" style="white-space: nowrap;">struct + TYPE *elm</var>, <var class="Fa" style="white-space: nowrap;">ARB_ENTRY + NAME</var>);</p> +<p class="Pp"><var class="Ft">int<8|16|32>_t</var> + <br/> + <code class="Fn">ARB_PARENTIDX</code>(<var class="Fa" style="white-space: nowrap;">struct + TYPE *elm</var>, <var class="Fa" style="white-space: nowrap;">ARB_ENTRY + NAME</var>);</p> +<p class="Pp"><var class="Ft">struct TYPE *</var> + <br/> + <code class="Fn">ARB_GETFREE</code>(<var class="Fa" style="white-space: nowrap;">ARB_HEAD + *head</var>, <var class="Fa" style="white-space: nowrap;">FIELD</var>);</p> +<p class="Pp"><var class="Ft">int<8|16|32>_t</var> + <br/> + <code class="Fn">ARB_FREEIDX</code>(<var class="Fa" style="white-space: nowrap;">ARB_HEAD + *head</var>);</p> +<p class="Pp"><code class="Fn">ARB_FOREACH</code>(<var class="Fa" style="white-space: nowrap;">VARNAME</var>, + <var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">ARB_HEAD *head</var>);</p> +<p class="Pp"><code class="Fn">ARB_FOREACH_FROM</code>(<var class="Fa" style="white-space: nowrap;">VARNAME</var>, + <var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">POS_VARNAME</var>);</p> +<p class="Pp"><code class="Fn">ARB_FOREACH_SAFE</code>(<var class="Fa" style="white-space: nowrap;">VARNAME</var>, + <var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">ARB_HEAD *head</var>, + <var class="Fa" style="white-space: nowrap;">TEMP_VARNAME</var>);</p> +<p class="Pp"><code class="Fn">ARB_FOREACH_REVERSE</code>(<var class="Fa" style="white-space: nowrap;">VARNAME</var>, + <var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">ARB_HEAD *head</var>);</p> +<p class="Pp"><code class="Fn">ARB_FOREACH_REVERSE_FROM</code>(<var class="Fa" style="white-space: nowrap;">VARNAME</var>, + <var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">POS_VARNAME</var>);</p> +<p class="Pp"><code class="Fn">ARB_FOREACH_REVERSE_SAFE</code>(<var class="Fa" style="white-space: nowrap;">VARNAME</var>, + <var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">ARB_HEAD *head</var>, + <var class="Fa" style="white-space: nowrap;">TEMP_VARNAME</var>);</p> +<p class="Pp"><var class="Ft">void</var> + <br/> + <code class="Fn">ARB_INIT</code>(<var class="Fa" style="white-space: nowrap;">struct + TYPE *elm</var>, <var class="Fa" style="white-space: nowrap;">FIELD</var>, + <var class="Fa" style="white-space: nowrap;">ARB_HEAD *head</var>, + <var class="Fa" style="white-space: nowrap;">int<8|16|32>_t + maxnodes</var>);</p> +<p class="Pp"><var class="Ft">struct TYPE *</var> + <br/> + <code class="Fn">ARB_INSERT</code>(<var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">ARB_HEAD *head</var>, + <var class="Fa" style="white-space: nowrap;">struct TYPE *elm</var>);</p> +<p class="Pp"><var class="Ft">struct TYPE *</var> + <br/> + <code class="Fn">ARB_REMOVE</code>(<var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">ARB_HEAD *head</var>, + <var class="Fa" style="white-space: nowrap;">struct TYPE *elm</var>);</p> +<p class="Pp"><var class="Ft">struct TYPE *</var> + <br/> + <code class="Fn">ARB_REINSERT</code>(<var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">ARB_HEAD *head</var>, + <var class="Fa" style="white-space: nowrap;">struct TYPE *elm</var>);</p> +<p class="Pp"><var class="Ft">void</var> + <br/> + <code class="Fn">ARB_RESET_TREE</code>(<var class="Fa" style="white-space: nowrap;">ARB_HEAD + *head</var>, <var class="Fa" style="white-space: nowrap;">NAME</var>, + <var class="Fa" style="white-space: nowrap;">int<8|16|32>_t + maxnodes</var>);</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> +<p class="Pp">These macros define data structures for and array-based red-black + trees. They use a single, continuous chunk of memory, and are useful e.g., + when the tree needs to be transferred between userspace and kernel.</p> +<p class="Pp" id="ARB_HEAD">In the macro definitions, <var class="Fa">TYPE</var> + is the name tag of a user defined structure that must contain a field of + type <var class="Vt">ARB_ENTRY</var>, named <var class="Fa">ENTRYNAME</var>. + The argument <var class="Fa">HEADNAME</var> is the name tag of a user + defined structure that must be declared using the + <a class="permalink" href="#ARB_HEAD"><code class="Fn">ARB_HEAD</code></a>() + macro. The argument <var class="Fa">NAME</var> has to be a unique name + prefix for every tree that is defined.</p> +<p class="Pp" id="ARB_PROTOTYPE">The function prototypes are declared with + <a class="permalink" href="#ARB_PROTOTYPE"><code class="Fn">ARB_PROTOTYPE</code></a>(), + or + <a class="permalink" href="#ARB_PROTOTYPE_STATIC"><code class="Fn" id="ARB_PROTOTYPE_STATIC">ARB_PROTOTYPE_STATIC</code></a>(). + The function bodies are generated with + <code class="Fn">ARB_GENERATE</code>(), or + <code class="Fn">ARB_GENERATE_STATIC</code>(). See the examples below for + further explanation of how these macros are used.</p> +<p class="Pp">A red-black tree is a binary search tree with the node color as an + extra attribute. It fulfills a set of conditions:</p> +<ol class="Bl-enum Bd-indent"> + <li>Every search path from the root to a leaf consists of the same number of + black nodes.</li> + <li>Each red node (except for the root) has a black parent.</li> + <li>Each leaf node is black.</li> +</ol> +<p class="Pp" id="O">Every operation on a red-black tree is bounded as + <a class="permalink" href="#O"><code class="Fn">O</code></a>(<var class="Fa">lg + n</var>). The maximum height of a red-black tree is + <a class="permalink" href="#2lg"><code class="Fn" id="2lg">2lg</code></a>(<var class="Fa">n + + 1</var>).</p> +<p class="Pp" id="ARB_*"><a class="permalink" href="#ARB_*"><code class="Fn">ARB_*</code></a>() + trees require entries to be allocated as an array, and uses array indices to + link entries together. The maximum number of <code class="Fn">ARB_*</code>() + tree entries is therefore constrained by the minimum of array size and + choice of signed integer data type used to store array indices. Use + <a class="permalink" href="#ARB_ALLOCSIZE"><code class="Fn" id="ARB_ALLOCSIZE">ARB_ALLOCSIZE</code></a>() + to compute the size of memory chunk to allocate.</p> +<p class="Pp" id="ARB_HEAD~2">A red-black tree is headed by a structure defined + by the + <a class="permalink" href="#ARB_HEAD~2"><code class="Fn">ARB_HEAD</code></a>() + macro. A structure is declared with either of the following:</p> +<div class="Bd Pp + Bd-indent"><a class="permalink" href="#ARB_8_16_32__HEAD"><code class="Fn" id="ARB_8_16_32__HEAD">ARB<8|16|32>_HEAD</code></a>(<var class="Fa">HEADNAME</var>, + <var class="Fa">TYPE</var>) <var class="Va">head</var>;</div> +<p class="Pp">where <var class="Fa">HEADNAME</var> is the name of the structure + to be defined, and struct <var class="Fa">TYPE</var> is the type of the + elements to be inserted into the tree.</p> +<p class="Pp" id="ARB_HEAD~3">The + <a class="permalink" href="#ARB_HEAD~3"><code class="Fn">ARB_HEAD</code></a>() + variant includes a suffix denoting the signed integer data type size (in + bits) used to store array indices. For example, + <a class="permalink" href="#ARB_HEAD8"><code class="Fn" id="ARB_HEAD8">ARB_HEAD8</code></a>() + creates a red-black tree head structure with 8-bit signed array indices + capable of indexing up to 128 entries.</p> +<p class="Pp" id="ARB_ENTRY">The + <a class="permalink" href="#ARB_ENTRY"><code class="Fn">ARB_ENTRY</code></a>() + macro declares a structure that allows elements to be connected in the tree. + Similarly to the + <a class="permalink" href="#ARB_8_16_32__HEAD~2"><code class="Fn" id="ARB_8_16_32__HEAD~2">ARB<8|16|32>_HEAD</code></a>() + macro, the <code class="Fn">ARB_ENTRY</code>() variant includes a suffix + denoting the signed integer data type size (in bits) used to store array + indices. Entries should use the same number of bits as the tree head + structure they will be linked into.</p> +<p class="Pp" id="ARB_PROTOTYPE~2">In order to use the functions that manipulate + the tree structure, their prototypes need to be declared with the + <a class="permalink" href="#ARB_PROTOTYPE~2"><code class="Fn">ARB_PROTOTYPE</code></a>() + or + <a class="permalink" href="#ARB_PROTOTYPE_STATIC~2"><code class="Fn" id="ARB_PROTOTYPE_STATIC~2">ARB_PROTOTYPE_STATIC</code></a>() + macro, where <var class="Fa">NAME</var> is a unique identifier for this + particular tree. The <var class="Fa">TYPE</var> argument is the type of the + structure that is being managed by the tree. The <var class="Fa">FIELD</var> + argument is the name of the element defined by + <code class="Fn">ARB_ENTRY</code>(). Individual prototypes can be declared + with + <a class="permalink" href="#ARB_PROTOTYPE_INSERT"><code class="Fn" id="ARB_PROTOTYPE_INSERT">ARB_PROTOTYPE_INSERT</code></a>(), + <a class="permalink" href="#ARB_PROTOTYPE_INSERT_COLOR"><code class="Fn" id="ARB_PROTOTYPE_INSERT_COLOR">ARB_PROTOTYPE_INSERT_COLOR</code></a>(), + <a class="permalink" href="#ARB_PROTOTYPE_REMOVE"><code class="Fn" id="ARB_PROTOTYPE_REMOVE">ARB_PROTOTYPE_REMOVE</code></a>(), + <a class="permalink" href="#ARB_PROTOTYPE_REMOVE_COLOR"><code class="Fn" id="ARB_PROTOTYPE_REMOVE_COLOR">ARB_PROTOTYPE_REMOVE_COLOR</code></a>(), + <a class="permalink" href="#ARB_PROTOTYPE_FIND"><code class="Fn" id="ARB_PROTOTYPE_FIND">ARB_PROTOTYPE_FIND</code></a>(), + <a class="permalink" href="#ARB_PROTOTYPE_NFIND"><code class="Fn" id="ARB_PROTOTYPE_NFIND">ARB_PROTOTYPE_NFIND</code></a>(), + <a class="permalink" href="#ARB_PROTOTYPE_NEXT"><code class="Fn" id="ARB_PROTOTYPE_NEXT">ARB_PROTOTYPE_NEXT</code></a>(), + <a class="permalink" href="#ARB_PROTOTYPE_PREV"><code class="Fn" id="ARB_PROTOTYPE_PREV">ARB_PROTOTYPE_PREV</code></a>(), + <a class="permalink" href="#ARB_PROTOTYPE_MINMAX"><code class="Fn" id="ARB_PROTOTYPE_MINMAX">ARB_PROTOTYPE_MINMAX</code></a>(), + and + <a class="permalink" href="#ARB_PROTOTYPE_REINSERT"><code class="Fn" id="ARB_PROTOTYPE_REINSERT">ARB_PROTOTYPE_REINSERT</code></a>() + in case not all functions are required. The individual prototype macros + expect <var class="Fa">NAME</var>, <var class="Fa">TYPE</var>, and + <var class="Fa">ATTR</var> arguments. The <var class="Fa">ATTR</var> + argument must be empty for global functions or <var class="Fa">static</var> + for static functions.</p> +<p class="Pp" id="ARB_GENERATE">The function bodies are generated with the + <a class="permalink" href="#ARB_GENERATE"><code class="Fn">ARB_GENERATE</code></a>() + or + <a class="permalink" href="#ARB_GENERATE_STATIC"><code class="Fn" id="ARB_GENERATE_STATIC">ARB_GENERATE_STATIC</code></a>() + macro. These macros take the same arguments as the + <code class="Fn">ARB_PROTOTYPE</code>() and + <code class="Fn">ARB_PROTOTYPE_STATIC</code>() macros, but should be used + only once. As an alternative individual function bodies are generated with + the + <a class="permalink" href="#ARB_GENERATE_INSERT"><code class="Fn" id="ARB_GENERATE_INSERT">ARB_GENERATE_INSERT</code></a>(), + <a class="permalink" href="#ARB_GENERATE_INSERT_COLOR"><code class="Fn" id="ARB_GENERATE_INSERT_COLOR">ARB_GENERATE_INSERT_COLOR</code></a>(), + <a class="permalink" href="#ARB_GENERATE_REMOVE"><code class="Fn" id="ARB_GENERATE_REMOVE">ARB_GENERATE_REMOVE</code></a>(), + <a class="permalink" href="#ARB_GENERATE_REMOVE_COLOR"><code class="Fn" id="ARB_GENERATE_REMOVE_COLOR">ARB_GENERATE_REMOVE_COLOR</code></a>(), + <a class="permalink" href="#ARB_GENERATE_FIND"><code class="Fn" id="ARB_GENERATE_FIND">ARB_GENERATE_FIND</code></a>(), + <a class="permalink" href="#ARB_GENERATE_NFIND"><code class="Fn" id="ARB_GENERATE_NFIND">ARB_GENERATE_NFIND</code></a>(), + <a class="permalink" href="#ARB_GENERATE_NEXT"><code class="Fn" id="ARB_GENERATE_NEXT">ARB_GENERATE_NEXT</code></a>(), + <a class="permalink" href="#ARB_GENERATE_PREV"><code class="Fn" id="ARB_GENERATE_PREV">ARB_GENERATE_PREV</code></a>(), + <a class="permalink" href="#ARB_GENERATE_MINMAX"><code class="Fn" id="ARB_GENERATE_MINMAX">ARB_GENERATE_MINMAX</code></a>(), + and + <a class="permalink" href="#ARB_GENERATE_REINSERT"><code class="Fn" id="ARB_GENERATE_REINSERT">ARB_GENERATE_REINSERT</code></a>() + macros.</p> +<p class="Pp">Finally, the <var class="Fa">CMP</var> argument is the name of a + function used to compare tree nodes with each other. The function takes two + arguments of type <var class="Vt">struct TYPE *</var>. If the first argument + is smaller than the second, the function returns a value smaller than zero. + If they are equal, the function returns zero. Otherwise, it should return a + value greater than zero. The compare function defines the order of the tree + elements.</p> +<p class="Pp" id="ARB_INIT">The + <a class="permalink" href="#ARB_INIT"><code class="Fn">ARB_INIT</code></a>() + macro initializes the tree referenced by <var class="Fa">head</var>, with + the array length of <var class="Fa">maxnodes</var>.</p> +<p class="Pp" id="ARB_INITIALIZER">The red-black tree can also be initialized + statically by using the + <a class="permalink" href="#ARB_INITIALIZER"><code class="Fn">ARB_INITIALIZER</code></a>() + macro:</p> +<div class="Bd Pp + Bd-indent"><a class="permalink" href="#ARB_8_16_32__HEAD~3"><code class="Fn" id="ARB_8_16_32__HEAD~3">ARB<8|16|32>_HEAD</code></a>(<var class="Fa">HEADNAME</var>, + <var class="Fa">TYPE</var>) <var class="Va">head</var> = + <code class="Fn">ARB_INITIALIZER</code>(<var class="Fa">&head</var>, + <var class="Fa">maxnodes</var>);</div> +<p class="Pp" id="ARB_INSERT">The + <a class="permalink" href="#ARB_INSERT"><code class="Fn">ARB_INSERT</code></a>() + macro inserts the new element <var class="Fa">elm</var> into the tree.</p> +<p class="Pp" id="ARB_REMOVE">The + <a class="permalink" href="#ARB_REMOVE"><code class="Fn">ARB_REMOVE</code></a>() + macro removes the element <var class="Fa">elm</var> from the tree pointed by + <var class="Fa">head</var>.</p> +<p class="Pp" id="ARB_FIND">The + <a class="permalink" href="#ARB_FIND"><code class="Fn">ARB_FIND</code></a>() + and + <a class="permalink" href="#ARB_NFIND"><code class="Fn" id="ARB_NFIND">ARB_NFIND</code></a>() + macros can be used to find a particular element in the tree.</p> +<div class="Bd Pp Bd-indent Li"> +<pre>struct TYPE find, *res; +find.key = 30; +res = ARB_FIND(NAME, head, &find);</pre> +</div> +<p class="Pp" id="ARB_ROOT">The + <a class="permalink" href="#ARB_ROOT"><code class="Fn">ARB_ROOT</code></a>(), + <a class="permalink" href="#ARB_MIN"><code class="Fn" id="ARB_MIN">ARB_MIN</code></a>(), + <a class="permalink" href="#ARB_MAX"><code class="Fn" id="ARB_MAX">ARB_MAX</code></a>(), + <a class="permalink" href="#ARB_NEXT"><code class="Fn" id="ARB_NEXT">ARB_NEXT</code></a>(), + and + <a class="permalink" href="#ARB_PREV"><code class="Fn" id="ARB_PREV">ARB_PREV</code></a>() + macros can be used to traverse the tree:</p> +<p class="Pp"></p> +<div class="Bd Bd-indent"><code class="Li">for (np = ARB_MIN(NAME, &head); + np != NULL; np = ARB_NEXT(NAME, &head, np))</code></div> +<p class="Pp" id="ARB_FOREACH">Or, for simplicity, one can use the + <a class="permalink" href="#ARB_FOREACH"><code class="Fn">ARB_FOREACH</code></a>() + or + <a class="permalink" href="#ARB_FOREACH_REVERSE"><code class="Fn" id="ARB_FOREACH_REVERSE">ARB_FOREACH_REVERSE</code></a>() + macro:</p> +<div class="Bd Pp + Bd-indent"><code class="Fn">ARB_FOREACH</code>(<var class="Fa">np</var>, + <var class="Fa">NAME</var>, <var class="Fa">head</var>)</div> +<p class="Pp" id="ARB_FOREACH_SAFE">The macros + <a class="permalink" href="#ARB_FOREACH_SAFE"><code class="Fn">ARB_FOREACH_SAFE</code></a>() + and + <a class="permalink" href="#ARB_FOREACH_REVERSE_SAFE"><code class="Fn" id="ARB_FOREACH_REVERSE_SAFE">ARB_FOREACH_REVERSE_SAFE</code></a>() + traverse the tree referenced by head in a forward or reverse direction + respectively, assigning each element in turn to np. However, unlike their + unsafe counterparts, they permit both the removal of np as well as freeing + it from within the loop safely without interfering with the traversal.</p> +<p class="Pp" id="ARB_FOREACH_FROM">Both + <a class="permalink" href="#ARB_FOREACH_FROM"><code class="Fn">ARB_FOREACH_FROM</code></a>() + and + <a class="permalink" href="#ARB_FOREACH_REVERSE_FROM"><code class="Fn" id="ARB_FOREACH_REVERSE_FROM">ARB_FOREACH_REVERSE_FROM</code></a>() + may be used to continue an interrupted traversal in a forward or reverse + direction respectively. The head pointer is not required. The pointer to the + node from where to resume the traversal should be passed as their last + argument, and will be overwritten to provide safe traversal.</p> +<p class="Pp" id="ARB_EMPTY">The + <a class="permalink" href="#ARB_EMPTY"><code class="Fn">ARB_EMPTY</code></a>() + macro should be used to check whether a red-black tree is empty.</p> +<p class="Pp" id="ARB_FULL">Given that ARB trees have an intrinsic upper bound + on the number of entries, some ARB-specific additional macros are defined. + The + <a class="permalink" href="#ARB_FULL"><code class="Fn">ARB_FULL</code></a>() + macro returns a boolean indicating whether the current number of tree + entries equals the tree's maximum. The + <a class="permalink" href="#ARB_CURNODES"><code class="Fn" id="ARB_CURNODES">ARB_CURNODES</code></a>() + and + <a class="permalink" href="#ARB_MAXNODES"><code class="Fn" id="ARB_MAXNODES">ARB_MAXNODES</code></a>() + macros return the current and maximum number of entries respectively. The + <a class="permalink" href="#ARB_GETFREE"><code class="Fn" id="ARB_GETFREE">ARB_GETFREE</code></a>() + macro returns a pointer to the next free entry in the array of entries, + ready to be linked into the tree. The <code class="Fn">ARB_INSERT</code>() + returns <code class="Dv">NULL</code> if the element was inserted in the tree + successfully, otherwise they return a pointer to the element with the + colliding key.</p> +<p class="Pp" id="ARB_REMOVE~2">Accordingly, + <a class="permalink" href="#ARB_REMOVE~2"><code class="Fn">ARB_REMOVE</code></a>() + returns the pointer to the removed element otherwise they return + <code class="Dv">NULL</code> to indicate an error.</p> +<p class="Pp" id="ARB_REINSERT">The + <a class="permalink" href="#ARB_REINSERT"><code class="Fn">ARB_REINSERT</code></a>() + macro updates the position of the element <var class="Fa">elm</var> in the + tree. This must be called if a member of a <code class="Nm">tree</code> is + modified in a way that affects comparison, such as by modifying a node's + key. This is a lower overhead alternative to removing the element and + reinserting it again.</p> +<p class="Pp" id="ARB_RESET_TREE">The + <a class="permalink" href="#ARB_RESET_TREE"><code class="Fn">ARB_RESET_TREE</code></a>() + macro discards the tree topology. It does not modify embedded object values + or the free list.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE + ALSO</a></h1> +<p class="Pp"><a class="Xr">queue(3)</a>, <a class="Xr">tree(3)</a></p> +</section> +<section class="Sh"> +<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> +<p class="Pp">The <code class="Nm">ARB</code> macros first appeared in + <span class="Ux">FreeBSD 13.0</span>.</p> +</section> +<section class="Sh"> +<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> +<p class="Pp">The <code class="Nm">ARB</code> macros were implemented by + <span class="An">Lawrence Stewart</span> + <<a class="Mt" href="mailto:lstewart@FreeBSD.org">lstewart@FreeBSD.org</a>>, + based on <a class="Xr">tree(3)</a> macros written by + <br/> + <span class="An">Niels Provos</span>.</p> +</section> +</div> +<table class="foot"> + <tr> + <td class="foot-date">October 14, 2019</td> + <td class="foot-os">FreeBSD 15.0</td> + </tr> +</table> |
