| Motivation | 
 | ========== | 
 |  | 
 | Treaps provide a memory-efficient binary search tree structure. | 
 | Insertion/deletion/search are about as about as fast in the average | 
 | case as red-black trees and the chances of worst-case behavior are | 
 | vanishingly small, thanks to (pseudo-)randomness.  The bad worst-case | 
 | behavior is a small price to pay, given that treaps are much simpler | 
 | to implement. | 
 |  | 
 | API | 
 | === | 
 |  | 
 | The trp API generates a data structure and functions to handle a | 
 | large growing set of objects stored in a pool. | 
 |  | 
 | The caller: | 
 |  | 
 | . Specifies parameters for the generated functions with the | 
 |   trp_gen(static, foo_, ...) macro. | 
 |  | 
 | . Allocates a `struct trp_root` variable and sets it to {~0}. | 
 |  | 
 | . Adds new nodes to the set using `foo_insert`.  Any pointers | 
 |   to existing nodes cannot be relied upon any more, so the caller | 
 |   might retrieve them anew with `foo_pointer`. | 
 |  | 
 | . Can find a specific item in the set using `foo_search`. | 
 |  | 
 | . Can iterate over items in the set using `foo_first` and `foo_next`. | 
 |  | 
 | . Can remove an item from the set using `foo_remove`. | 
 |  | 
 | Example: | 
 |  | 
 | ---- | 
 | struct ex_node { | 
 | 	const char *s; | 
 | 	struct trp_node ex_link; | 
 | }; | 
 | static struct trp_root ex_base = {~0}; | 
 | obj_pool_gen(ex, struct ex_node, 4096); | 
 | trp_gen(static, ex_, struct ex_node, ex_link, ex, strcmp) | 
 | struct ex_node *item; | 
 |  | 
 | item = ex_pointer(ex_alloc(1)); | 
 | item->s = "hello"; | 
 | ex_insert(&ex_base, item); | 
 | item = ex_pointer(ex_alloc(1)); | 
 | item->s = "goodbye"; | 
 | ex_insert(&ex_base, item); | 
 | for (item = ex_first(&ex_base); item; item = ex_next(&ex_base, item)) | 
 | 	printf("%s\n", item->s); | 
 | ---- | 
 |  | 
 | Functions | 
 | --------- | 
 |  | 
 | trp_gen(attr, foo_, node_type, link_field, pool, cmp):: | 
 |  | 
 | 	Generate a type-specific treap implementation. | 
 | + | 
 | . The storage class for generated functions will be 'attr' (e.g., `static`). | 
 | . Generated function names are prefixed with 'foo_' (e.g., `treap_`). | 
 | . Treap nodes will be of type 'node_type' (e.g., `struct treap_node`). | 
 |   This type must be a struct with at least one `struct trp_node` field | 
 |   to point to its children. | 
 | . The field used to access child nodes will be 'link_field'. | 
 | . All treap nodes must lie in the 'pool' object pool. | 
 | . Treap nodes must be totally ordered by the 'cmp' relation, with the | 
 |   following prototype: | 
 | + | 
 | int (*cmp)(node_type \*a, node_type \*b) | 
 | + | 
 | and returning a value less than, equal to, or greater than zero | 
 | according to the result of comparison. | 
 |  | 
 | node_type {asterisk}foo_insert(struct trp_root *treap, node_type \*node):: | 
 |  | 
 | 	Insert node into treap.  If inserted multiple times, | 
 | 	a node will appear in the treap multiple times. | 
 | + | 
 | The return value is the address of the node within the treap, | 
 | which might differ from `node` if `pool_alloc` had to call | 
 | `realloc` to expand the pool. | 
 |  | 
 | void foo_remove(struct trp_root *treap, node_type \*node):: | 
 |  | 
 | 	Remove node from treap.  Caller must ensure node is | 
 | 	present in treap before using this function. | 
 |  | 
 | node_type *foo_search(struct trp_root \*treap, node_type \*key):: | 
 |  | 
 | 	Search for a node that matches key.  If no match is found, | 
 | 	result is NULL. | 
 |  | 
 | node_type *foo_nsearch(struct trp_root \*treap, node_type \*key):: | 
 |  | 
 | 	Like `foo_search`, but if the key is missing return what | 
 | 	would be key's successor, were key in treap (NULL if no | 
 | 	successor). | 
 |  | 
 | node_type *foo_first(struct trp_root \*treap):: | 
 |  | 
 | 	Find the first item from the treap, in sorted order. | 
 |  | 
 | node_type *foo_next(struct trp_root \*treap, node_type \*node):: | 
 |  | 
 | 	Find the next item. |