chiark / gitweb /
added rb_tree_shift_keys
authorstevenj <stevenj@alum.mit.edu>
Thu, 6 Sep 2007 02:00:18 +0000 (22:00 -0400)
committerstevenj <stevenj@alum.mit.edu>
Thu, 6 Sep 2007 02:00:18 +0000 (22:00 -0400)
darcs-hash:20070906020018-c8de0-ebbcf31bebdb208a5d1ff57aca14a3994f08f549.gz

util/redblack.c
util/redblack.h

index 44faf2d2f9267e4e8264fc636a6a97f643f2b788..4fb4a4d586679729d55228952500dad39b9a1a2c 100644 (file)
@@ -371,3 +371,16 @@ rb_node *rb_tree_resort(rb_tree *t, rb_node *n)
      insert_node(t, n);
      return n;
 }
+
+/* shift all key pointers by kshift ... this is useful when the keys
+   are pointers into another array, that has been resized with realloc */
+static void shift_keys(rb_node *n, ptrdiff_t kshift) /* assumes n != NIL */
+{
+     n->k += kshift;
+     if (n->l != NIL) shift_keys(n->l, kshift);
+     if (n->r != NIL) shift_keys(n->r, kshift);
+}
+void rb_tree_shift_keys(rb_tree *t, ptrdiff_t kshift)
+{
+     if (t->root != NIL) shift_keys(t->root, kshift);
+}
index 8fc9ae41f68da0485d5f67c91101dbe6838e17dd..d428d640a71104239eb7a139c17eb01b0bbd57ef 100644 (file)
@@ -1,6 +1,8 @@
 #ifndef REDBLACK_H
 #define REDBLACK_H
 
+#include <stddef.h> /* for ptrdiff_t */
+
 #ifdef __cplusplus
 extern "C"
 {
@@ -38,6 +40,7 @@ extern rb_node *rb_tree_min(rb_tree *t);
 extern rb_node *rb_tree_max(rb_tree *t);
 extern rb_node *rb_tree_succ(rb_node *n);
 extern rb_node *rb_tree_pred(rb_node *n);
+extern void rb_tree_shift_keys(rb_tree *t, ptrdiff_t kshift);
 
 /* To change a key, use rb_tree_find+resort.  Removing a node
    currently wastes memory unless you change the allocation scheme