summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/010/tree.tl8
-rw-r--r--tree.c13
-rw-r--r--tree.h1
-rw-r--r--txr.117
4 files changed, 39 insertions, 0 deletions
diff --git a/tests/010/tree.tl b/tests/010/tree.tl
index fde11300..6a1d4aa1 100644
--- a/tests/010/tree.tl
+++ b/tests/010/tree.tl
@@ -111,3 +111,11 @@
(tree-delete tr 17) 17
(tree-delete tr 18) 18
(tree-delete tr 19) 19)
+
+(set *tree-fun-whitelist* [list* '= '< *tree-fun-whitelist*])
+
+(let ((tr [tree '(1 2 3) identity < =]))
+ (mtest
+ tr #T((identity < =) 1 2 3)
+ (copy-search-tree tr) #T((identity < =) 1 2 3)
+ (make-similar-tree tr) #T((identity < =))))
diff --git a/tree.c b/tree.c
index 9a7044f0..47bbe8d6 100644
--- a/tree.c
+++ b/tree.c
@@ -711,6 +711,18 @@ val copy_search_tree(val tree)
return ntree;
}
+val make_similar_tree(val tree)
+{
+ val self = lit("make-similar-tree");
+ struct tree *ntr = coerce(struct tree *, malloc(sizeof *ntr));
+ struct tree *otr = coerce(struct tree *, cobj_handle(self, tree, tree_s));
+ val ntree = cobj(coerce(mem_t *, ntr), tree_s, &tree_ops);
+ *ntr = *otr;
+ ntr->root = nil;
+ ntr->size = ntr->max_size = 0;
+ return ntree;
+}
+
val treep(val obj)
{
return tnil(type(obj) == COBJ && obj->co.cls == tree_s);
@@ -834,6 +846,7 @@ void tree_init(void)
reg_fun(tree_s, func_n4o(tree, 0));
reg_fun(tree_construct_s, func_n2(tree_construct));
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-insert-node"), user_package), func_n2(tree_insert_node));
reg_fun(intern(lit("tree-insert"), user_package), func_n2(tree_insert));
diff --git a/tree.h b/tree.h
index 7b7c3ef0..d1b726c2 100644
--- a/tree.h
+++ b/tree.h
@@ -40,6 +40,7 @@ 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 copy_search_tree(val tree);
+val make_similar_tree(val tree);
val treep(val obj);
val tree_insert_node(val tree, val node);
val tree_begin(val tree);
diff --git a/txr.1 b/txr.1
index b7031a6c..69746dca 100644
--- a/txr.1
+++ b/txr.1
@@ -51774,6 +51774,23 @@ and contains the same elements.
The nodes held inside the new tree are freshly allocated,
but their key objects are shared with the original tree.
+.coNP Function @ make-similar-tree
+.synb
+.mets (make-similar-tree << tree )
+.syne
+.desc
+The
+.code copy-search-tree
+returns a new, empty search tree object.
+
+The
+.meta tree
+argument must be an object of type
+.codn tree .
+
+The returned object has the same key abstraction functions as
+.metn tree .
+
.coNP Functions @ tree-begin and @ tree-begin-at
.synb
.mets (tree-begin < tree )