diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2021-12-17 20:37:34 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2021-12-17 20:37:34 -0800 |
commit | 3cbec98b7e80e75b4cd1e164c56c6e82ab0d7240 (patch) | |
tree | 3325cd36e631fe07b2c4e67b4ef1605a81a1f870 | |
parent | f0493b337617d403dc572975784f1a54c741a76e (diff) | |
download | txr-3cbec98b7e80e75b4cd1e164c56c6e82ab0d7240.tar.gz txr-3cbec98b7e80e75b4cd1e164c56c6e82ab0d7240.tar.bz2 txr-3cbec98b7e80e75b4cd1e164c56c6e82ab0d7240.zip |
tree-count: new function.
* tree.c (tree_count): New function.
(tree_init): tree-count intrinsic registered.
* tree.h (tree_count): Declared.
* lib.c (length): Support search tree argument via tree_count.
* tests/010/tree.tl: Test cases for tree-count, indirectly via len.
* txr.1: Documented.
-rw-r--r-- | lib.c | 2 | ||||
-rw-r--r-- | tests/010/tree.tl | 12 | ||||
-rw-r--r-- | tree.c | 8 | ||||
-rw-r--r-- | tree.h | 1 | ||||
-rw-r--r-- | txr.1 | 12 |
5 files changed, 33 insertions, 2 deletions
@@ -12253,6 +12253,8 @@ val length(val seq) return hash_count(seq); if (seq->co.cls == carray_cls) return length_carray(seq); + if (seq->co.cls == tree_cls) + return tree_count(seq); if (obj_struct_p(seq)) { val length_meth = get_special_slot(seq, length_m); diff --git a/tests/010/tree.tl b/tests/010/tree.tl index 06d02ce6..f5bfac42 100644 --- a/tests/010/tree.tl +++ b/tests/010/tree.tl @@ -5,8 +5,16 @@ (test tr #T(())) -(test (treep tr) t) -(test (treep 42) nil) +(mtest + (treep tr) t + (treep 42) nil) + +(mtest + (len #T()) 0 + (len #T(() 1)) 1 + (len #T(() 1 2)) 2 + (len #T(() 1 2 3)) 3 + (len #T(() 1 1 1)) 3) (each ((n keys)) (tree-insert tr n)) @@ -769,6 +769,13 @@ val treep(val obj) return tnil(type(obj) == COBJ && obj->co.cls == tree_cls); } +val tree_count(val tree) +{ + val self = lit("tree-count"); + struct tree *tr = coerce(struct tree *, cobj_handle(self, tree, tree_cls)); + return unum(tr->size); +} + static void tree_iter_mark(val tree_iter) { struct tree_diter *tdi = coerce(struct tree_diter *, tree_iter->co.handle); @@ -991,6 +998,7 @@ void tree_init(void) reg_fun(intern(lit("copy-search-tree"), user_package), func_n1(copy_search_tree)); reg_fun(intern(lit("make-similar-tree"), user_package), func_n1(make_similar_tree)); reg_fun(intern(lit("treep"), user_package), func_n1(treep)); + reg_fun(intern(lit("tree-count"), user_package), func_n1(tree_count)); reg_fun(intern(lit("tree-insert-node"), user_package), func_n2(tree_insert_node)); reg_fun(intern(lit("tree-insert"), user_package), func_n2(tree_insert)); reg_fun(intern(lit("tree-lookup-node"), user_package), func_n2(tree_lookup_node)); @@ -44,6 +44,7 @@ val tree(val keys, val key_fn, val less_fn, val equal_fn); 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_lookup_node(val tree, val key); @@ -54083,6 +54083,18 @@ if is a tree. Otherwise, it returns .codn nil . +.coNP Function @ tree-count +.synb +.mets (tree-count << tree ) +.syne +.desc +The +.code tree-count +function returns an integer indicating the number of nodes currently +inserted into +.metn tree , +which must be a search tree object. + .coNP Function @ tree-insert-node .synb .mets (tree-insert-node < tree << node ) |