// File: brashi[P]PetFera/src/animal/mapeador_animal.cpp
// Function: FiltroAnimal::FiltroAnimal()
FiltroAnimal::FiltroAnimal() {
     filtro['A'] = [](shared_ptr<Animal> animal) {
         shared_ptr<Ave> checar = dynamic_pointer_cast<Ave>(animal);
         return dynamic_pointer_cast<Animal>(checar);
     };

     filtro['F'] = [](shared_ptr<Animal> animal) {
         shared_ptr<Anfibio> checar = dynamic_pointer_cast<Anfibio>(animal);
         return dynamic_pointer_cast<Animal>(checar);
     };

     filtro['R'] = [](shared_ptr<Animal> animal) {
         shared_ptr<Reptil> checar = dynamic_pointer_cast<Reptil>(animal);
         return dynamic_pointer_cast<Animal>(checar);
     };

     filtro['M'] = [](shared_ptr<Animal> animal) {
         shared_ptr<Mamifero> checar = dynamic_pointer_cast<Mamifero>(animal);
         return dynamic_pointer_cast<Animal>(checar);
     };

     filtro['D'] = [](shared_ptr<Animal> animal) {
         shared_ptr<Domestico> checar = dynamic_pointer_cast<Domestico>(animal);
         return dynamic_pointer_cast<Animal>(checar);
     };

     filtro['E'] = [](shared_ptr<Animal> animal) {
         shared_ptr<Exotico> checar = dynamic_pointer_cast<Exotico>(animal);
         return dynamic_pointer_cast<Animal>(checar);
     };

     filtro['N'] = [](shared_ptr<Animal> animal) {
         shared_ptr<Nativo> checar = dynamic_pointer_cast<Nativo>(animal);
         return dynamic_pointer_cast<Animal>(checar);
     };

     filtro['X'] = [](shared_ptr<Animal> animal) {
         //Mamifero* checar = dynamic_cast<Mamifero*>(animal);
         return animal;
     };
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x80, %rsp
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rdi
movq %rdi, -0x40(%rbp)
movq %rdi, %rax
movq %rax, -0x48(%rbp)
callq 0x32940
movq -0x40(%rbp), %rdi
movb $0x41, -0xa(%rbp)
leaq -0xa(%rbp), %rsi
callq 0x32960
movq %rax, -0x38(%rbp)
jmp 0x2c51a
movq -0x38(%rbp), %rdi
leaq -0x9(%rbp), %rsi
callq 0x2c650
movq -0x48(%rbp), %rdi
movb $0x46, -0x1e(%rbp)
leaq -0x1e(%rbp), %rsi
callq 0x32960
movq %rax, -0x50(%rbp)
jmp 0x2c53e
movq -0x50(%rbp), %rdi
leaq -0x1d(%rbp), %rsi
callq 0x2c6a0
movq -0x48(%rbp), %rdi
movb $0x52, -0x20(%rbp)
leaq -0x20(%rbp), %rsi
callq 0x32960
movq %rax, -0x58(%rbp)
jmp 0x2c562
movq -0x58(%rbp), %rdi
leaq -0x1f(%rbp), %rsi
callq 0x2c6f0
movq -0x48(%rbp), %rdi
movb $0x4d, -0x22(%rbp)
leaq -0x22(%rbp), %rsi
callq 0x32960
movq %rax, -0x60(%rbp)
jmp 0x2c586
movq -0x60(%rbp), %rdi
leaq -0x21(%rbp), %rsi
callq 0x2c740
movq -0x48(%rbp), %rdi
movb $0x44, -0x24(%rbp)
leaq -0x24(%rbp), %rsi
callq 0x32960
movq %rax, -0x68(%rbp)
jmp 0x2c5aa
movq -0x68(%rbp), %rdi
leaq -0x23(%rbp), %rsi
callq 0x2c790
movq -0x48(%rbp), %rdi
movb $0x45, -0x26(%rbp)
leaq -0x26(%rbp), %rsi
callq 0x32960
movq %rax, -0x70(%rbp)
jmp 0x2c5ce
movq -0x70(%rbp), %rdi
leaq -0x25(%rbp), %rsi
callq 0x2c7e0
movq -0x48(%rbp), %rdi
movb $0x4e, -0x28(%rbp)
leaq -0x28(%rbp), %rsi
callq 0x32960
movq %rax, -0x78(%rbp)
jmp 0x2c5f2
movq -0x78(%rbp), %rdi
leaq -0x27(%rbp), %rsi
callq 0x2c830
movq -0x48(%rbp), %rdi
movb $0x58, -0x2a(%rbp)
leaq -0x2a(%rbp), %rsi
callq 0x32960
movq %rax, -0x80(%rbp)
jmp 0x2c616
movq -0x80(%rbp), %rdi
leaq -0x29(%rbp), %rsi
callq 0x2c880
addq $0x80, %rsp
popq %rbp
retq
movq -0x40(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x18(%rbp)
movl %eax, -0x1c(%rbp)
callq 0x22ab0
movq -0x18(%rbp), %rdi
callq 0x6590
nopw (%rax,%rax)