Skip to content

Commit e3c28c9

Browse files
committed
map, vector: improve handing of replaced elements
1 parent faea529 commit e3c28c9

File tree

3 files changed

+7
-3
lines changed

3 files changed

+7
-3
lines changed

include/ADTMap.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ Map map_create(CompareFunc compare, DestroyFunc destroy_key, DestroyFunc destroy
2727

2828
int map_size(Map map);
2929

30-
// Αν υπάρχει κλειδί ισοδύναμο με key, αλλάζει την τιμή του σε value. Διαφορετικά προσθέτει το κλειδί key με τιμή value.
30+
// Προσθέτει το κλειδί key με τιμή value. Αν υπάρχει κλειδί ισοδύναμο με key, τα παλιά key & value αντικαθίσταται από τα νέα.
3131
//
3232
// ΠΡΟΣΟΧΗ:
3333
// Όσο το key είναι μέλος του map, οποιαδήποτε μεταβολή στο περιεχόμενό του (στη μνήμη που δείχνει) έχει μη ορισμένη συμπεριφορά.

modules/UsingADTSet/ADTMap.c

+5-1
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,13 @@ void map_insert(Map map, Pointer key, Pointer value) {
6666

6767
MapNode node = set_find(map->set, &search_node);
6868
if(node != NULL) {
69-
if(map->destroy_value != NULL)
69+
if(key != node->key && map->destroy_key != NULL)
70+
map->destroy_key(node->key);
71+
72+
if(value != node->value && map->destroy_value != NULL)
7073
map->destroy_value(node->value);
7174

75+
node->key = key;
7276
node->value = value;
7377
return;
7478
}

modules/UsingDynamicArray/ADTVector.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ void vector_set_at(Vector vec, int pos, Pointer value) {
6464
assert(pos >= 0 && pos < vec->size); // LCOV_EXCL_LINE (αγνοούμε το branch από τα coverage reports, είναι δύσκολο να τεστάρουμε το false γιατί θα κρασάρει το test)
6565

6666
// Αν υπάρχει συνάρτηση destroy_value, την καλούμε για το στοιχείο που αντικαθίσταται
67-
if(vec->destroy_value != NULL)
67+
if(value != vec->array[pos] && vec->destroy_value != NULL)
6868
vec->destroy_value(vec->array[pos]);
6969

7070
vec->array[pos] = value;

0 commit comments

Comments
 (0)