// File: /workspace/github_c_makefile_star2_O0/trumabrat[P]GrandProjet/ArbreQuat.c
// Function: insererNoeudArbre
void insererNoeudArbre(Noeud *n, ArbreQuat **a, ArbreQuat *parent){
    if (*a == NULL){
        // Si il n'existe pas de abre a crée, on crée un nouveau et on insére dans l'un des fils du parent
        /*L'hypoyhèse est que si *a==NULL, alors ca veut dire l'enfant du parent ou doit aller le noeud est vide
        Si ce n'est pas le cas, cette fonction va écraser ce qui se trouver dans cet enfant du parent*/

        //Longueur et largeur de l'arbre a
        double newCoteX = parent->coteX / 2.0;
        double newCoteY = parent->coteY / 2.0;

        //cas sud-ouest
        if (n->x < parent->xc && n->y < parent->yc)
        {
            *a = creerArbreQuat(parent->xc - newCoteX / 2.0, parent->yc - newCoteY / 2.0, newCoteX, newCoteY);
            (*a)->noeud = n;
            parent->so = *a;
        }

        //cas sud-est
        if (n->x >= parent->xc && n->y < parent->yc){
            *a = creerArbreQuat(parent->xc + newCoteX / 2.0, parent->yc - newCoteY / 2.0, newCoteX, newCoteY);
            (*a)->noeud = n;
            parent->se = *a;
        }

        //cas nord-ouest
        if (n->x < parent->xc && n->y >= parent->yc){
            *a = creerArbreQuat(parent->xc - newCoteX / 2.0, parent->yc + newCoteY / 2.0, newCoteX, newCoteY);
            (*a)->noeud = n;
            parent->no = *a;
        }

        //cas nord-est
        if(n->x >= parent->xc && n->y >= parent->yc){
            *a = creerArbreQuat(parent->xc + newCoteX / 2.0, parent->yc + newCoteY / 2.0, newCoteX, newCoteY);
            (*a)->noeud = n;
            parent->ne = *a;
        }

        return;
    }

    else{
        if ((*a)->noeud != NULL){
            /*Ici on considère le cas ou l'arbre a est une feuille (noeud présent).
            L'arbre cesse alors d'etre une feuille mais devient une racine, et ces dans ses feuilles
            qu'on va vouloir insérer les valeurs.Si les points sont très prêts les uns des autres, on
            peut également imaginer qu'on doit transformer la racine des enfants de l'arbre a aussi.*/

            //a devient le parent, on transfere son noeud vers l'un des fils de a.
            ArbreQuat *tmp = NULL;
            insererNoeudArbre((*a)->noeud, &tmp, *a);
            (*a)->noeud = NULL;

            insererNoeudArbre(n, a, parent);
            //Maintenant, la feuille est devenu une cellule interne, donc la clause d'après va décider ou mettre le noeud.
            //Si le noeud doit aller dans la feuille déjà occupé par le noeud qui existait dans *(a)->noeud, le procès se repète.
        }

        else{
            /*si on se trouve dans une cellule interne, on cherche ou placer le noeud n en comparant les coordonées du noeud
            par rapport au centre. On peut alors soit arriver rencontrer l'espace libre pour insérer notre noeud, soit rencontrer
            une feuille, ce qui va être géré dans le bloc d'avant.*/

            //cas sud-ouest
            if (n->x < (*a)->xc && n->y < (*a)->yc)
            {
                insererNoeudArbre(n, &((*a)->so), *a);
            }

            //cas sud-est
            if (n->x >= (*a)->xc && n->y < (*a)->yc){
               insererNoeudArbre(n, &((*a)->se), *a);
            }

            //cas nord-ouest
            if (n->x < (*a)->xc && n->y >= (*a)->yc){
                insererNoeudArbre(n, &((*a)->no), *a);
            }

            //cas nord-est
            if(n->x >= (*a)->xc && n->y >= (*a)->yc){
                insererNoeudArbre(n, &((*a)->ne), *a);
            }
        }
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x30, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq -0x10(%rbp), %rax
cmpq $0x0, (%rax)
jne 0x39af
movq -0x18(%rbp), %rax
movsd 0x10(%rax), %xmm0
movsd 0x19ed(%rip), %xmm1     # 0x50f0
divsd %xmm1, %xmm0
movsd %xmm0, -0x20(%rbp)
movq -0x18(%rbp), %rax
movsd 0x18(%rax), %xmm0
movsd 0x19d3(%rip), %xmm1     # 0x50f0
divsd %xmm1, %xmm0
movsd %xmm0, -0x28(%rbp)
movq -0x8(%rbp), %rax
movsd 0x8(%rax), %xmm1
movq -0x18(%rbp), %rax
movsd (%rax), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x37cb
movq -0x8(%rbp), %rax
movsd 0x10(%rax), %xmm1
movq -0x18(%rbp), %rax
movsd 0x8(%rax), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x37cb
movq -0x18(%rbp), %rax
movsd (%rax), %xmm0
movsd -0x20(%rbp), %xmm1
movsd 0x1982(%rip), %xmm2     # 0x50f0
divsd %xmm2, %xmm1
subsd %xmm1, %xmm0
movq -0x18(%rbp), %rax
movsd 0x8(%rax), %xmm1
movsd -0x28(%rbp), %xmm2
movsd 0x1964(%rip), %xmm3     # 0x50f0
divsd %xmm3, %xmm2
subsd %xmm2, %xmm1
movsd -0x20(%rbp), %xmm2
movsd -0x28(%rbp), %xmm3
callq 0x3620
movq %rax, %rcx
movq -0x10(%rbp), %rax
movq %rcx, (%rax)
movq -0x8(%rbp), %rcx
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq %rcx, 0x20(%rax)
movq -0x10(%rbp), %rax
movq (%rax), %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x28(%rax)
movq -0x8(%rbp), %rax
movsd 0x8(%rax), %xmm0
movq -0x18(%rbp), %rax
ucomisd (%rax), %xmm0
jb 0x386c
movq -0x8(%rbp), %rax
movsd 0x10(%rax), %xmm1
movq -0x18(%rbp), %rax
movsd 0x8(%rax), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x386c
movq -0x18(%rbp), %rax
movsd (%rax), %xmm0
movsd -0x20(%rbp), %xmm1
movsd 0x18e1(%rip), %xmm2     # 0x50f0
divsd %xmm2, %xmm1
addsd %xmm1, %xmm0
movq -0x18(%rbp), %rax
movsd 0x8(%rax), %xmm1
movsd -0x28(%rbp), %xmm2
movsd 0x18c3(%rip), %xmm3     # 0x50f0
divsd %xmm3, %xmm2
subsd %xmm2, %xmm1
movsd -0x20(%rbp), %xmm2
movsd -0x28(%rbp), %xmm3
callq 0x3620
movq %rax, %rcx
movq -0x10(%rbp), %rax
movq %rcx, (%rax)
movq -0x8(%rbp), %rcx
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq %rcx, 0x20(%rax)
movq -0x10(%rbp), %rax
movq (%rax), %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x30(%rax)
movq -0x8(%rbp), %rax
movsd 0x8(%rax), %xmm1
movq -0x18(%rbp), %rax
movsd (%rax), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x390d
movq -0x8(%rbp), %rax
movsd 0x10(%rax), %xmm0
movq -0x18(%rbp), %rax
ucomisd 0x8(%rax), %xmm0
jb 0x390d
movq -0x18(%rbp), %rax
movsd (%rax), %xmm0
movsd -0x20(%rbp), %xmm1
movsd 0x1840(%rip), %xmm2     # 0x50f0
divsd %xmm2, %xmm1
subsd %xmm1, %xmm0
movq -0x18(%rbp), %rax
movsd 0x8(%rax), %xmm1
movsd -0x28(%rbp), %xmm2
movsd 0x1822(%rip), %xmm3     # 0x50f0
divsd %xmm3, %xmm2
addsd %xmm2, %xmm1
movsd -0x20(%rbp), %xmm2
movsd -0x28(%rbp), %xmm3
callq 0x3620
movq %rax, %rcx
movq -0x10(%rbp), %rax
movq %rcx, (%rax)
movq -0x8(%rbp), %rcx
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq %rcx, 0x20(%rax)
movq -0x10(%rbp), %rax
movq (%rax), %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x38(%rax)
movq -0x8(%rbp), %rax
movsd 0x8(%rax), %xmm0
movq -0x18(%rbp), %rax
ucomisd (%rax), %xmm0
jb 0x39aa
movq -0x8(%rbp), %rax
movsd 0x10(%rax), %xmm0
movq -0x18(%rbp), %rax
ucomisd 0x8(%rax), %xmm0
jb 0x39aa
movq -0x18(%rbp), %rax
movsd (%rax), %xmm0
movsd -0x20(%rbp), %xmm1
movsd 0x17a3(%rip), %xmm2     # 0x50f0
divsd %xmm2, %xmm1
addsd %xmm1, %xmm0
movq -0x18(%rbp), %rax
movsd 0x8(%rax), %xmm1
movsd -0x28(%rbp), %xmm2
movsd 0x1785(%rip), %xmm3     # 0x50f0
divsd %xmm3, %xmm2
addsd %xmm2, %xmm1
movsd -0x20(%rbp), %xmm2
movsd -0x28(%rbp), %xmm3
callq 0x3620
movq %rax, %rcx
movq -0x10(%rbp), %rax
movq %rcx, (%rax)
movq -0x8(%rbp), %rcx
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq %rcx, 0x20(%rax)
movq -0x10(%rbp), %rax
movq (%rax), %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x40(%rax)
jmp 0x3b39
movq -0x10(%rbp), %rax
movq (%rax), %rax
cmpq $0x0, 0x20(%rax)
je 0x3a05
movq $0x0, -0x30(%rbp)
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq 0x20(%rax), %rdi
movq -0x10(%rbp), %rax
movq (%rax), %rdx
leaq -0x30(%rbp), %rsi
callq 0x36d0
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq $0x0, 0x20(%rax)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
callq 0x36d0
jmp 0x3b37
movq -0x8(%rbp), %rax
movsd 0x8(%rax), %xmm1
movq -0x10(%rbp), %rax
movq (%rax), %rax
movsd (%rax), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x3a55
movq -0x8(%rbp), %rax
movsd 0x10(%rax), %xmm1
movq -0x10(%rbp), %rax
movq (%rax), %rax
movsd 0x8(%rax), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x3a55
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movq (%rax), %rsi
addq $0x28, %rsi
movq -0x10(%rbp), %rax
movq (%rax), %rdx
callq 0x36d0
movq -0x8(%rbp), %rax
movsd 0x8(%rax), %xmm0
movq -0x10(%rbp), %rax
movq (%rax), %rax
ucomisd (%rax), %xmm0
jb 0x3aa1
movq -0x8(%rbp), %rax
movsd 0x10(%rax), %xmm1
movq -0x10(%rbp), %rax
movq (%rax), %rax
movsd 0x8(%rax), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x3aa1
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movq (%rax), %rsi
addq $0x30, %rsi
movq -0x10(%rbp), %rax
movq (%rax), %rdx
callq 0x36d0
movq -0x8(%rbp), %rax
movsd 0x8(%rax), %xmm1
movq -0x10(%rbp), %rax
movq (%rax), %rax
movsd (%rax), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x3aed
movq -0x8(%rbp), %rax
movsd 0x10(%rax), %xmm0
movq -0x10(%rbp), %rax
movq (%rax), %rax
ucomisd 0x8(%rax), %xmm0
jb 0x3aed
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movq (%rax), %rsi
addq $0x38, %rsi
movq -0x10(%rbp), %rax
movq (%rax), %rdx
callq 0x36d0
movq -0x8(%rbp), %rax
movsd 0x8(%rax), %xmm0
movq -0x10(%rbp), %rax
movq (%rax), %rax
ucomisd (%rax), %xmm0
jb 0x3b35
movq -0x8(%rbp), %rax
movsd 0x10(%rax), %xmm0
movq -0x10(%rbp), %rax
movq (%rax), %rax
ucomisd 0x8(%rax), %xmm0
jb 0x3b35
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movq (%rax), %rsi
addq $0x40, %rsi
movq -0x10(%rbp), %rax
movq (%rax), %rdx
callq 0x36d0
jmp 0x3b37
jmp 0x3b39
addq $0x30, %rsp
popq %rbp
retq
nop