// File: /workspace/github_c_makefile_star2_O1/giannisdravilas[P]Disease-Monitor/tests/../modules/DiseaseMonitor.c
// Function: dm_destroy
void dm_destroy(){
    
    // Απελευθερώνουμε πρώτα τη μνήμη που καταλαμβάνει κάθε στοιχείο (Set) του Map
    for(MapNode node = map_first(map_diseases_dates); node != MAP_EOF; node = map_next(map_diseases_dates, node)){
        set_destroy(map_node_value(map_diseases_dates, node));
    }
    for(MapNode node = map_first(map_countries_dates); node != MAP_EOF; node = map_next(map_countries_dates, node)){
        set_destroy(map_node_value(map_countries_dates, node));
    }

    // Κι έπειτα διαγράφουμε τα Maps
    map_destroy(map_ids_records);
    map_destroy(map_diseases_dates);
    map_destroy(map_countries_dates);

    // Διαγράφουμε τα structs που περιέχει για keys το Map. Χρησιμοποιούμε μια μεταβλητή next γιατί η
    // map_next() δεν θα δουλέψει, αφού το τρέχουν κλειδί θα έχει διαγραφεί όταν αυτή κληθεί
    MapNode next;
    for(MapNode node = map_first(map_disease_country_date); node != MAP_EOF; node = next){
        next = map_next(map_disease_country_date, node);
        MapCount mapcount = map_node_key(map_disease_country_date, node);
        free(mapcount->disease);
        free(mapcount->country);
        free(mapcount->date);
        free(map_node_key(map_disease_country_date, node));
        free(map_node_value(map_disease_country_date, node));
    }

    // Έπειτα διαγράφουμε το ίδιο το Map
    map_destroy(map_disease_country_date);

    // Διαγράφουμε πρώτα τα values του Map
    for(MapNode node = map_first(map_NULL_diseases); node != MAP_EOF; node = map_next(map_NULL_diseases, node)){
        free(map_node_value(map_NULL_diseases, node));
    }

    // Κι έπειτα το ίδιο το Map
    map_destroy(map_NULL_diseases);
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
movq 0x99fb(%rip), %rdi      # 0xe738
callq 0x6c9f
testq %rax, %rax
je 0x4d78
movq %rax, %rbx
movq 0x99e7(%rip), %rdi      # 0xe738
movq %rbx, %rsi
callq 0x6f0b
movq %rax, %rdi
callq 0x82fd
movq 0x99d0(%rip), %rdi      # 0xe738
movq %rbx, %rsi
callq 0x6d5b
movq %rax, %rbx
testq %rax, %rax
jne 0x4d4a
movq 0x99c1(%rip), %rdi      # 0xe740
callq 0x6c9f
testq %rax, %rax
je 0x4dba
movq %rax, %rbx
movq 0x99ad(%rip), %rdi      # 0xe740
movq %rbx, %rsi
callq 0x6f0b
movq %rax, %rdi
callq 0x82fd
movq 0x9996(%rip), %rdi      # 0xe740
movq %rbx, %rsi
callq 0x6d5b
movq %rax, %rbx
testq %rax, %rax
jne 0x4d8c
movq 0x996f(%rip), %rdi      # 0xe730
callq 0x6b5c
movq 0x996b(%rip), %rdi      # 0xe738
callq 0x6b5c
movq 0x9967(%rip), %rdi      # 0xe740
callq 0x6b5c
movq 0x9963(%rip), %rdi      # 0xe748
callq 0x6c9f
testq %rax, %rax
je 0x4e66
movq %rax, %rbx
movq 0x994f(%rip), %rdi      # 0xe748
movq %rbx, %rsi
callq 0x6d5b
movq %rax, %r14
movq 0x993d(%rip), %rdi      # 0xe748
movq %rbx, %rsi
callq 0x6ef2
movq %rax, %r15
movq (%rax), %rdi
callq 0x22d0
movq 0x8(%r15), %rdi
callq 0x22d0
movq 0x10(%r15), %rdi
callq 0x22d0
movq 0x9911(%rip), %rdi      # 0xe748
movq %rbx, %rsi
callq 0x6ef2
movq %rax, %rdi
callq 0x22d0
movq 0x98fa(%rip), %rdi      # 0xe748
movq %rbx, %rsi
callq 0x6f0b
movq %rax, %rdi
callq 0x22d0
movq %r14, %rbx
testq %r14, %r14
jne 0x4df2
movq 0x98db(%rip), %rdi      # 0xe748
callq 0x6b5c
movq 0x98af(%rip), %rdi      # 0xe728
callq 0x6c9f
testq %rax, %rax
je 0x4eb4
movq %rax, %rbx
movq 0x989b(%rip), %rdi      # 0xe728
movq %rbx, %rsi
callq 0x6f0b
movq %rax, %rdi
callq 0x22d0
movq 0x9884(%rip), %rdi      # 0xe728
movq %rbx, %rsi
callq 0x6d5b
movq %rax, %rbx
testq %rax, %rax
jne 0x4e86
movq 0x986d(%rip), %rdi      # 0xe728
popq %rbx
popq %r14
popq %r15
jmp 0x6b5c