// File: /workspace/github_c_makefile_star2_O1/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 $0x40, %rsp
movq %rdx, %r15
movq %rsi, %r14
movq %rdi, %rbx
xorl %r13d, %r13d
leaq 0x38(%rsp), %r12
movq (%r14), %rdx
testq %rdx, %rdx
je 0x2c19
movq 0x20(%rdx), %rdi
testq %rdi, %rdi
je 0x2b7d
movq %r13, 0x38(%rsp)
movq %r12, %rsi
callq 0x2b34
movq (%r14), %rax
movq %r13, 0x20(%rax)
jmp 0x2b52
movsd (%rdx), %xmm0
ucomisd 0x8(%rbx), %xmm0
jbe 0x2ba0
movsd 0x8(%rdx), %xmm0
ucomisd 0x10(%rbx), %xmm0
jbe 0x2ba0
leaq 0x28(%rdx), %rsi
movq %rbx, %rdi
callq 0x2b34
movsd 0x8(%rbx), %xmm0
movq (%r14), %rdx
ucomisd (%rdx), %xmm0
jb 0x2bc6
movsd 0x8(%rdx), %xmm0
ucomisd 0x10(%rbx), %xmm0
jbe 0x2bc6
leaq 0x30(%rdx), %rsi
movq %rbx, %rdi
callq 0x2b34
movq (%r14), %rdx
movsd (%rdx), %xmm0
ucomisd 0x8(%rbx), %xmm0
jbe 0x2bec
movsd 0x10(%rbx), %xmm0
ucomisd 0x8(%rdx), %xmm0
jb 0x2bec
leaq 0x38(%rdx), %rsi
movq %rbx, %rdi
callq 0x2b34
movsd 0x8(%rbx), %xmm0
movq (%r14), %r15
ucomisd (%r15), %xmm0
jb 0x2f1b
movsd 0x10(%rbx), %xmm0
ucomisd 0x8(%r15), %xmm0
jb 0x2f1b
leaq 0x40(%r15), %r14
jmp 0x2b52
movsd 0x161f(%rip), %xmm3     # 0x4240
movsd 0x10(%r15), %xmm2
mulsd %xmm3, %xmm2
movsd 0x18(%r15), %xmm4
mulsd %xmm3, %xmm4
movsd 0x8(%rbx), %xmm6
movsd (%r15), %xmm5
ucomisd %xmm6, %xmm5
movsd %xmm2, 0x30(%rsp)
movsd %xmm4, 0x28(%rsp)
jbe 0x2d09
movsd 0x8(%r15), %xmm1
ucomisd 0x10(%rbx), %xmm1
jbe 0x2d09
movapd %xmm2, %xmm0
mulsd %xmm3, %xmm0
movapd %xmm5, %xmm7
subsd %xmm0, %xmm7
movsd %xmm7, 0x20(%rsp)
movapd %xmm4, %xmm0
mulsd %xmm3, %xmm0
subsd %xmm0, %xmm1
movsd %xmm1, 0x18(%rsp)
movl $0x1, %edi
movl $0x48, %esi
movsd %xmm5, 0x10(%rsp)
movsd %xmm6, 0x8(%rsp)
callq 0x10c0
movsd 0x8(%rsp), %xmm6
movsd 0x10(%rsp), %xmm5
movsd 0x28(%rsp), %xmm4
movsd 0x157d(%rip), %xmm3     # 0x4240
movsd 0x30(%rsp), %xmm2
movsd 0x20(%rsp), %xmm0
movsd %xmm0, (%rax)
movsd 0x18(%rsp), %xmm0
movsd %xmm0, 0x8(%rax)
movsd %xmm2, 0x10(%rax)
movsd %xmm4, 0x18(%rax)
xorpd %xmm0, %xmm0
movupd %xmm0, 0x20(%rax)
movupd %xmm0, 0x30(%rax)
movq $0x0, 0x40(%rax)
movq %rax, (%r14)
movq %rbx, 0x20(%rax)
movq %rax, 0x28(%r15)
ucomisd %xmm5, %xmm6
jb 0x2dc3
movsd 0x8(%r15), %xmm1
ucomisd 0x10(%rbx), %xmm1
jbe 0x2dc3
movapd %xmm2, %xmm0
mulsd %xmm3, %xmm0
addsd %xmm5, %xmm0
movsd %xmm0, 0x20(%rsp)
movapd %xmm4, %xmm0
mulsd %xmm3, %xmm0
subsd %xmm0, %xmm1
movsd %xmm1, 0x18(%rsp)
movl $0x1, %edi
movl $0x48, %esi
movsd %xmm5, 0x10(%rsp)
movsd %xmm6, 0x8(%rsp)
callq 0x10c0
movsd 0x8(%rsp), %xmm6
movsd 0x10(%rsp), %xmm5
movsd 0x28(%rsp), %xmm4
movsd 0x14c3(%rip), %xmm3     # 0x4240
movsd 0x30(%rsp), %xmm2
movsd 0x20(%rsp), %xmm0
movsd %xmm0, (%rax)
movsd 0x18(%rsp), %xmm0
movsd %xmm0, 0x8(%rax)
movsd %xmm2, 0x10(%rax)
movsd %xmm4, 0x18(%rax)
xorpd %xmm0, %xmm0
movupd %xmm0, 0x20(%rax)
movupd %xmm0, 0x30(%rax)
movq $0x0, 0x40(%rax)
movq %rax, (%r14)
movq %rbx, 0x20(%rax)
movq %rax, 0x30(%r15)
ucomisd %xmm6, %xmm5
jbe 0x2e85
movsd 0x10(%rbx), %xmm1
movsd 0x8(%r15), %xmm0
ucomisd %xmm0, %xmm1
jb 0x2e85
movapd %xmm2, %xmm1
mulsd %xmm3, %xmm1
movapd %xmm5, %xmm7
subsd %xmm1, %xmm7
movsd %xmm7, 0x20(%rsp)
movapd %xmm4, %xmm1
mulsd %xmm3, %xmm1
addsd %xmm0, %xmm1
movsd %xmm1, 0x18(%rsp)
movl $0x1, %edi
movl $0x48, %esi
movsd %xmm5, 0x10(%rsp)
movsd %xmm6, 0x8(%rsp)
callq 0x10c0
movsd 0x8(%rsp), %xmm6
movsd 0x10(%rsp), %xmm5
movsd 0x28(%rsp), %xmm4
movsd 0x1401(%rip), %xmm3     # 0x4240
movsd 0x30(%rsp), %xmm2
movsd 0x20(%rsp), %xmm0
movsd %xmm0, (%rax)
movsd 0x18(%rsp), %xmm0
movsd %xmm0, 0x8(%rax)
movsd %xmm2, 0x10(%rax)
movsd %xmm4, 0x18(%rax)
xorpd %xmm0, %xmm0
movupd %xmm0, 0x20(%rax)
movupd %xmm0, 0x30(%rax)
movq $0x0, 0x40(%rax)
movq %rax, (%r14)
movq %rbx, 0x20(%rax)
movq %rax, 0x38(%r15)
ucomisd %xmm5, %xmm6
jb 0x2f1b
movsd 0x10(%rbx), %xmm1
movsd 0x8(%r15), %xmm0
ucomisd %xmm0, %xmm1
jb 0x2f1b
movapd %xmm2, %xmm1
mulsd %xmm3, %xmm1
addsd %xmm5, %xmm1
movsd %xmm1, 0x10(%rsp)
mulsd %xmm4, %xmm3
addsd %xmm0, %xmm3
movsd %xmm3, 0x8(%rsp)
movl $0x1, %edi
movl $0x48, %esi
callq 0x10c0
movsd 0x10(%rsp), %xmm0
movsd %xmm0, (%rax)
movsd 0x8(%rsp), %xmm0
movsd %xmm0, 0x8(%rax)
movsd 0x30(%rsp), %xmm0
movsd %xmm0, 0x10(%rax)
movsd 0x28(%rsp), %xmm0
movsd %xmm0, 0x18(%rax)
xorpd %xmm0, %xmm0
movupd %xmm0, 0x20(%rax)
movupd %xmm0, 0x30(%rax)
movq $0x0, 0x40(%rax)
movq %rax, (%r14)
movq %rbx, 0x20(%rax)
movq %rax, 0x40(%r15)
addq $0x40, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
retq