105 memcmp(elm->key.data, key.data, key.len) == 0) { |
105 memcmp(elm->key.data, key.data, key.len) == 0) { |
106 // overwrite existing element |
106 // overwrite existing element |
107 if (map->base.store_pointer) { |
107 if (map->base.store_pointer) { |
108 memcpy(elm->data, &value, sizeof(void *)); |
108 memcpy(elm->data, &value, sizeof(void *)); |
109 } else { |
109 } else { |
110 memcpy(elm->data, value, map->base.item_size); |
110 memcpy(elm->data, value, map->base.elem_size); |
111 } |
111 } |
112 } else { |
112 } else { |
113 // allocate new element |
113 // allocate new element |
114 struct cx_hash_map_element_s *e = cxMalloc( |
114 struct cx_hash_map_element_s *e = cxMalloc( |
115 allocator, |
115 allocator, |
116 sizeof(struct cx_hash_map_element_s) + map->base.item_size |
116 sizeof(struct cx_hash_map_element_s) + map->base.elem_size |
117 ); |
117 ); |
118 if (e == NULL) { |
118 if (e == NULL) { |
119 return -1; |
119 return -1; |
120 } |
120 } |
121 |
121 |
122 // write the value |
122 // write the value |
123 if (map->base.store_pointer) { |
123 if (map->base.store_pointer) { |
124 memcpy(e->data, &value, sizeof(void *)); |
124 memcpy(e->data, &value, sizeof(void *)); |
125 } else { |
125 } else { |
126 memcpy(e->data, value, map->base.item_size); |
126 memcpy(e->data, value, map->base.elem_size); |
127 } |
127 } |
128 |
128 |
129 // copy the key |
129 // copy the key |
130 void *kd = cxMalloc(allocator, key.len); |
130 void *kd = cxMalloc(allocator, key.len); |
131 if (kd == NULL) { |
131 if (kd == NULL) { |
340 case CX_MAP_ITERATOR_KEYS: |
340 case CX_MAP_ITERATOR_KEYS: |
341 iter.elem_size = sizeof(CxHashKey); |
341 iter.elem_size = sizeof(CxHashKey); |
342 iter.base.current = cx_hash_map_iter_current_key; |
342 iter.base.current = cx_hash_map_iter_current_key; |
343 break; |
343 break; |
344 case CX_MAP_ITERATOR_VALUES: |
344 case CX_MAP_ITERATOR_VALUES: |
345 iter.elem_size = map->base.item_size; |
345 iter.elem_size = map->base.elem_size; |
346 iter.base.current = cx_hash_map_iter_current_value; |
346 iter.base.current = cx_hash_map_iter_current_value; |
347 break; |
347 break; |
348 default: |
348 default: |
349 assert(false); |
349 assert(false); |
350 } |
350 } |
415 map->base.cl = &cx_hash_map_class; |
415 map->base.cl = &cx_hash_map_class; |
416 map->base.base.allocator = allocator; |
416 map->base.base.allocator = allocator; |
417 |
417 |
418 if (itemsize > 0) { |
418 if (itemsize > 0) { |
419 map->base.base.store_pointer = false; |
419 map->base.base.store_pointer = false; |
420 map->base.base.item_size = itemsize; |
420 map->base.base.elem_size = itemsize; |
421 } else { |
421 } else { |
422 map->base.base.store_pointer = true; |
422 map->base.base.store_pointer = true; |
423 map->base.base.item_size = sizeof(void *); |
423 map->base.base.elem_size = sizeof(void *); |
424 } |
424 } |
425 |
425 |
426 return (CxMap *) map; |
426 return (CxMap *) map; |
427 } |
427 } |
428 |
428 |