// File: /workspace/github_cpp_makefile_star2_O2/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 %r12
pushq %rbx
movq %rsi, %rbx
movq %rdi, %r14
pushq $0x68
popq %rdi
callq 0x2170
movq %rax, %r15
movq %rax, %rdi
movq %rbx, %rsi
xorl %edx, %edx
xorl %ecx, %ecx
callq 0x337c
movq (%r14), %rax
movq %r14, %rdi
callq *(%rax)
testb %al, %al
je 0x2f3a
xorps %xmm0, %xmm0
movups %xmm0, 0x58(%r15)
movq %r15, 0x8(%r14)
movq %r15, 0x10(%r14)
jmp 0x3041
pushq $0x38
popq %rcx
pushq $0x50
popq %r12
movq (%r14), %rax
movq %r14, %rdi
callq *(%rax,%rcx)
movq (%r14), %rax
movq %r14, %rdi
callq *0x30(%rax)
testb %al, %al
jne 0x2f72
movq (%r14), %rax
movq %r14, %rdi
callq *0x10(%rax)
movq %rbx, %rdi
movq %rax, %rsi
callq 0x27d0
movq %r12, %rcx
testb %al, %al
je 0x2f41
movq (%r14), %rax
movq %r14, %rdi
callq *0x28(%rax)
testb %al, %al
je 0x2fa6
movq (%r14), %rax
movq %r14, %rdi
callq *0x30(%rax)
testb %al, %al
je 0x2fa6
movq (%r14), %rax
movq %r14, %rdi
callq *0x10(%rax)
movq %rbx, %rdi
movq %rax, %rsi
callq 0x27d0
testb %al, %al
jne 0x2fb3
jmp 0x2ffc
movq (%r14), %rax
movq %r14, %rdi
callq *0x28(%rax)
testb %al, %al
je 0x2fd7
andq $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 0x3041
movq (%r14), %rax
movq %r14, %rdi
callq *0x30(%rax)
testb %al, %al
je 0x3018
movq (%r14), %rax
movq %r14, %rdi
callq *0x10(%rax)
movq %rax, %rdi
movq %rbx, %rsi
callq 0x27d0
testb %al, %al
je 0x3018
andq $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 0x3041
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 0x306e
movq (%r14), %rax
movq %r14, %rdi
callq *0x10(%rax)
movq %rax, %rdi
movq %rbx, %rsi
callq 0x276a
testb %al, %al
je 0x306e
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq
leaq 0x35d8(%rip), %rdi      # 0x664d
leaq 0x3060(%rip), %rsi      # 0x60dc
leaq 0x35f0(%rip), %rcx      # 0x6673
movl $0x114, %edx            # imm = 0x114
callq 0x2110
movq %rax, %rbx
movq %r15, %rdi
callq 0x2150
movq %rbx, %rdi
callq 0x2230