scmno****@osdn*****
scmno****@osdn*****
Thu Jun 7 07:40:50 JST 2018
changeset 1a2b2182deb3 in quipu/quipu details: http://hg.osdn.jp/view/quipu/quipu?cmd=changeset;node=1a2b2182deb3 user: Agustina Arzille <avarz****@riseu*****> date: Wed Jun 06 19:40:41 2018 -0300 description: Improve tree's interface (incomplete) diffstat: tree.cpp | 27 +++++++++++++++------------ tree.h | 2 +- 2 files changed, 16 insertions(+), 13 deletions(-) diffs (120 lines): diff -r 5a8261f71055 -r 1a2b2182deb3 tree.cpp --- a/tree.cpp Wed Jun 06 17:27:16 2018 -0300 +++ b/tree.cpp Wed Jun 06 19:40:41 2018 -0300 @@ -124,14 +124,14 @@ return (as_int (interp->retval)); } -static bool +static object find_preds_lk (interpreter *interp, tree *tp, tree_args& ap, int n, object key, int unlink) { int d = -1; ap.pred = tp->head; - ap.item = UNBOUND; + ap.item = ap.other = UNBOUND; for (int lvl = tp->hi_water - 1; lvl >= 0; --lvl) { @@ -145,6 +145,7 @@ if (d >= 0) { + ap.other = ap.item; if (d == 0 && unlink != UNLINK_NONE) { node_next(ap.pred, lvl) = ap.next; @@ -168,10 +169,10 @@ } } - return (d == 0); + return (d == 0 ? node_key (ap.other) : UNBOUND); } -static bool +static object tree_get_lk (interpreter *interp, tree *tp, tree_args& ap, object key) { @@ -184,7 +185,7 @@ { int n = rand_levels (interp, tp); - if (find_preds_lk (interp, tp, ap, n, key, UNLINK_NONE)) + if (find_preds_lk (interp, tp, ap, n, key, UNLINK_NONE) != UNBOUND) return (false); object nval = make_node (interp, n, key); @@ -205,7 +206,7 @@ tree_args& ap, object key) { bool ret = find_preds_lk (interp, tp, ap, - tp->hi_water, key, UNLINK_FORCE); + tp->hi_water, key, UNLINK_FORCE) != UNBOUND; if (ret) --tp->cnt; @@ -280,10 +281,10 @@ } } - return (d == 0 ? ap.item : UNBOUND); + return (d == 0 ? node_key (ap.item) : UNBOUND); } -static bool +static object tree_get_mt (interpreter *interp, tree *tp, tree_args& ap, object key) { @@ -294,12 +295,15 @@ tree_put_mt (interpreter *interp, tree *tp, tree_args& ap, object key) { + object nval = UNBOUND; retry: int n = rand_levels (interp, tp); if (find_preds_mt (interp, tp, ap, n, key, UNLINK_ASSIST) != UNBOUND) return (false); - object nval = make_node (interp, n, key); + if (nval == UNBOUND) + nval = make_node (interp, n, key); + ap.next = node_next (nval, 0) = *ap.l_succs; for (int lvl = 1; lvl < n; ++lvl) node_next(nval, lvl) = ap.l_succs[lvl]; @@ -389,7 +393,7 @@ tree_args name (sp, prd, scc); \ valref tmp (interp, (array).as_obj ()) -bool tree_get (interpreter *interp, object tr, +object tree_get (interpreter *interp, object tr, object key, bool mtsafe) { array ar; @@ -406,8 +410,7 @@ if (dfl != UNBOUND) interp->raise_nargs ("tree:get", 2, 2, 3); - qp_return (tree_get (interp, tr, key, - !singlethr_p ()) ? QP_S (t) : NIL); + qp_return (tree_get (interp, tr, key, !singlethr_p ())); } bool tree_put (interpreter *interp, object tr, diff -r 5a8261f71055 -r 1a2b2182deb3 tree.h --- a/tree.h Wed Jun 06 17:27:16 2018 -0300 +++ b/tree.h Wed Jun 06 19:40:41 2018 -0300 @@ -41,7 +41,7 @@ QP_EXPORT object alloc_tree (interpreter *__interp, object __tst); -QP_EXPORT bool tree_get (interpreter *__interp, +QP_EXPORT object tree_get (interpreter *__interp, object __tree, object __key, bool __mtsafe); QP_EXPORT object get_o (interpreter *__interp,