103 |
103 |
104 if (elm != NULL && elm->key.hash == hash && elm->key.len == key.len && |
104 if (elm != NULL && elm->key.hash == hash && elm->key.len == key.len && |
105 memcmp(elm->key.data, key.data, key.len) == 0) { |
105 memcmp(elm->key.data, key.data, key.len) == 0) { |
106 // overwrite existing element, but call destructors first |
106 // overwrite existing element, but call destructors first |
107 cx_invoke_destructor(map, elm->data); |
107 cx_invoke_destructor(map, elm->data); |
108 if (map->collection.store_pointer) { |
108 if (value == NULL) { |
|
109 memset(elm->data, 0, map->collection.elem_size); |
|
110 } else if (map->collection.store_pointer) { |
109 memcpy(elm->data, &value, sizeof(void *)); |
111 memcpy(elm->data, &value, sizeof(void *)); |
110 } else { |
112 } else { |
111 memcpy(elm->data, value, map->collection.elem_size); |
113 memcpy(elm->data, value, map->collection.elem_size); |
112 } |
114 } |
113 } else { |
115 } else { |
114 // allocate new element |
116 // allocate new element |
115 struct cx_hash_map_element_s *e = cxMalloc( |
117 struct cx_hash_map_element_s *e = cxMalloc( |
116 allocator, |
118 allocator, |
117 sizeof(struct cx_hash_map_element_s) + map->collection.elem_size |
119 sizeof(struct cx_hash_map_element_s) + map->collection.elem_size |
118 ); |
120 ); |
119 if (e == NULL) return -1; |
121 if (e == NULL) return NULL; |
120 |
122 |
121 // write the value |
123 // write the value |
122 if (map->collection.store_pointer) { |
124 if (value == NULL) { |
|
125 memset(e->data, 0, map->collection.elem_size); |
|
126 } else if (map->collection.store_pointer) { |
123 memcpy(e->data, &value, sizeof(void *)); |
127 memcpy(e->data, &value, sizeof(void *)); |
124 } else { |
128 } else { |
125 memcpy(e->data, value, map->collection.elem_size); |
129 memcpy(e->data, value, map->collection.elem_size); |
126 } |
130 } |
127 |
131 |
128 // copy the key |
132 // copy the key |
129 void *kd = cxMalloc(allocator, key.len); |
133 void *kd = cxMalloc(allocator, key.len); |
130 if (kd == NULL) return -1; |
134 if (kd == NULL) { |
|
135 cxFree(allocator, e); |
|
136 return NULL; |
|
137 } |
131 memcpy(kd, key.data, key.len); |
138 memcpy(kd, key.data, key.len); |
132 e->key.data = kd; |
139 e->key.data = kd; |
133 e->key.len = key.len; |
140 e->key.len = key.len; |
134 e->key.hash = hash; |
141 e->key.hash = hash; |
135 |
142 |