// File: /workspace/github_cpp_makefile_star2_O3/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 0x2d06
testb %al, %al
jne 0x30aa
cmpq $0x0, 0x8(%r14)
movq (%r14), %rax
movq %r14, %rdi
je 0x300c
callq *0x10(%rax)
movq %rbx, %rdi
movq %rax, %rsi
callq 0x2a28
testb %al, %al
je 0x3014
movq 0x10(%r14), %rdi
testq %rdi, %rdi
jne 0x301d
movl $0x28, %edi
callq 0x2160
movq %rax, %r12
leaq 0x9ca1(%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 0x343a
leaq 0x8(%r12), %rax
movq %r15, (%rax)
movq %r15, %rdi
movq %rbx, %rsi
callq 0x29a0
testb %al, %al
je 0x30e8
xorps %xmm0, %xmm0
movups %xmm0, 0x10(%r12)
movq %r14, 0x20(%r12)
movq %r12, 0x10(%r14)
jmp 0x308f
movq %rbx, %rsi
callq *0x18(%rax)
jmp 0x308f
movq 0x18(%r14), %rdi
testq %rdi, %rdi
je 0x3027
movq %rbx, %rsi
callq 0x2f4c
jmp 0x308f
movl $0x28, %edi
callq 0x2160
movq %rax, %r12
leaq 0x9c15(%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 0x343a
leaq 0x8(%r12), %rax
movq %r15, (%rax)
movq %r15, %rdi
movq %rbx, %rsi
callq 0x29a0
testb %al, %al
je 0x30e8
xorps %xmm0, %xmm0
movups %xmm0, 0x10(%r12)
movq %r14, 0x20(%r12)
movq %r12, 0x18(%r14)
movq %r14, %rdi
movq %rbx, %rsi
callq 0x2d06
testb %al, %al
je 0x30c9
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq
leaq 0x622d(%rip), %rdi      # 0x92de
leaq 0x607d(%rip), %rsi      # 0x9135
leaq 0x622d(%rip), %rcx      # 0x92ec
movl $0xba, %edx
callq 0x20f0
leaq 0x620f(%rip), %rdi      # 0x92df
leaq 0x605e(%rip), %rsi      # 0x9135
leaq 0x620e(%rip), %rcx      # 0x92ec
movl $0xeb, %edx
callq 0x20f0
leaq 0x63b4(%rip), %rdi      # 0x94a3
leaq 0x6315(%rip), %rsi      # 0x940b
leaq 0x63bb(%rip), %rcx      # 0x94b8
movl $0x124, %edx            # imm = 0x124
callq 0x20f0
jmp 0x3109
movq %rax, %rbx
movq %r15, %rdi
callq 0x2140
movq %rbx, %rdi
callq 0x2230