summaryrefslogtreecommitdiffstats
path: root/tree.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2021-12-17 20:37:34 -0800
committerKaz Kylheku <kaz@kylheku.com>2021-12-17 20:37:34 -0800
commit3cbec98b7e80e75b4cd1e164c56c6e82ab0d7240 (patch)
tree3325cd36e631fe07b2c4e67b4ef1605a81a1f870 /tree.c
parentf0493b337617d403dc572975784f1a54c741a76e (diff)
downloadtxr-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.
Diffstat (limited to 'tree.c')
-rw-r--r--tree.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/tree.c b/tree.c
index 3df5ddf6..6adcdd7d 100644
--- a/tree.c
+++ b/tree.c
@@ -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));