// File: /workspace/github_c_makefile_star2_O3/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 0x9b2f(%rip), %rdi      # 0xe738
callq 0x6b4f
testq %rax, %rax
je 0x4c44
movq %rax, %rbx
movq 0x9b1b(%rip), %rdi      # 0xe738
movq %rbx, %rsi
callq 0x6dbb
movq %rax, %rdi
callq 0x81ad
movq 0x9b04(%rip), %rdi      # 0xe738
movq %rbx, %rsi
callq 0x6c0b
movq %rax, %rbx
testq %rax, %rax
jne 0x4c16
movq 0x9af5(%rip), %rdi      # 0xe740
callq 0x6b4f
testq %rax, %rax
je 0x4c86
movq %rax, %rbx
movq 0x9ae1(%rip), %rdi      # 0xe740
movq %rbx, %rsi
callq 0x6dbb
movq %rax, %rdi
callq 0x81ad
movq 0x9aca(%rip), %rdi      # 0xe740
movq %rbx, %rsi
callq 0x6c0b
movq %rax, %rbx
testq %rax, %rax
jne 0x4c58
movq 0x9aa3(%rip), %rdi      # 0xe730
callq 0x6a0c
movq 0x9a9f(%rip), %rdi      # 0xe738
callq 0x6a0c
movq 0x9a9b(%rip), %rdi      # 0xe740
callq 0x6a0c
movq 0x9a97(%rip), %rdi      # 0xe748
callq 0x6b4f
testq %rax, %rax
je 0x4d32
movq %rax, %rbx
movq 0x9a83(%rip), %rdi      # 0xe748
movq %rbx, %rsi
callq 0x6c0b
movq %rax, %r14
movq 0x9a71(%rip), %rdi      # 0xe748
movq %rbx, %rsi
callq 0x6da2
movq %rax, %r15
movq (%rax), %rdi
callq 0x22d0
movq 0x8(%r15), %rdi
callq 0x22d0
movq 0x10(%r15), %rdi
callq 0x22d0
movq 0x9a45(%rip), %rdi      # 0xe748
movq %rbx, %rsi
callq 0x6da2
movq %rax, %rdi
callq 0x22d0
movq 0x9a2e(%rip), %rdi      # 0xe748
movq %rbx, %rsi
callq 0x6dbb
movq %rax, %rdi
callq 0x22d0
movq %r14, %rbx
testq %r14, %r14
jne 0x4cbe
movq 0x9a0f(%rip), %rdi      # 0xe748
callq 0x6a0c
movq 0x99e3(%rip), %rdi      # 0xe728
callq 0x6b4f
testq %rax, %rax
je 0x4d80
movq %rax, %rbx
movq 0x99cf(%rip), %rdi      # 0xe728
movq %rbx, %rsi
callq 0x6dbb
movq %rax, %rdi
callq 0x22d0
movq 0x99b8(%rip), %rdi      # 0xe728
movq %rbx, %rsi
callq 0x6c0b
movq %rax, %rbx
testq %rax, %rax
jne 0x4d52
movq 0x99a1(%rip), %rdi      # 0xe728
popq %rbx
popq %r14
popq %r15
jmp 0x6a0c