// File: /workspace/github_c_makefile_star2_O3/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 %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x50, %rsp
movq %rdx, %r15
movq %rsi, %r14
movq %rdi, %rbx
movq (%rsi), %rdx
testq %rdx, %rdx
je 0x2b2d
xorl %r13d, %r13d
leaq 0x48(%rsp), %r12
movq 0x20(%rdx), %rdi
testq %rdi, %rdi
je 0x2a78
movq %r13, 0x48(%rsp)
movq %r12, %rsi
callq 0x2a24
movq (%r14), %rax
movq %r13, 0x20(%rax)
movq (%r14), %rdx
testq %rdx, %rdx
jne 0x2a4e
jmp 0x2b2d
movsd 0x8(%rbx), %xmm0
movsd (%rdx), %xmm1
ucomisd %xmm0, %xmm1
jbe 0x2aab
movsd 0x8(%rdx), %xmm2
ucomisd 0x10(%rbx), %xmm2
jbe 0x2aab
leaq 0x28(%rdx), %rsi
movq %rbx, %rdi
callq 0x2a24
movsd 0x8(%rbx), %xmm0
movq (%r14), %rdx
movsd (%rdx), %xmm1
ucomisd %xmm1, %xmm0
jb 0x2ad5
movsd 0x8(%rdx), %xmm2
ucomisd 0x10(%rbx), %xmm2
jbe 0x2ad5
leaq 0x30(%rdx), %rsi
movq %rbx, %rdi
callq 0x2a24
movsd 0x8(%rbx), %xmm0
movq (%r14), %rdx
movsd (%rdx), %xmm1
ucomisd %xmm0, %xmm1
jbe 0x2ae7
movsd 0x10(%rbx), %xmm2
ucomisd 0x8(%rdx), %xmm2
jae 0x2aec
movq %rdx, %r15
jmp 0x2b05
leaq 0x38(%rdx), %rsi
movq %rbx, %rdi
callq 0x2a24
movsd 0x8(%rbx), %xmm0
movq (%r14), %r15
movsd (%r15), %xmm1
ucomisd %xmm1, %xmm0
jb 0x2d11
movsd 0x10(%rbx), %xmm0
ucomisd 0x8(%r15), %xmm0
jb 0x2d11
leaq 0x40(%r15), %r14
movq 0x40(%r15), %rdx
jmp 0x2a6e
movupd 0x10(%r15), %xmm3
mulpd 0x1815(%rip), %xmm3     # 0x4350
movsd 0x8(%rbx), %xmm1
movsd (%r15), %xmm4
ucomisd %xmm1, %xmm4
movapd %xmm3, 0x30(%rsp)
movapd %xmm4, 0x20(%rsp)
jbe 0x2bbd
movsd 0x8(%r15), %xmm0
ucomisd 0x10(%rbx), %xmm0
jbe 0x2bbd
movl $0x1, %edi
movl $0x48, %esi
movsd %xmm1, (%rsp)
movapd %xmm0, 0x10(%rsp)
callq 0x10c0
movapd 0x20(%rsp), %xmm4
movapd 0x30(%rsp), %xmm3
movapd 0x17ce(%rip), %xmm0     # 0x4360
mulpd %xmm3, %xmm0
movapd %xmm4, %xmm1
unpcklpd 0x10(%rsp), %xmm1       # xmm1 = xmm1[0],mem[0]
addpd %xmm0, %xmm1
movupd %xmm1, (%rax)
movsd (%rsp), %xmm1
movupd %xmm3, 0x10(%rax)
movq %rax, (%r14)
movq %rbx, 0x20(%rax)
movq %rax, 0x28(%r15)
ucomisd %xmm4, %xmm1
jb 0x2c35
movsd 0x8(%r15), %xmm0
ucomisd 0x10(%rbx), %xmm0
jbe 0x2c35
movl $0x1, %edi
movl $0x48, %esi
movsd %xmm1, (%rsp)
movapd %xmm0, 0x10(%rsp)
callq 0x10c0
movapd 0x20(%rsp), %xmm4
movapd 0x30(%rsp), %xmm3
movapd 0x1752(%rip), %xmm0     # 0x4350
mulpd %xmm3, %xmm0
movapd %xmm4, %xmm1
unpcklpd 0x10(%rsp), %xmm1       # xmm1 = xmm1[0],mem[0]
movapd %xmm4, %xmm2
addpd %xmm0, %xmm2
subpd %xmm0, %xmm1
movsd %xmm2, %xmm1            # xmm1 = xmm2[0],xmm1[1]
movupd %xmm1, (%rax)
movsd (%rsp), %xmm1
movupd %xmm3, 0x10(%rax)
movq %rax, (%r14)
movq %rbx, 0x20(%rax)
movq %rax, 0x30(%r15)
ucomisd %xmm1, %xmm4
jbe 0x2cb1
movsd 0x10(%rbx), %xmm0
movsd 0x8(%r15), %xmm2
ucomisd %xmm2, %xmm0
jb 0x2cb1
movl $0x1, %edi
movl $0x48, %esi
movsd %xmm1, (%rsp)
movapd %xmm2, 0x10(%rsp)
callq 0x10c0
movapd 0x20(%rsp), %xmm4
movapd 0x30(%rsp), %xmm3
movapd 0x16d6(%rip), %xmm0     # 0x4350
mulpd %xmm3, %xmm0
movapd %xmm4, %xmm1
unpcklpd 0x10(%rsp), %xmm1       # xmm1 = xmm1[0],mem[0]
movapd %xmm4, %xmm2
subpd %xmm0, %xmm2
addpd %xmm0, %xmm1
movsd %xmm2, %xmm1            # xmm1 = xmm2[0],xmm1[1]
movupd %xmm1, (%rax)
movsd (%rsp), %xmm1
movupd %xmm3, 0x10(%rax)
movq %rax, (%r14)
movq %rbx, 0x20(%rax)
movq %rax, 0x38(%r15)
ucomisd %xmm4, %xmm1
jb 0x2d11
movsd 0x10(%rbx), %xmm0
movsd 0x8(%r15), %xmm1
ucomisd %xmm1, %xmm0
jb 0x2d11
movl $0x1, %edi
movl $0x48, %esi
movapd %xmm1, (%rsp)
callq 0x10c0
movapd 0x166c(%rip), %xmm0     # 0x4350
movapd 0x30(%rsp), %xmm1
mulpd %xmm1, %xmm0
movapd 0x20(%rsp), %xmm2
unpcklpd (%rsp), %xmm2           # xmm2 = xmm2[0],mem[0]
addpd %xmm0, %xmm2
movupd %xmm2, (%rax)
movupd %xmm1, 0x10(%rax)
movq %rax, (%r14)
movq %rbx, 0x20(%rax)
movq %rax, 0x40(%r15)
addq $0x50, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
retq