// File: DaCasBe[P]Gestion-de-asignaturas-mediante-listas-doblemente-enlazadas-ordenadas/listaDoblementeEnlazadaOrdenadaEstudiantes.cpp
// Function: ed::ListaDoblementeEnlazadaOrdenadaEstudiantes::remove()
void ed::ListaDoblementeEnlazadaOrdenadaEstudiantes::remove(){
	#ifndef NDEBUG
		//Se comprueba la precondicion
		assert(!isEmpty());
	#endif //NDEBUG

	int old=nItems();

	if(isFirstItem() && isLastItem()){ //Solo hay un elemento en la lista
		setHead(NULL);
		setCurrent(NULL);
	}

	else if(isFirstItem()){ //Hay que borrar el primer elemento de la lista
		setHead(getCurrent()->getNext());
		getHead()->setPrevious(NULL);
		getCurrent()->setNext(NULL);
		setCurrent(getHead());
	}

	else if(isLastItem()){ //Hay que borrar el ultimo elemento de la lista
		gotoPrevious();
		getCurrent()->getNext()->setPrevious(NULL);
		getCurrent()->setNext(NULL);
	}

	else{ //Hay que borrar cualquier otro elemento de la lista
		ed::NodoDoblementeEnlazadoEstudiante * cursor=getCurrent(); //Creamos un cursor auxiliar para facilitar el proceso de borrado

		cursor->getPrevious()->setNext(cursor->getNext());
		cursor->getNext()->setPrevious(cursor->getPrevious());
		setCurrent(cursor->getNext());

		delete cursor; //Destruimos el cursor auxiliar
	}

	#ifndef NDEBUG
		//Se comprueba la postcondicion
		assert(old==nItems()+1);
	#endif //NDEBUG
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rdi
movq %rdi, -0x20(%rbp)
movq (%rdi), %rax
callq *(%rax)
xorb $-0x1, %al
testb $0x1, %al
jne 0x4aa1
jmp 0x4aa3
jmp 0x4ac2
leaq 0x662f(%rip), %rdi      # 0xb0d9
leaq 0x6633(%rip), %rsi      # 0xb0e4
movl $0x11b, %edx            # imm = 0x11B
leaq 0x6c1a(%rip), %rcx      # 0xb6d7
callq 0x3140
movq -0x20(%rbp), %rdi
movq (%rdi), %rax
callq *0x8(%rax)
movq -0x20(%rbp), %rdi
movl %eax, -0xc(%rbp)
movq (%rdi), %rax
callq *0x28(%rax)
testb $0x1, %al
jne 0x4adf
jmp 0x4b0e
movq -0x20(%rbp), %rdi
movq (%rdi), %rax
callq *0x30(%rax)
testb $0x1, %al
jne 0x4aef
jmp 0x4b0e
movq -0x20(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x5250
movq -0x20(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x4df0
jmp 0x4c54
movq -0x20(%rbp), %rdi
movq (%rdi), %rax
callq *0x28(%rax)
testb $0x1, %al
jne 0x4b1e
jmp 0x4b7f
movq -0x20(%rbp), %rdi
callq 0x4db0
movq %rax, %rdi
callq 0x4d90
movq -0x20(%rbp), %rdi
movq %rax, %rsi
callq 0x5250
movq -0x20(%rbp), %rdi
callq 0x4d70
movq %rax, %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x5210
movq -0x20(%rbp), %rdi
callq 0x4db0
movq %rax, %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x5230
movq -0x20(%rbp), %rdi
callq 0x4d70
movq -0x20(%rbp), %rdi
movq %rax, %rsi
callq 0x4df0
jmp 0x4c52
movq -0x20(%rbp), %rdi
movq (%rdi), %rax
callq *0x30(%rax)
testb $0x1, %al
jne 0x4b8f
jmp 0x4bd0
movq -0x20(%rbp), %rdi
movq (%rdi), %rax
callq *0x48(%rax)
movq -0x20(%rbp), %rdi
callq 0x4db0
movq %rax, %rdi
callq 0x4d90
movq %rax, %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x5210
movq -0x20(%rbp), %rdi
callq 0x4db0
movq %rax, %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x5230
jmp 0x4c50
movq -0x20(%rbp), %rdi
callq 0x4db0
movq %rax, -0x18(%rbp)
movq -0x18(%rbp), %rdi
callq 0x4dd0
movq %rax, -0x38(%rbp)
movq -0x18(%rbp), %rdi
callq 0x4d90
movq -0x38(%rbp), %rdi
movq %rax, %rsi
callq 0x5230
movq -0x18(%rbp), %rdi
callq 0x4d90
movq %rax, -0x30(%rbp)
movq -0x18(%rbp), %rdi
callq 0x4dd0
movq -0x30(%rbp), %rdi
movq %rax, %rsi
callq 0x5210
movq -0x18(%rbp), %rdi
callq 0x4d90
movq -0x20(%rbp), %rdi
movq %rax, %rsi
callq 0x4df0
movq -0x18(%rbp), %rax
movq %rax, -0x28(%rbp)
cmpq $0x0, %rax
je 0x4c4e
movq -0x28(%rbp), %rdi
movq (%rdi), %rax
callq *0x8(%rax)
jmp 0x4c50
jmp 0x4c52
jmp 0x4c54
movq -0x20(%rbp), %rdi
movl -0xc(%rbp), %eax
movl %eax, -0x3c(%rbp)
movq (%rdi), %rax
callq *0x8(%rax)
movl %eax, %ecx
movl -0x3c(%rbp), %eax
addl $0x1, %ecx
cmpl %ecx, %eax
jne 0x4c72
jmp 0x4c91
leaq 0x6aa4(%rip), %rdi      # 0xb71d
leaq 0x6464(%rip), %rsi      # 0xb0e4
movl $0x13e, %edx            # imm = 0x13E
leaq 0x6a4b(%rip), %rcx      # 0xb6d7
callq 0x3140
addq $0x40, %rsp
popq %rbp
retq
nopw (%rax,%rax)