summaryrefslogtreecommitdiffstats
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
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.
-rw-r--r--lib.c2
-rw-r--r--tests/010/tree.tl12
-rw-r--r--tree.c8
-rw-r--r--tree.h1
-rw-r--r--txr.112
5 files changed, 33 insertions, 2 deletions
diff --git a/lib.c b/lib.c
index dca7474d..1bcd9ffc 100644
--- a/lib.c
+++ b/lib.c
@@ -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))
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));
diff --git a/tree.h b/tree.h
index 1443a73f..b0b85801 100644
--- a/tree.h
+++ b/tree.h
@@ -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);
diff --git a/txr.1 b/txr.1
index 92e322bb..990b9522 100644
--- a/txr.1
+++ b/txr.1
@@ -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 )