diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2021-12-17 21:49:16 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2021-12-17 21:49:16 -0800 |
commit | 236a11759c4f0ccdd809621a990da2e0ae138def (patch) | |
tree | 0a5ec9f0155650d29cb0d4d705501835da418c35 /tree.h | |
parent | 3cbec98b7e80e75b4cd1e164c56c6e82ab0d7240 (diff) | |
download | txr-236a11759c4f0ccdd809621a990da2e0ae138def.tar.gz txr-236a11759c4f0ccdd809621a990da2e0ae138def.tar.bz2 txr-236a11759c4f0ccdd809621a990da2e0ae138def.zip |
tree: support for duplicate keys.
* tree.c (tr_insert): New argument for allowing duplicate.
If it is true, suppresses the case of replacing a node,
causing the logic to fall through to traversing right, so the
duplicate key effectively looks like it is greater than the
existing duplicates, and gets inserted as the rightmost
duplicate.
(tr_do_delete_specific, tr_delete_specific): New static functions.
(tree_insert_node): New parameter, passed to tr_insert.
(tree_insert): New parameter, passed to tree_insert_node.
(tree_delete_specific_node): New function.
(tree): New parameter to allow duplicate keys in the elements
sequence.
(tree_construct): Pass t to tree to allow duplicate elements.
(tree_init): Update registrations of tree, tree-insert and
tree-insert-node. Register tree-delete-specific-node function.
* tree.h (tree, tree_insert_node, tree_insert): Declarations
updated.
(tree_delete_specific_node): Declared.
* lib.c (seq): Pass t argument to tree_insert, allowing
duplicates.
* parser.c (circ_backpatch): Likewise.
* parser.y (tree): Pass t to new argument of tree, so
duplicates are preserved in the element list of the #T
literal.
* y.tab.c.shipped: Updated.
* tests/010/tree.tl: Test cases for duplicate keys.
* txr.1: Documented.
* stdlib/doc-syms.tl: Updated.
Diffstat (limited to 'tree.h')
-rw-r--r-- | tree.h | 7 |
1 files changed, 4 insertions, 3 deletions
@@ -40,17 +40,18 @@ val set_left(val node, val nleft); val set_right(val node, val nright); val set_key(val node, val nkey); val copy_tnode(val node); -val tree(val keys, val key_fn, val less_fn, val equal_fn); +val tree(val keys, val key_fn, val less_fn, val equal_fn, val dup); val copy_search_tree(val tree); val make_similar_tree(val tree); val treep(val obj); val tree_count(val tree); -val tree_insert_node(val tree, val node); -val tree_insert(val tree, val key); +val tree_insert_node(val tree, val node, val dup); +val tree_insert(val tree, val key, val dup); val tree_lookup_node(val tree, val key); val tree_lookup(val tree, val key); val tree_delete_node(val tree, val key); val tree_delete(val tree, val key); +val tree_delete_specific_node(val tree, val node); val tree_begin(val tree, val lowkey, val highkey); val copy_tree_iter(val iter); val replace_tree_iter(val diter, val siter); |