// File: /workspace/github_cpp_makefile_star2_O3/DaCasBe[P]Gestion-de-asignaturas-mediante-listas-doblemente-enlazadas-ordenadas/listaDoblementeEnlazadaOrdenadaEstudiantes.cpp
// Function: ed::ListaDoblementeEnlazadaOrdenadaEstudiantes::insert(ed::Estudiante const&)
void ed::ListaDoblementeEnlazadaOrdenadaEstudiantes::insert(ed::Estudiante const &item){
	ed::NodoDoblementeEnlazadoEstudiante * nuevo;
	nuevo=new NodoDoblementeEnlazadoEstudiante(item,NULL,NULL); //Creamos un nodo en el que almacenamos el item a insertar

	if(isEmpty()){ //La lista esta vacia
		//Hacemos que el item sea la cabeza de la lista
		nuevo->setPrevious(NULL);
		nuevo->setNext(NULL);
		setHead(nuevo);
		setCurrent(getHead());
	}

	else{ //La lista no esta vacia
		gotoHead(); //Comenzamos la busqueda de la posicion del item desde la cabeza

		while(!isLastItem()){ //Desplazamos el cursor hasta llegar al final de la lista
			if(item<getCurrentItem()){ //Se ha encontrado la posicion del item en la lista
				break; //Salimos del bucle
			}

			gotoNext();
		}

		if(isFirstItem() && isLastItem()){ //Solo hay un elemento en la lista
			if(item<getCurrentItem()){ //Hay que insertar el item en la posicion anterior a la de la cabeza de la lista
				nuevo->setPrevious(NULL);
				nuevo->setNext(getCurrent());
				getCurrent()->setPrevious(nuevo);
				gotoPrevious();
				setHead(getCurrent());
			}

			else{ //Hay que insertar el item en la posicion posterior a la de la cabeza de la lista
				nuevo->setNext(NULL);
				nuevo->setPrevious(getCurrent());
				getCurrent()->setNext(nuevo);
				gotoNext();
			}
		}

		else if(isFirstItem()){ //Hay que insertar el item en la posicion anterior a la del primer elemento de la lista
			nuevo->setPrevious(NULL);
			nuevo->setNext(getCurrent());
			getCurrent()->setPrevious(nuevo);
			gotoPrevious();
			setHead(getCurrent());
		}

		else if(isLastItem()){ //Hay que insertar el item junto al ultimo elemento de la lista
			if(getCurrentItem()<item){ //Hay que insertar el item en la posicion anterior a la del ultimo elemento de la lista
				nuevo->setNext(NULL);
				nuevo->setPrevious(getCurrent());
				getCurrent()->setNext(nuevo);
				gotoNext();
			}

			else{ //Hay que insertar el item en la posicion posterior a la del ultimo elemento de la lista
				nuevo->setPrevious(getCurrent()->getPrevious());
				nuevo->setNext(getCurrent());
				getCurrent()->setPrevious(nuevo);
				gotoPrevious();
				getCurrent()->getPrevious()->setNext(getCurrent());
			}
		}

		else{ //Hay que insertar el item en cualquier otra parte de la lista
			nuevo->setPrevious(getCurrent()->getPrevious());
			nuevo->setNext(getCurrent());
			getCurrent()->setPrevious(nuevo);
			gotoPrevious();
			getCurrent()->getPrevious()->setNext(getCurrent());
		}
	}

	#ifndef NDEBUG
		//Se comprueba la postcondicion
		assert(!isEmpty() and getCurrentItem()==item);
	#endif //NDEBUG
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %rbx
pushq %rax
movq %rsi, %rbx
movq %rdi, %r14
movl $0x68, %edi
callq 0x2150
movq %rax, %r15
movq %rax, %rdi
movq %rbx, %rsi
xorl %edx, %edx
xorl %ecx, %ecx
callq 0x36a0
movq (%r14), %rax
movq %r14, %rdi
callq *(%rax)
testb %al, %al
je 0x3253
xorps %xmm0, %xmm0
movups %xmm0, 0x58(%r15)
movq %r15, 0x8(%r14)
movq %r15, 0x10(%r14)
jmp 0x3361
movq (%r14), %rax
movq %r14, %rdi
callq *0x38(%rax)
movq (%r14), %rax
movq %r14, %rdi
callq *0x30(%rax)
testb %al, %al
jne 0x328c
movq (%r14), %rax
movq %r14, %rdi
callq *0x10(%rax)
movq %rbx, %rdi
movq %rax, %rsi
callq 0x297e
testb %al, %al
jne 0x328c
movq (%r14), %rax
movq %r14, %rdi
callq *0x50(%rax)
jmp 0x325c
movq (%r14), %rax
movq %r14, %rdi
callq *0x28(%rax)
testb %al, %al
je 0x32c0
movq (%r14), %rax
movq %r14, %rdi
callq *0x30(%rax)
testb %al, %al
je 0x32c0
movq (%r14), %rax
movq %r14, %rdi
callq *0x10(%rax)
movq %rbx, %rdi
movq %rax, %rsi
callq 0x297e
testb %al, %al
jne 0x32cd
jmp 0x3319
movq (%r14), %rax
movq %r14, %rdi
callq *0x28(%rax)
testb %al, %al
je 0x32f4
movq $0x0, 0x58(%r15)
movq 0x10(%r14), %rax
movq %rax, 0x60(%r15)
movq %r15, 0x58(%rax)
movq (%r14), %rax
movq %r14, %rdi
callq *0x48(%rax)
movq 0x10(%r14), %rax
movq %rax, 0x8(%r14)
jmp 0x3361
movq (%r14), %rax
movq %r14, %rdi
callq *0x30(%rax)
testb %al, %al
je 0x3338
movq (%r14), %rax
movq %r14, %rdi
callq *0x10(%rax)
movq %rax, %rdi
movq %rbx, %rsi
callq 0x297e
testb %al, %al
je 0x3338
movq $0x0, 0x60(%r15)
movq 0x10(%r14), %rax
movq %rax, 0x58(%r15)
movq %r15, 0x60(%rax)
movq (%r14), %rax
movq %r14, %rdi
callq *0x50(%rax)
jmp 0x3361
movq 0x10(%r14), %rax
movq 0x58(%rax), %rcx
movq %rcx, 0x58(%r15)
movq %rax, 0x60(%r15)
movq %r15, 0x58(%rax)
movq (%r14), %rax
movq %r14, %rdi
callq *0x48(%rax)
movq 0x10(%r14), %rax
movq 0x58(%rax), %rcx
movq %rax, 0x60(%rcx)
movq (%r14), %rax
movq %r14, %rdi
callq *(%rax)
testb %al, %al
jne 0x3390
movq (%r14), %rax
movq %r14, %rdi
callq *0x10(%rax)
movq %rax, %rdi
movq %rbx, %rsi
callq 0x28f8
testb %al, %al
je 0x3390
addq $0x8, %rsp
popq %rbx
popq %r14
popq %r15
popq %rbp
retq
leaq 0x52b6(%rip), %rdi      # 0x864d
leaq 0x4d3e(%rip), %rsi      # 0x80dc
leaq 0x52ce(%rip), %rcx      # 0x8673
movl $0x114, %edx            # imm = 0x114
callq 0x20e0
movq %rax, %rbx
movq %r15, %rdi
callq 0x2130
movq %rbx, %rdi
callq 0x2220