|  | @@ -86,9 +86,7 @@ static gpr_avl_node *assert_invariants(gpr_avl_node *n) {
 | 
	
		
			
				|  |  |    return n;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  #else
 | 
	
		
			
				|  |  | -static gpr_avl_node *assert_invariants(gpr_avl_node *n) {
 | 
	
		
			
				|  |  | -  return n;
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +static gpr_avl_node *assert_invariants(gpr_avl_node *n) { return n; }
 | 
	
		
			
				|  |  |  #endif
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  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,
 | 
	
		
			
				|  |  |  static gpr_avl_node *add(const gpr_avl_vtable *vtable, gpr_avl_node *node,
 | 
	
		
			
				|  |  |                           void *key, void *value) {
 | 
	
		
			
				|  |  |    long cmp;
 | 
	
		
			
				|  |  | -  gpr_avl_node *l;
 | 
	
		
			
				|  |  | -  gpr_avl_node *r;
 | 
	
		
			
				|  |  |    if (node == NULL) {
 | 
	
		
			
				|  |  |      return new_node(key, value, NULL, NULL);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    cmp = vtable->compare_keys(node->key, key);
 | 
	
		
			
				|  |  |    if (cmp == 0) {
 | 
	
		
			
				|  |  | -    return assert_invariants(
 | 
	
		
			
				|  |  | -        new_node(key, value, ref_node(node->left), ref_node(node->right)));
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  l = node->left;
 | 
	
		
			
				|  |  | -  r = node->right;
 | 
	
		
			
				|  |  | -  if (cmp > 0) {
 | 
	
		
			
				|  |  | -    l = add(vtable, l, key, value);
 | 
	
		
			
				|  |  | -    ref_node(r);
 | 
	
		
			
				|  |  | +    return 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),
 | 
	
		
			
				|  |  | +                     add(vtable, node->left, key, value), ref_node(node->right));
 | 
	
		
			
				|  |  |    } else {
 | 
	
		
			
				|  |  | -    r = add(vtable, r, key, value);
 | 
	
		
			
				|  |  | -    ref_node(l);
 | 
	
		
			
				|  |  | +    return rebalance(vtable, vtable->copy_key(node->key),
 | 
	
		
			
				|  |  | +                     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) {
 | 
	
	
		
			
				|  | @@ -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,
 | 
	
		
			
				|  |  |                              void *key) {
 | 
	
		
			
				|  |  |    long cmp;
 | 
	
		
			
				|  |  | -  gpr_avl_node *l;
 | 
	
		
			
				|  |  | -  gpr_avl_node *r;
 | 
	
		
			
				|  |  |    if (node == NULL) {
 | 
	
		
			
				|  |  |      return NULL;
 | 
	
		
			
				|  |  |    }
 | 
	
	
		
			
				|  | @@ -263,30 +252,22 @@ static gpr_avl_node *remove(const gpr_avl_vtable *vtable, gpr_avl_node *node,
 | 
	
		
			
				|  |  |        return ref_node(node->left);
 | 
	
		
			
				|  |  |      } else if (node->left->height < node->right->height) {
 | 
	
		
			
				|  |  |        gpr_avl_node *h = in_order_head(node->right);
 | 
	
		
			
				|  |  | -      l = ref_node(node->left);
 | 
	
		
			
				|  |  | -      r = remove(vtable, node->right, h->key);
 | 
	
		
			
				|  |  | -      return assert_invariants(rebalance(vtable, vtable->copy_key(h->key),
 | 
	
		
			
				|  |  | -                                         vtable->copy_value(h->value), l, r));
 | 
	
		
			
				|  |  | +      return rebalance(vtable, vtable->copy_key(h->key),
 | 
	
		
			
				|  |  | +                       vtable->copy_value(h->value), ref_node(node->left), remove(vtable, node->right, h->key));
 | 
	
		
			
				|  |  |      } else {
 | 
	
		
			
				|  |  |        gpr_avl_node *h = in_order_tail(node->left);
 | 
	
		
			
				|  |  | -      l = remove(vtable, node->left, h->key);
 | 
	
		
			
				|  |  | -      r = ref_node(node->right);
 | 
	
		
			
				|  |  | -      return assert_invariants(rebalance(vtable, vtable->copy_key(h->key),
 | 
	
		
			
				|  |  | -                                         vtable->copy_value(h->value), l, r));
 | 
	
		
			
				|  |  | +      return rebalance(vtable, vtable->copy_key(h->key),
 | 
	
		
			
				|  |  | +                       vtable->copy_value(h->value), remove(vtable, node->left, h->key), ref_node(node->right));
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  l = node->left;
 | 
	
		
			
				|  |  | -  r = node->right;
 | 
	
		
			
				|  |  | -  if (cmp > 0) {
 | 
	
		
			
				|  |  | -    l = remove(vtable, l, key);
 | 
	
		
			
				|  |  | -    ref_node(r);
 | 
	
		
			
				|  |  | +  } else if (cmp > 0) {
 | 
	
		
			
				|  |  | +    return rebalance(vtable, vtable->copy_key(node->key),
 | 
	
		
			
				|  |  | +                     vtable->copy_value(node->value),
 | 
	
		
			
				|  |  | +                     remove(vtable, node->left, key), ref_node(node->right));
 | 
	
		
			
				|  |  |    } else {
 | 
	
		
			
				|  |  | -    r = remove(vtable, r, key);
 | 
	
		
			
				|  |  | -    ref_node(l);
 | 
	
		
			
				|  |  | +    return rebalance(vtable, vtable->copy_key(node->key),
 | 
	
		
			
				|  |  | +                     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) {
 |