Comment to explain how the add/remove core works.
authorMichael Niedermayer <michaelni@gmx.at>
Wed, 23 Jan 2008 21:03:21 +0000 (21:03 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Wed, 23 Jan 2008 21:03:21 +0000 (21:03 +0000)
Originally committed as revision 11603 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavutil/tree.c

index 1a102e4..cb442ff 100644 (file)
@@ -75,6 +75,24 @@ void *av_tree_insert(AVTreeNode **tp, void *key, int (*cmp)(void *key, const voi
 
             if(!(t->state&1)){
                 if(t->state){
+                    /* The following code is equivalent to
+                    if((*child)->state*2 == -t->state)
+                        rotate(child, i^1);
+                    rotate(tp, i);
+
+                    with rotate():
+                    static void rotate(AVTreeNode **tp, int i){
+                        AVTreeNode *t= *tp;
+
+                        *tp= t->child[i];
+                        t->child[i]= t->child[i]->child[i^1];
+                        (*tp)->child[i^1]= t;
+                        i= 4*t->state + 2*(*tp)->state + 12;
+                          t  ->state=                     ((0x614586 >> i) & 3)-1;
+                        (*tp)->state= ((*tp)->state>>1) + ((0x400EEA >> i) & 3)-1;
+                    }
+                    but such a rotate function is both bigger and slower
+                    */
                     if((*child)->state*2 == -t->state){
                         *tp= (*child)->child[i^1];
                         (*child)->child[i^1]= (*tp)->child[i];