static void rbtree_1(CuTest *tc) { /* tree should be empty on start. */ CuAssert(tc, "empty tree?", (rbtree_first((rbtree_t*)tree) == &rbtree_null_node)); CuAssert(tc, "empty tree?", (rbtree_last((rbtree_t*)tree) == &rbtree_null_node)); test_tree_integrity(tc, tree); }
/** get next closer for nsec3 proof */ static struct ub_packed_rrset_key* neg_nsec3_getnc(struct val_neg_zone* zone, uint8_t* hashnc, size_t nclen, struct rrset_cache* rrset_cache, struct regional* region, uint32_t now, uint8_t* b32, size_t maxb32) { struct ub_packed_rrset_key* nc_rrset; struct val_neg_data* data; size_t b32len; if(!(b32len=nsec3_hash_to_b32(hashnc, nclen, zone->name, zone->len, b32, maxb32))) return NULL; (void)neg_closest_data(zone, b32, b32len, zone->labs+1, &data); if(!data && zone->tree.count != 0) { /* could be before the first entry ; return the last * entry (possibly the rollover nsec3 at end) */ data = (struct val_neg_data*)rbtree_last(&zone->tree); } while(data && !data->in_use) data = data->parent; if(!data) return NULL; /* got a data element in tree, grab it */ nc_rrset = grab_nsec(rrset_cache, data->name, data->len, LDNS_RR_TYPE_NSEC3, zone->dclass, 0, region, 0, 0, now); if(!nc_rrset) return NULL; if(!neg_params_ok(zone, nc_rrset)) return NULL; return nc_rrset; }
static char *rbtree_prev(char *node) { char *parent; if (rbtree_get_left(node)) return rbtree_last(rbtree_get_left(node)); while ((parent = rb_get_parent(node)) && rbtree_get_left(parent) == node) node = parent; return parent; }
static void rbtree_7(CuTest *tc) { CuAssert(tc, "rbtree_first(tree) == findsmallest(tree->root)", rbtree_first(tree) == findsmallest(tree->root)); CuAssert(tc, "rbtree_last(tree) == findlargest(tree->root)", rbtree_last(tree) == findlargest(tree->root)); }
int main() { mmnode ns[10]; int i = 0; for( ; i < 10; ++i) { ns[i].key = i+1; ns[i].base.key = &ns[i].key; } rbtree_t rb = create_rbtree(_comp); for(i = 0; i < 10; ++i) rbtree_insert(rb,(rbnode*)&ns[i]); { mmnode *n = (mmnode*)rbtree_first(rb); while(n) { printf("%d\n",n->key); n = (mmnode*)rbnode_next((rbnode*)n); } } rbtree_check_vaild(rb); mmnode *succ = (mmnode*)rbtree_remove(rb,(void*)&ns[3].key); printf("%d\n",succ->key); rbtree_check_vaild(rb); { mmnode *n = (mmnode*)rbtree_first(rb); while(n) { printf("%d\n",n->key); n = (mmnode*)rbnode_next((rbnode*)n); } } { mmnode *n = (mmnode*)rbtree_last(rb); while(n) { printf("%d\n",n->key); n = (mmnode*)rbnode_pre((rbnode*)n); } } /* map_t m = MAP_CREATE(int,int,_comp,NULL); MAP_INSERT(int,int,m,1,1); MAP_INSERT(int,int,m,2,2); MAP_INSERT(int,int,m,3,3); MAP_INSERT(int,int,m,4,4); MAP_INSERT(int,int,m,5,5); MAP_INSERT(int,int,m,6,6); MAP_INSERT(int,int,m,7,7); MAP_INSERT(int,int,m,8,8); MAP_INSERT(int,int,m,9,9); MAP_INSERT(int,int,m,10,10); printf("------test iter------\n"); map_iter it = map_begin(m); map_iter end = map_end(m); for( ; !IT_EQ(it,end); IT_NEXT(it)) printf("%d\n",IT_GET_VAL(int,it)); printf("------test remove 4------\n"); MAP_REMOVE(int,m,4); it = map_begin(m); end = map_end(m); for( ; !IT_EQ(it,end); IT_NEXT(it)) printf("%d\n",IT_GET_VAL(int,it)); */ return 0; }