// File: /workspace/github_c_makefile_star2_O0/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 %rbp
movq %rsp, %rbp
subq $0x30, %rsp
movq 0x9a29(%rip), %rdi      # 0xf718
callq 0x844f
movq %rax, -0x8(%rbp)
cmpq $0x0, -0x8(%rbp)
je 0x5d2d
movq 0x9a12(%rip), %rdi      # 0xf718
movq -0x8(%rbp), %rsi
callq 0x86bb
movq %rax, %rdi
callq 0x9aad
movq 0x99fa(%rip), %rdi      # 0xf718
movq -0x8(%rbp), %rsi
callq 0x850b
movq %rax, -0x8(%rbp)
jmp 0x5cf8
movq 0x99ec(%rip), %rdi      # 0xf720
callq 0x844f
movq %rax, -0x10(%rbp)
cmpq $0x0, -0x10(%rbp)
je 0x5d72
movq 0x99d5(%rip), %rdi      # 0xf720
movq -0x10(%rbp), %rsi
callq 0x86bb
movq %rax, %rdi
callq 0x9aad
movq 0x99bd(%rip), %rdi      # 0xf720
movq -0x10(%rbp), %rsi
callq 0x850b
movq %rax, -0x10(%rbp)
jmp 0x5d3d
movq 0x9997(%rip), %rdi      # 0xf710
callq 0x830c
movq 0x9993(%rip), %rdi      # 0xf718
callq 0x830c
movq 0x998f(%rip), %rdi      # 0xf720
callq 0x830c
movq 0x998b(%rip), %rdi      # 0xf728
callq 0x844f
movq %rax, -0x20(%rbp)
cmpq $0x0, -0x20(%rbp)
je 0x5e3c
movq 0x9970(%rip), %rdi      # 0xf728
movq -0x20(%rbp), %rsi
callq 0x850b
movq %rax, -0x18(%rbp)
movq 0x995c(%rip), %rdi      # 0xf728
movq -0x20(%rbp), %rsi
callq 0x86a2
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rax
movq (%rax), %rdi
callq 0x22a0
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x22a0
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rdi
callq 0x22a0
movq 0x9922(%rip), %rdi      # 0xf728
movq -0x20(%rbp), %rsi
callq 0x86a2
movq %rax, %rdi
callq 0x22a0
movq 0x990a(%rip), %rdi      # 0xf728
movq -0x20(%rbp), %rsi
callq 0x86bb
movq %rax, %rdi
callq 0x22a0
movq -0x18(%rbp), %rax
movq %rax, -0x20(%rbp)
jmp 0x5da6
movq 0x98e5(%rip), %rdi      # 0xf728
callq 0x830c
movq 0x98b9(%rip), %rdi      # 0xf708
callq 0x844f
movq %rax, -0x30(%rbp)
cmpq $0x0, -0x30(%rbp)
je 0x5e8d
movq 0x98a2(%rip), %rdi      # 0xf708
movq -0x30(%rbp), %rsi
callq 0x86bb
movq %rax, %rdi
callq 0x22a0
movq 0x988a(%rip), %rdi      # 0xf708
movq -0x30(%rbp), %rsi
callq 0x850b
movq %rax, -0x30(%rbp)
jmp 0x5e58
movq 0x9874(%rip), %rdi      # 0xf708
callq 0x830c
addq $0x30, %rsp
popq %rbp
retq
nop