summaryrefslogtreecommitdiffstats
path: root/tree.h
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2021-12-17 21:49:16 -0800
committerKaz Kylheku <kaz@kylheku.com>2021-12-17 21:49:16 -0800
commit236a11759c4f0ccdd809621a990da2e0ae138def (patch)
tree0a5ec9f0155650d29cb0d4d705501835da418c35 /tree.h
parent3cbec98b7e80e75b4cd1e164c56c6e82ab0d7240 (diff)
downloadtxr-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.h7
1 files changed, 4 insertions, 3 deletions
diff --git a/tree.h b/tree.h
index b0b85801..ad1b2327 100644
--- a/tree.h
+++ b/tree.h
@@ -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);