diff options
-rw-r--r-- | share/txr/stdlib/doc-syms.tl | 4 | ||||
-rw-r--r-- | tests/010/tree.tl | 15 | ||||
-rw-r--r-- | tree.c | 33 | ||||
-rw-r--r-- | tree.h | 2 | ||||
-rw-r--r-- | txr.1 | 51 |
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) @@ -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)); @@ -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); @@ -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 ) |