[Quipu-dev] quipu/quipu: Improve tree's interface (incomplete)

Back to archive index

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,




More information about the Quipu-dev mailing list
Back to archive index