src/hash_map.c

changeset 855
35bcb3216c0d
parent 854
fe0d69d72bcd
child 856
6bbbf219251d
equal deleted inserted replaced
854:fe0d69d72bcd 855:35bcb3216c0d
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

mercurial