// File: 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 %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq -0x8(%rbp), %rdi
movq %rdi, -0x38(%rbp)
movq -0x10(%rbp), %rsi
callq 0x2e80
xorb $-0x1, %al
testb $0x1, %al
jne 0x3369
jmp 0x336b
jmp 0x338a
leaq 0x6fb2(%rip), %rdi      # 0xa324
leaq 0x6dc4(%rip), %rsi      # 0xa13d
movl $0xba, %edx
leaq 0x6fad(%rip), %rcx      # 0xa332
callq 0x2140
movq -0x38(%rbp), %rdi
callq 0x40a0
testb $0x1, %al
jne 0x3399
jmp 0x33ac
movq -0x38(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq (%rdi), %rax
callq *0x18(%rax)
jmp 0x352a
movq -0x38(%rbp), %rdi
movq -0x10(%rbp), %rax
movq %rax, -0x40(%rbp)
movq (%rdi), %rax
callq *0x10(%rax)
movq -0x40(%rbp), %rdi
movq %rax, %rsi
callq 0x29e0
testb $0x1, %al
jne 0x33d3
jmp 0x3482
movq -0x38(%rbp), %rdi
callq 0x3f10
testb $0x1, %al
jne 0x33e2
jmp 0x33fc
movq -0x38(%rbp), %rdi
callq 0x3f40
movq %rax, %rdi
movq -0x10(%rbp), %rsi
callq 0x3340
jmp 0x347d
movl $0x28, %edi
callq 0x21b0
movq %rax, %rdi
movq %rdi, %rax
movq %rax, -0x48(%rbp)
callq 0x40c0
jmp 0x3417
movq -0x48(%rbp), %rax
movq %rax, -0x18(%rbp)
movq -0x18(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq (%rdi), %rax
callq *0x18(%rax)
movq -0x18(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x3fb0
movq -0x18(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x4000
movq -0x38(%rbp), %rsi
movq -0x18(%rbp), %rdi
callq 0x4050
movq -0x38(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x3fb0
jmp 0x347d
movq -0x48(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x20(%rbp)
movl %eax, -0x24(%rbp)
callq 0x2190
jmp 0x3564
jmp 0x3528
movq -0x38(%rbp), %rdi
callq 0x3f60
testb $0x1, %al
jne 0x3491
jmp 0x34a8
movq -0x38(%rbp), %rdi
callq 0x3f90
movq %rax, %rdi
movq -0x10(%rbp), %rsi
callq 0x3340
jmp 0x3526
movl $0x28, %edi
callq 0x21b0
movq %rax, %rdi
movq %rdi, %rax
movq %rax, -0x50(%rbp)
callq 0x40c0
jmp 0x34c3
movq -0x50(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x30(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq (%rdi), %rax
callq *0x18(%rax)
movq -0x30(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x3fb0
movq -0x30(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x4000
movq -0x38(%rbp), %rsi
movq -0x30(%rbp), %rdi
callq 0x4050
movq -0x38(%rbp), %rdi
movq -0x30(%rbp), %rsi
callq 0x4000
jmp 0x3526
movq -0x50(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x20(%rbp)
movl %eax, -0x24(%rbp)
callq 0x2190
jmp 0x3564
jmp 0x3528
jmp 0x352a
movq -0x38(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x2e80
testb $0x1, %al
jne 0x353d
jmp 0x353f
jmp 0x355e
leaq 0x6ddf(%rip), %rdi      # 0xa325
leaq 0x6bf0(%rip), %rsi      # 0xa13d
movl $0xeb, %edx
leaq 0x6dd9(%rip), %rcx      # 0xa332
callq 0x2140
addq $0x50, %rsp
popq %rbp
retq
movq -0x20(%rbp), %rdi
callq 0x22b0
nopl (%rax)