// File: /workspace/github_cpp_makefile_star2_O1/DaCasBe[P]Gestion-de-asignaturas-mediante-arboles-binarios-ordenados/nodoEnlazadoArbolBinarioEstudiante.cpp
// Function: ed::NodoEnlazadoArbolBinarioEstudiante::insert(ed::Estudiante const&)
void ed::NodoEnlazadoArbolBinarioEstudiante::insert(ed::Estudiante const &item){
	//Precondición
	#ifndef NDEBUG
		assert(!exists(item));
	#endif

	if(isEmpty()){ //La lista esta vacía
		setItem(item); //Insertamos el ítem en el nodo raíz
	}

	else{ //La lista no esta vacía
		if(item<getItem()){ //El ítem es menor que el del nodo actual
			if(hasLeftTree()){ //El nodo actual tiene hijo izquierdo
				getLeftTree()->insert(item); //Insertamos el ítem en el subárbol hijo izquierdo
			}

			else{ //El nodo actual no tiene hijo izquierdo
				//Creamos un nuevo nodo con los datos del ítem a insertar y lo enlazamos como corresponde
				ed::NodoEnlazadoArbolBinarioEstudiante * nuevo;
				nuevo=new ed::NodoEnlazadoArbolBinarioEstudiante();

				nuevo->setItem(item);
				nuevo->setLeftTree(NULL);
				nuevo->setRightTree(NULL);
				nuevo->setParent(this);

				setLeftTree(nuevo);
			}
		}

		else{ //El ítem es mayor que el del nodo actual
			if(hasRightTree()){ //El nodo actual tiene hijo derecho
				getRightTree()->insert(item); //Insertamos el ítem en el subárbol hijo derecho
			}

			else{ //El nodo actual no tiene hijo derecho
				//Creamos un nuevo nodo con los datos del ítem a insertar y lo enlazamos como corresponde
				ed::NodoEnlazadoArbolBinarioEstudiante * nuevo;
				nuevo=new ed::NodoEnlazadoArbolBinarioEstudiante();

				nuevo->setItem(item);
				nuevo->setLeftTree(NULL);
				nuevo->setRightTree(NULL);
				nuevo->setParent(this);

				setRightTree(nuevo);
			}
		}
	}

	//Postcondición
	#ifndef NDEBUG
		assert(exists(item));
	#endif
}

// Assembly:
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
pushq %rax
movq %rsi, %rbx
movq %rdi, %r14
callq 0x2cfc
testb %al, %al
jne 0x30ab
cmpq $0x0, 0x8(%r14)
movq (%r14), %rax
movq %r14, %rdi
je 0x3003
callq *0x10(%rax)
movq %rbx, %rdi
movq %rax, %rsi
callq 0x2a28
testb %al, %al
je 0x300e
movq 0x10(%r14), %rdi
testq %rdi, %rdi
jne 0x3017
movl $0x28, %edi
callq 0x2160
movq %rax, %r12
leaq 0x9cb1(%rip), %rax      # 0xcc50
movq %rax, (%r12)
xorps %xmm0, %xmm0
movups %xmm0, 0x8(%r12)
movups %xmm0, 0x18(%r12)
movl $0x50, %edi
callq 0x2160
movq %rax, %r15
movq %rax, %rdi
movq %rbx, %rsi
callq 0x344a
movq %r15, 0x8(%r12)
movq (%r12), %rax
movq %r12, %rdi
callq *0x10(%rax)
movq %rax, %rdi
movq %rbx, %rsi
callq 0x29a0
testb %al, %al
je 0x30e9
xorps %xmm0, %xmm0
movups %xmm0, 0x10(%r12)
movq %r14, 0x20(%r12)
movq %r12, 0x10(%r14)
jmp 0x3090
movq %rbx, %rsi
callq *0x18(%rax)
jmp 0x3090
movq 0x18(%r14), %rdi
testq %rdi, %rdi
je 0x3021
movq %rbx, %rsi
callq 0x2f3c
jmp 0x3090
movl $0x28, %edi
callq 0x2160
movq %rax, %r12
leaq 0x9c1b(%rip), %rax      # 0xcc50
movq %rax, (%r12)
xorps %xmm0, %xmm0
movups %xmm0, 0x8(%r12)
movups %xmm0, 0x18(%r12)
movl $0x50, %edi
callq 0x2160
movq %rax, %r15
movq %rax, %rdi
movq %rbx, %rsi
callq 0x344a
movq %r15, 0x8(%r12)
movq (%r12), %rax
movq %r12, %rdi
callq *0x10(%rax)
movq %rax, %rdi
movq %rbx, %rsi
callq 0x29a0
testb %al, %al
je 0x30e9
xorps %xmm0, %xmm0
movups %xmm0, 0x10(%r12)
movq %r14, 0x20(%r12)
movq %r12, 0x18(%r14)
movq %r14, %rdi
movq %rbx, %rsi
callq 0x2cfc
testb %al, %al
je 0x30ca
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq
leaq 0x622c(%rip), %rdi      # 0x92de
leaq 0x607c(%rip), %rsi      # 0x9135
leaq 0x622c(%rip), %rcx      # 0x92ec
movl $0xba, %edx
callq 0x20f0
leaq 0x620e(%rip), %rdi      # 0x92df
leaq 0x605d(%rip), %rsi      # 0x9135
leaq 0x620d(%rip), %rcx      # 0x92ec
movl $0xeb, %edx
callq 0x20f0
leaq 0x63b3(%rip), %rdi      # 0x94a3
leaq 0x6314(%rip), %rsi      # 0x940b
leaq 0x63ba(%rip), %rcx      # 0x94b8
movl $0x124, %edx            # imm = 0x124
callq 0x20f0
jmp 0x310a
movq %rax, %rbx
movq %r15, %rdi
callq 0x2140
movq %rbx, %rdi
callq 0x2230
nop