// File: /workspace/github_c_makefile_star2_O2/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 0x9da9(%rip), %rdi      # 0xe718
callq 0x6767
movq %rax, %rbx
testq %rax, %rax
je 0x49a4
movq 0x9d95(%rip), %rdi      # 0xe718
movq %rbx, %rsi
callq 0x69d3
movq %rax, %rdi
callq 0x7dc5
movq 0x9d7e(%rip), %rdi      # 0xe718
movq %rbx, %rsi
callq 0x6823
jmp 0x4974
movq 0x9d75(%rip), %rdi      # 0xe720
callq 0x6767
movq %rax, %rbx
testq %rax, %rax
je 0x49e0
movq 0x9d61(%rip), %rdi      # 0xe720
movq %rbx, %rsi
callq 0x69d3
movq %rax, %rdi
callq 0x7dc5
movq 0x9d4a(%rip), %rdi      # 0xe720
movq %rbx, %rsi
callq 0x6823
jmp 0x49b0
movq 0x9d29(%rip), %rdi      # 0xe710
callq 0x6624
movq 0x9d25(%rip), %rdi      # 0xe718
callq 0x6624
movq 0x9d21(%rip), %rdi      # 0xe720
callq 0x6624
movq 0x9d1d(%rip), %rdi      # 0xe728
callq 0x6767
movq %rax, %rbx
movq 0x9d0e(%rip), %rdi      # 0xe728
testq %rbx, %rbx
je 0x4a89
movq %rbx, %rsi
callq 0x6823
movq %rax, %r14
movq 0x9cf7(%rip), %rdi      # 0xe728
movq %rbx, %rsi
callq 0x69ba
movq %rax, %r15
movq (%rax), %rdi
callq 0x22c0
movq 0x8(%r15), %rdi
callq 0x22c0
movq 0x10(%r15), %rdi
callq 0x22c0
movq 0x9ccb(%rip), %rdi      # 0xe728
movq %rbx, %rsi
callq 0x69ba
movq %rax, %rdi
callq 0x22c0
movq 0x9cb4(%rip), %rdi      # 0xe728
movq %rbx, %rsi
callq 0x69d3
movq %rax, %rdi
callq 0x22c0
movq %r14, %rbx
jmp 0x4a13
callq 0x6624
movq 0x9c73(%rip), %rdi      # 0xe708
callq 0x6767
movq %rax, %rbx
movq 0x9c64(%rip), %rdi      # 0xe708
testq %rax, %rax
je 0x4aca
movq %rbx, %rsi
callq 0x69d3
movq %rax, %rdi
callq 0x22c0
movq 0x9c48(%rip), %rdi      # 0xe708
movq %rbx, %rsi
callq 0x6823
jmp 0x4a9a
popq %rbx
popq %r14
popq %r15
jmp 0x6624