projects
/
collectd.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
curl_json plugin: Rewrite logic to add a path to db->tree.
[collectd.git]
/
src
/
utils_avltree.c
diff --git
a/src/utils_avltree.c
b/src/utils_avltree.c
index
9f0b796
..
139d23a
100644
(file)
--- a/
src/utils_avltree.c
+++ b/
src/utils_avltree.c
@@
-51,6
+51,7
@@
struct c_avl_tree_s
{
c_avl_node_t *root;
int (*compare) (const void *, const void *);
{
c_avl_node_t *root;
int (*compare) (const void *, const void *);
+ int size;
};
struct c_avl_iterator_s
};
struct c_avl_iterator_s
@@
-141,6
+142,9
@@
static c_avl_node_t *rotate_right (c_avl_tree_t *t, c_avl_node_t *x)
c_avl_node_t *y;
c_avl_node_t *b;
c_avl_node_t *y;
c_avl_node_t *b;
+ assert (x != NULL);
+ assert (x->left != NULL);
+
p = x->parent;
y = x->left;
b = y->right;
p = x->parent;
y = x->left;
b = y->right;
@@
-165,7
+169,7
@@
static c_avl_node_t *rotate_right (c_avl_tree_t *t, c_avl_node_t *x)
y->height = calc_height (y);
return (y);
y->height = calc_height (y);
return (y);
-} /* void rotate_
lef
t */
+} /* void rotate_
righ
t */
/*
* (x) (y)
/*
* (x) (y)
@@
-182,6
+186,9
@@
static c_avl_node_t *rotate_left (c_avl_tree_t *t, c_avl_node_t *x)
c_avl_node_t *y;
c_avl_node_t *b;
c_avl_node_t *y;
c_avl_node_t *b;
+ assert (x != NULL);
+ assert (x->right != NULL);
+
p = x->parent;
y = x->right;
b = y->left;
p = x->parent;
y = x->right;
b = y->left;
@@
-479,12
+486,15
@@
c_avl_tree_t *c_avl_create (int (*compare) (const void *, const void *))
t->root = NULL;
t->compare = compare;
t->root = NULL;
t->compare = compare;
+ t->size = 0;
return (t);
}
void c_avl_destroy (c_avl_tree_t *t)
{
return (t);
}
void c_avl_destroy (c_avl_tree_t *t)
{
+ if (t == NULL)
+ return;
free_node (t->root);
free (t);
}
free_node (t->root);
free (t);
}
@@
-508,6
+518,7
@@
int c_avl_insert (c_avl_tree_t *t, void *key, void *value)
{
new->parent = NULL;
t->root = new;
{
new->parent = NULL;
t->root = new;
+ t->size = 1;
return (0);
}
return (0);
}
@@
-553,6
+564,7
@@
int c_avl_insert (c_avl_tree_t *t, void *key, void *value)
} /* while (42) */
verify_tree (t->root);
} /* while (42) */
verify_tree (t->root);
+ ++t->size;
return (0);
} /* int c_avl_insert */
return (0);
} /* int c_avl_insert */
@@
-574,6
+586,7
@@
int c_avl_remove (c_avl_tree_t *t, const void *key, void **rkey, void **rvalue)
status = _remove (t, n);
verify_tree (t->root);
status = _remove (t, n);
verify_tree (t->root);
+ --t->size;
return (status);
} /* void *c_avl_remove */
return (status);
} /* void *c_avl_remove */
@@
-581,6
+594,8
@@
int c_avl_get (c_avl_tree_t *t, const void *key, void **value)
{
c_avl_node_t *n;
{
c_avl_node_t *n;
+ assert (t != NULL);
+
n = search (t, key);
if (n == NULL)
return (-1);
n = search (t, key);
if (n == NULL)
return (-1);
@@
-604,10
+619,18
@@
int c_avl_pick (c_avl_tree_t *t, void **key, void **value)
n = t->root;
while ((n->left != NULL) || (n->right != NULL))
{
n = t->root;
while ((n->left != NULL) || (n->right != NULL))
{
- int height_left = (n->left == NULL) ? 0 : n->left->height;
- int height_right = (n->right == NULL) ? 0 : n->right->height;
+ if (n->left == NULL)
+ {
+ n = n->right;
+ continue;
+ }
+ else if (n->right == NULL)
+ {
+ n = n->left;
+ continue;
+ }
- if (
height_left > height_r
ight)
+ if (
n->left->height > n->right->he
ight)
n = n->left;
else
n = n->right;
n = n->left;
else
n = n->right;
@@
-625,6
+648,7
@@
int c_avl_pick (c_avl_tree_t *t, void **key, void **value)
*value = n->value;
free_node (n);
*value = n->value;
free_node (n);
+ --t->size;
rebalance (t, p);
return (0);
rebalance (t, p);
return (0);
@@
-708,3
+732,10
@@
void c_avl_iterator_destroy (c_avl_iterator_t *iter)
{
free (iter);
}
{
free (iter);
}
+
+int c_avl_size (c_avl_tree_t *t)
+{
+ if (t == NULL)
+ return (0);
+ return (t->size);
+}