summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--share/txr/stdlib/doc-syms.tl4
-rw-r--r--tests/010/tree.tl15
-rw-r--r--tree.c33
-rw-r--r--tree.h2
-rw-r--r--txr.151
5 files changed, 104 insertions, 1 deletions
diff --git a/share/txr/stdlib/doc-syms.tl b/share/txr/stdlib/doc-syms.tl
index 7527b96d..243493a7 100644
--- a/share/txr/stdlib/doc-syms.tl
+++ b/share/txr/stdlib/doc-syms.tl
@@ -306,8 +306,8 @@
("lconsp" "N-02E217A2")
("cond" "N-016C9E24")
("truncate" "N-0032FBF3")
- ("define-accessor" "N-03C5F850")
("*print-base*" "N-01DD07CC")
+ ("define-accessor" "N-03C5F850")
("disassemble" "N-0289A0F1")
("set-prop" "N-03663AE4")
("split-str-set" "N-0296195B")
@@ -1848,6 +1848,7 @@
("ensure-dir" "N-00C543B8")
("cases" "N-039458F2")
("pset" "N-008211EC")
+ ("tree-reset-at" "N-029EF2F3")
("require" "D-0074")
("match-case" "N-012DEAC3")
("mod" "D-0075")
@@ -1925,6 +1926,7 @@
("ends-with" "N-004955D4")
("floatp" "N-03E9D6E1")
("digpow" "N-030C5561")
+ ("tree-reset" "N-029EF2F3")
("setresgid" "N-027671E8")
("with-gensyms" "N-034F045B")
("*-20" "N-02B67C9B")
diff --git a/tests/010/tree.tl b/tests/010/tree.tl
index 83b3172c..fde11300 100644
--- a/tests/010/tree.tl
+++ b/tests/010/tree.tl
@@ -40,6 +40,14 @@
(add (key n))))
(range 0 19))
+(vtest (build (for* ((j (tree-begin tr))
+ (i (progn (tree-next j) (tree-next j) (tree-reset j tr)))
+ (n (tree-next i)))
+ (n)
+ ((set n (tree-next i)))
+ (add (key n))))
+ (range 0 19))
+
(defvarl trc (copy-search-tree tr))
(vtest trc tr)
@@ -71,6 +79,13 @@
(add (key n))))
(range 8 19))
+(vtest (build (for* ((i (tree-reset-at (tree-begin #T(())) tr 8))
+ (n (tree-next i)))
+ (n)
+ ((set n (tree-next i)))
+ (add (key n))))
+ (range 8 19))
+
(test (tree-next (tree-begin-at tr 20)) nil)
(test (tree-next (tree-begin-at #T(()) 0)) nil)
diff --git a/tree.c b/tree.c
index 0a1e9d04..9a7044f0 100644
--- a/tree.c
+++ b/tree.c
@@ -762,6 +762,37 @@ val tree_begin_at(val tree, val lowkey)
return iter;
}
+val tree_reset(val iter, val tree)
+{
+ val self = lit("tree-reset");
+ struct tree *tr = coerce(struct tree *, cobj_handle(self, tree, tree_s));
+ struct tree_diter *tdi = coerce(struct tree_diter *,
+ cobj_handle(self, iter, tree_iter_s));
+ const struct tree_iter it = tree_iter_init(0);
+
+ tdi->ti = it;
+ set(mkloc(tdi->ti.self, iter), iter);
+ set(mkloc(tdi->lastnode, iter), tr->root);
+
+ return iter;
+}
+
+val tree_reset_at(val iter, val tree, val lowkey)
+{
+ val self = lit("tree-reset-at");
+ struct tree *tr = coerce(struct tree *, cobj_handle(self, tree, tree_s));
+ struct tree_diter *tdi = coerce(struct tree_diter *,
+ cobj_handle(self, iter, tree_iter_s));
+ const struct tree_iter it = tree_iter_init(0);
+
+ tdi->ti = it;
+ tdi->lastnode = tr->root;
+
+ tn_find_low(tr->root, tdi, tr, lowkey);
+
+ return iter;
+}
+
val tree_next(val iter)
{
val self = lit("tree-next");
@@ -813,6 +844,8 @@ void tree_init(void)
reg_fun(intern(lit("tree-root"), user_package), func_n1(tree_root));
reg_fun(intern(lit("tree-begin"), user_package), func_n1(tree_begin));
reg_fun(intern(lit("tree-begin-at"), user_package), func_n2(tree_begin_at));
+ reg_fun(intern(lit("tree-reset"), user_package), func_n2(tree_reset));
+ reg_fun(intern(lit("tree-reset-at"), user_package), func_n3(tree_reset_at));
reg_fun(intern(lit("tree-next"), user_package), func_n1(tree_next));
reg_fun(intern(lit("tree-clear"), user_package), func_n1(tree_clear));
reg_var(tree_fun_whitelist_s, list(identity_s, equal_s, less_s, nao));
diff --git a/tree.h b/tree.h
index a0d12692..7b7c3ef0 100644
--- a/tree.h
+++ b/tree.h
@@ -44,6 +44,8 @@ val treep(val obj);
val tree_insert_node(val tree, val node);
val tree_begin(val tree);
val tree_begin_at(val tree, val lowkey);
+val tree_reset(val iter, val tree);
+val tree_reset_at(val iter, val tree, val lowkey);
val tree_next(val iter);
val tree_clear(val tree);
void tree_init(void);
diff --git a/txr.1 b/txr.1
index 1cc8bdc5..e556666e 100644
--- a/txr.1
+++ b/txr.1
@@ -51573,6 +51573,57 @@ function to the
.code tree-iter
object.
+.coNP Functions @ tree-reset and @ tree-reset-at
+.synb
+.mets (tree-reset < iter < tree )
+.mets (tree-reset-at < iter < tree << low-key )
+.syne
+.desc
+The
+.code tree-reset
+and
+.code tree-reset-at
+functions are closely analogous to
+.code tree-begin
+and
+.codn tree-begin-at ,
+respectively. These functions do not create a new iterator object.
+
+The
+.meta iter
+argument must be an existing
+.code tree-iter
+object, previously returned by a call to either
+.code tree-begin
+or
+.codn tree-begin-at .
+Regardless of its current state, the
+.meta iter
+object is re-initialized to traverse the specified
+.metn tree ,
+and is then returned.
+
+The
+.code tree-reset
+function prepares
+.meta iter
+to traverse in the same manner as would new iterator returned by
+.code tree-begin
+for the
+.meta tree
+argument.
+The
+.code tree-begin-at
+function similarly prepares
+.meta iter
+to traverse in the same manner as a new iterator returned by
+.code tree-begin-at
+for the
+.meta tree
+and
+.meta low-key
+arguments.
+
.coNP Function @ tree-next
.synb
.mets (tree-next < iter )