Пример #1
0
/* 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;
}
Пример #2
0
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
}
Пример #3
0
/* 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);
}