Skip to content
Snippets Groups Projects
Commit 22d11e1a authored by Craig Tiller's avatar Craig Tiller
Browse files

Reduce code size for AVL tree

By rewriting a few stanza's to give the compiler more flexibility in
order of operations, reduce code size by about 1kb.
parent 9c721ff3
No related branches found
No related tags found
No related merge requests found
...@@ -86,9 +86,7 @@ static gpr_avl_node *assert_invariants(gpr_avl_node *n) { ...@@ -86,9 +86,7 @@ static gpr_avl_node *assert_invariants(gpr_avl_node *n) {
return n; return n;
} }
#else #else
static gpr_avl_node *assert_invariants(gpr_avl_node *n) { static gpr_avl_node *assert_invariants(gpr_avl_node *n) { return n; }
return n;
}
#endif #endif
gpr_avl_node *new_node(void *key, void *value, gpr_avl_node *left, gpr_avl_node *new_node(void *key, void *value, gpr_avl_node *left,
...@@ -201,28 +199,21 @@ static gpr_avl_node *rebalance(const gpr_avl_vtable *vtable, void *key, ...@@ -201,28 +199,21 @@ static gpr_avl_node *rebalance(const gpr_avl_vtable *vtable, void *key,
static gpr_avl_node *add(const gpr_avl_vtable *vtable, gpr_avl_node *node, static gpr_avl_node *add(const gpr_avl_vtable *vtable, gpr_avl_node *node,
void *key, void *value) { void *key, void *value) {
long cmp; long cmp;
gpr_avl_node *l;
gpr_avl_node *r;
if (node == NULL) { if (node == NULL) {
return new_node(key, value, NULL, NULL); return new_node(key, value, NULL, NULL);
} }
cmp = vtable->compare_keys(node->key, key); cmp = vtable->compare_keys(node->key, key);
if (cmp == 0) { if (cmp == 0) {
return assert_invariants( return new_node(key, value, ref_node(node->left), ref_node(node->right));
new_node(key, value, ref_node(node->left), ref_node(node->right))); } else if (cmp > 0) {
} return rebalance(vtable, vtable->copy_key(node->key),
vtable->copy_value(node->value),
l = node->left; add(vtable, node->left, key, value), ref_node(node->right));
r = node->right;
if (cmp > 0) {
l = add(vtable, l, key, value);
ref_node(r);
} else { } else {
r = add(vtable, r, key, value); return rebalance(vtable, vtable->copy_key(node->key),
ref_node(l); vtable->copy_value(node->value), ref_node(node->left),
add(vtable, node->right, key, value));
} }
return rebalance(vtable, vtable->copy_key(node->key),
vtable->copy_value(node->value), l, r);
} }
gpr_avl gpr_avl_add(gpr_avl avl, void *key, void *value) { gpr_avl gpr_avl_add(gpr_avl avl, void *key, void *value) {
...@@ -250,8 +241,6 @@ static gpr_avl_node *in_order_tail(gpr_avl_node *node) { ...@@ -250,8 +241,6 @@ static gpr_avl_node *in_order_tail(gpr_avl_node *node) {
static gpr_avl_node *remove(const gpr_avl_vtable *vtable, gpr_avl_node *node, static gpr_avl_node *remove(const gpr_avl_vtable *vtable, gpr_avl_node *node,
void *key) { void *key) {
long cmp; long cmp;
gpr_avl_node *l;
gpr_avl_node *r;
if (node == NULL) { if (node == NULL) {
return NULL; return NULL;
} }
...@@ -263,30 +252,22 @@ static gpr_avl_node *remove(const gpr_avl_vtable *vtable, gpr_avl_node *node, ...@@ -263,30 +252,22 @@ static gpr_avl_node *remove(const gpr_avl_vtable *vtable, gpr_avl_node *node,
return ref_node(node->left); return ref_node(node->left);
} else if (node->left->height < node->right->height) { } else if (node->left->height < node->right->height) {
gpr_avl_node *h = in_order_head(node->right); gpr_avl_node *h = in_order_head(node->right);
l = ref_node(node->left); return rebalance(vtable, vtable->copy_key(h->key),
r = remove(vtable, node->right, h->key); vtable->copy_value(h->value), ref_node(node->left), remove(vtable, node->right, h->key));
return assert_invariants(rebalance(vtable, vtable->copy_key(h->key),
vtable->copy_value(h->value), l, r));
} else { } else {
gpr_avl_node *h = in_order_tail(node->left); gpr_avl_node *h = in_order_tail(node->left);
l = remove(vtable, node->left, h->key); return rebalance(vtable, vtable->copy_key(h->key),
r = ref_node(node->right); vtable->copy_value(h->value), remove(vtable, node->left, h->key), ref_node(node->right));
return assert_invariants(rebalance(vtable, vtable->copy_key(h->key),
vtable->copy_value(h->value), l, r));
} }
} } else if (cmp > 0) {
return rebalance(vtable, vtable->copy_key(node->key),
l = node->left; vtable->copy_value(node->value),
r = node->right; remove(vtable, node->left, key), ref_node(node->right));
if (cmp > 0) {
l = remove(vtable, l, key);
ref_node(r);
} else { } else {
r = remove(vtable, r, key); return rebalance(vtable, vtable->copy_key(node->key),
ref_node(l); vtable->copy_value(node->value), ref_node(node->left),
remove(vtable, node->right, key));
} }
return rebalance(vtable, vtable->copy_key(node->key),
vtable->copy_value(node->value), l, r);
} }
gpr_avl gpr_avl_remove(gpr_avl avl, void *key) { gpr_avl gpr_avl_remove(gpr_avl avl, void *key) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment