rendered paste bodyvoid *
MapPtr_set(MapPtr *self, void *key, void *data)
{
unsigned long index;
unsigned int tries;
MapPtr_node temp1;
MapPtr_node temp2;
void *replaced_data = NULL;
/* if key is in use, insert new data and return replaced data */
index = MapPtr_hash1(self, key);
if(self->table1[index].key == key) {
replaced_data = self->table1[index].data;
self->table1[index].data = data;
return replaced_data;
}
index = MapPtr_hash2(self, key);
if(self->table2[index].key == key) {
replaced_data = self->table2[index].data;
self->table2[index].data = data;
return replaced_data;
}
/* allocation normally happens here */
temp1.key = key;
temp1.data = data;
for(;;) {
tries = MAPPTR_TRIES_PER_TABLE;
while(tries--) {
index = MapPtr_hash1(self, temp1.key);
if(self->table1[index].key) {
temp2 = self->table1[index];
self->table1[index] = temp1;
} else {
self->table1[index] = temp1;
return NULL;
}
index = MapPtr_hash2(self, temp2.key);
if(self->table2[index].key) {
temp1 = self->table2[index];
self->table2[index] = temp2;
} else {
self->table2[index] = temp2;
return NULL;
}
}
MapPtr_grow(self); /* might fail, but by this time, temp1 might be already in the table */
}
}