00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "common.h"
00022 #include "log.h"
00023 #include "tree.h"
00024
00025 typedef struct AVTreeNode{
00026 struct AVTreeNode *child[2];
00027 void *elem;
00028 int state;
00029 }AVTreeNode;
00030
00031 void *av_tree_find(const AVTreeNode *t, void *key, int (*cmp)(void *key, const void *b), void *next[2]){
00032 if(t){
00033 unsigned int v= cmp(t->elem, key);
00034 if(v){
00035 if(next) next[(v>>31)^1]= t->elem;
00036 return av_tree_find(t->child[v>>31], key, cmp, next);
00037 }else{
00038 return t->elem;
00039 }
00040 }
00041 return NULL;
00042 }
00043
00044 void *av_tree_insert(AVTreeNode **tp, void *key, int (*cmp)(void *key, const void *b)){
00045 AVTreeNode *t= *tp;
00046 if(t){
00047 unsigned int v= cmp(t->elem, key);
00048 if(v){
00049 int i= v>>31;
00050 AVTreeNode **child= &t->child[i];
00051 void *ret= av_tree_insert(child, key, cmp);
00052 if(!ret){
00053 t->state -= ((int)v>>31)|1;
00054 if(!(t->state&1)){
00055 if(t->state){
00056 if((*child)->state*2 == t->state){
00057 *tp= *child;
00058 *child= (*child)->child[i^1];
00059 (*tp)->child[i^1]= t;
00060 t->state= 0;
00061 }else{
00062 *tp= (*child)->child[i^1];
00063 (*child)->child[i^1]= (*tp)->child[i];
00064 (*tp)->child[i]= *child;
00065 *child= (*tp)->child[i^1];
00066 (*tp)->child[i^1]= t;
00067
00068 i= (*tp)->state > 0;
00069 (*tp)->child[i ]->state= 0;
00070 (*tp)->child[i^1]->state= -(*tp)->state;
00071 }
00072 (*tp)->state=0;
00073 }
00074 return key;
00075 }
00076 }
00077 return ret;
00078 }else{
00079 return t->elem;
00080 }
00081 }else{
00082 *tp= av_mallocz(sizeof(AVTreeNode));
00083 (*tp)->elem= key;
00084 return NULL;
00085 }
00086 }
00087
00088 void av_tree_destroy(AVTreeNode *t){
00089 av_tree_destroy(t->child[0]);
00090 av_tree_destroy(t->child[1]);
00091 av_free(t);
00092 }
00093
00094 #if 0
00095 void av_tree_enumerate(AVTreeNode *t, void *opaque, int (*f)(void *opaque, void *elem)){
00096 int v= f(opaque, t->elem);
00097 if(v>=0) av_tree_enumerate(t->child[0], opaque, f);
00098 if(v<=0) av_tree_enumerate(t->child[1], opaque, f);
00099 }
00100 #endif
00101
00102 #ifdef TEST
00103
00104 static int check(AVTreeNode *t){
00105 if(t){
00106 int left= check(t->child[0]);
00107 int right= check(t->child[1]);
00108
00109 if(left>999 || right>999)
00110 return 1000;
00111 if(right - left != t->state)
00112 return 1000;
00113 if(t->state>1 || t->state<-1)
00114 return 1000;
00115 return FFMAX(left, right)+1;
00116 }
00117 return 0;
00118 }
00119
00120 static void print(AVTreeNode *t, int depth){
00121 int i;
00122 for(i=0; i<depth*4; i++) av_log(NULL, AV_LOG_ERROR, " ");
00123 if(t){
00124 av_log(NULL, AV_LOG_ERROR, "Node %p %2d %4d\n", t, t->state, t->elem);
00125 print(t->child[0], depth+1);
00126 print(t->child[1], depth+1);
00127 }else
00128 av_log(NULL, AV_LOG_ERROR, "NULL\n");
00129 }
00130
00131 int cmp(const void *a, const void *b){
00132 return a-b;
00133 }
00134
00135 int main(){
00136 int i,j,k;
00137 AVTreeNode *root= NULL;
00138
00139 for(i=0; i<10000; i++){
00140 int j= (random()%863294);
00141 if(check(root) > 999){
00142 av_log(NULL, AV_LOG_ERROR, "FATAL error %d\n", i);
00143 print(root, 0);
00144 return -1;
00145 }
00146 av_log(NULL, AV_LOG_ERROR, "inserting %4d\n", j);
00147 av_tree_insert(&root, (void*)(j+1), cmp);
00148 }
00149 return 0;
00150 }
00151 #endif