/* Iterate through elements in t from a range between a and b (inclusive) * for each element calls iter(a) until it returns 0 * returns the last value returned by iterator or 0 if there were no calls * Warning: a<=b must hold */ int avl_range(avl_tree* t,avl* a,avl* b,int(*iter)(avl* a)) { int x,c=0; if(!t->root) return 0; x=t->compar(t->root,a); if(a!=b){ if(x<0){ x=t->compar(t->root,b); if(x>0) x=0; } } if(x>=0){ /* search in the left subtree */ avl_tree left_subtree; if((left_subtree.root = t->root->left) != NULL) { left_subtree.compar=t->compar; if(!(c=avl_range(&left_subtree,a,b,iter))) if(x>0) return 0; } } if(x==0){ if(!(c=iter(t->root))) return 0; } if(x<=0){ /* search in the right subtree */ avl_tree right_subtree; if((right_subtree.root = t->root->right) != NULL) { /* if(right_subtree.root=t->root->right){ */ right_subtree.compar=t->compar; if(!(c=avl_range(&right_subtree,a,b,iter))) if(x<0) return 0; } } return c; }
static struct event_t* event_get_nolock(uint32_t eventId, int server) { eventId = eventId * MAX_HTSP_SERVERS + server; #ifdef USE_AVL struct event_t event; event.eventId = eventId; //fprintf(stderr,"Searching for %d\n",eventId); searched_event = NULL; avl_range(&events,(struct avl*)&event,(struct avl*)&event,iter); return searched_event; #else if (eventId <= MAX_EVENT_ID) { return events[eventId]; } else { return NULL; } #endif }
/* Iterate through elements in t equal to a * for each element calls iter(a) until it returns 0 * returns the last value returned by iterator or 0 if there were no calls */ int avl_search(avl_tree* t, avl* a, int (*iter)(avl* a), avl** ret) { return avl_range(t, a, a, iter, ret); }