From 4dcee54de4d6e749f33d8ebf85696cd0786ee014 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Fri, 17 Dec 2021 20:37:34 -0800 Subject: 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. --- lib.c | 2 ++ tests/010/tree.tl | 12 ++++++++++-- tree.c | 8 ++++++++ tree.h | 1 + txr.1 | 12 ++++++++++++ 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 ) -- cgit v1.2.3