// File: /workspace/github_cpp_makefile_star2_O3/diegofilbal[P]YourJam/src/lista.cpp
// Function: Lista::insereFim(Musica)
bool Lista::insereFim(Musica musica){

    if(busca(musica) == nullptr){ // Verifica se a música já está inserida
        // A música não está cadastrada no sistema
        
        if(head == nullptr){ // Caso a lista esteja vazia

            head = new Node;
            head->musica = new Musica;

            // Copia informações da música para o head
            head->musica->setNome(musica.getNome());
            head->musica->setArtista(musica.getArtista());
            head->next = nullptr;

            tail = head; // Atualiza o tail
            tamanho++; // Incrementa o tamanho da lista

        }else{ // Caso a lista não esteja vazia

            Node *temp = new Node;
            temp->musica = new Musica;

            // Copia informações da música para temp
            temp->musica->setNome(musica.getNome());
            temp->musica->setArtista(musica.getArtista());
            temp->next = nullptr;

            // Atualiza o tail
            tail->next = temp;
            tail = temp;

            tamanho++; // Incrementa o tamanho da lista
        }

        return true; // Retorna código de sucesso

    }else{
        // Música já está inserida no banco de músicas
        return false; // Retorna código de erro
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0xc8, %rsp
movq %rsi, %r15
movq %rdi, %rbx
leaq -0x98(%rbp), %r14
movq %r14, -0x10(%r14)
movq (%rsi), %rsi
movq 0x8(%r15), %rdx
addq %rsi, %rdx
leaq -0xa8(%rbp), %rdi
callq 0x38ac
leaq -0x88(%rbp), %rdi
leaq -0x78(%rbp), %rax
movq %rax, -0x10(%rax)
movq 0x20(%r15), %rsi
movq 0x28(%r15), %rdx
addq %rsi, %rdx
callq 0x38ac
leaq -0xa8(%rbp), %rsi
movq %rbx, %rdi
callq 0x2816
movq %rax, %r14
leaq -0xa8(%rbp), %rdi
callq 0x1063e
testq %r14, %r14
jne 0x2b71
movq (%rbx), %r13
movl $0x10, %edi
callq 0x2110
movq %rax, %r12
testq %r13, %r13
je 0x2acf
movq %r12, %rdi
callq 0x106e8
movl $0x40, %edi
callq 0x2110
movq %rax, %r13
movq %rax, %rdi
callq 0x10618
movq %r13, (%r12)
leaq -0x68(%rbp), %rdi
movq %r15, %rsi
callq 0x10674
movq %r13, %rdi
leaq -0x68(%rbp), %rsi
callq 0x106a0
leaq -0x58(%rbp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x2a87
callq 0x20f0
movq (%r12), %r13
leaq -0x48(%rbp), %rdi
movq %r15, %rsi
callq 0x106aa
movq %r13, %rdi
leaq -0x48(%rbp), %rsi
callq 0x106d8
leaq -0x38(%rbp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x2ab5
callq 0x20f0
movq $0x0, 0x8(%r12)
movq 0x8(%rbx), %rax
movq %r12, 0x8(%rax)
movq %r12, 0x8(%rbx)
jmp 0x2b6e
movq %r12, %rdi
callq 0x106e8
movq %r12, (%rbx)
movl $0x40, %edi
callq 0x2110
movq %rax, %r12
movq %rax, %rdi
callq 0x10618
movq (%rbx), %rax
movq %r12, (%rax)
leaq -0xe8(%rbp), %r13
movq %r13, %rdi
movq %r15, %rsi
callq 0x10674
movq %r12, %rdi
movq %r13, %rsi
callq 0x106a0
leaq -0xd8(%rbp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x2b27
callq 0x20f0
movq (%rbx), %rax
movq (%rax), %r12
leaq -0xc8(%rbp), %r13
movq %r13, %rdi
movq %r15, %rsi
callq 0x106aa
movq %r12, %rdi
movq %r13, %rsi
callq 0x106d8
leaq -0xb8(%rbp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x2b5f
callq 0x20f0
movq (%rbx), %rax
movq $0x0, 0x8(%rax)
movq %rax, 0x8(%rbx)
incl 0x10(%rbx)
testq %r14, %r14
sete %al
addq $0xc8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq %rax, %rbx
leaq -0xb8(%rbp), %rax
jmp 0x2bb5
movq %rax, %rbx
leaq -0xd8(%rbp), %rax
jmp 0x2bb5
jmp 0x2bc8
jmp 0x2bc8
movq %rax, %rbx
leaq -0x38(%rbp), %rax
jmp 0x2bb5
movq %rax, %rbx
leaq -0x58(%rbp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
jne 0x2bf0
jmp 0x2bf5
movq %rax, %rbx
movq %r13, %rdi
jmp 0x2bf0
movq %rax, %rbx
movq %r12, %rdi
jmp 0x2bf0
movq %rax, %rbx
leaq -0xa8(%rbp), %rdi
callq 0x1063e
jmp 0x2bf5
movq %rax, %rbx
movq -0xa8(%rbp), %rdi
cmpq %r14, %rdi
je 0x2bf5
callq 0x20f0
movq %rbx, %rdi
callq 0x21a0
nop